携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
点对点两个站点互联
站点到站点的VPN网络
实验需求:现在需要不同局域网之间的服务器能够进行通信,并且是通过安全的加密通道实现,并在Linux中启用路由功能,通过安全隧道进行包的转发,从而实现两个网络的连接。
实验环境:两台Linux服务器,每一台Linux服务器上由两块网卡,其中一块网卡需要和互联网连接一起,这也就是WAN接口的作用。其次在每一台Linux服务器上启用路由功能来扮演路由器的功能。VPN的隧道IP就是10.200.0.0/24。内网IP就是172.16.11.0/24,172.16.12.0/24网端,LAN接口的IP是内网网关。最后就是每个网段都由一个客户端,最终实现不同网段之间的互通。
实验规划:
| VPN服务器 | WAN | TUN | LAN |
|---|---|---|---|
| VPN1 | 192.168.9.130 | 10.200.0.1 | 192.168.16.1(充当网关) |
| VPN2 | 192.168.9.132 | 10.200.0.2 | 192.168.17.1(充当网关) |
| client1(不可访问外网) | 无 | 无 | 192.168.16.10 |
| client2(不可访问外网) | 无 | 无 | 192.168.17.10 |
前面的节点创建,IP配置不在演示,(但是要注意一点:网络模式是host only的不需要设置网关,这个也是我一直的误区。)这里开始从将VPN1开启路由记录:
1、开启节点路由功能:
#临时启用
echo 1 > /proc/sys/net/ipv4/ip_forward
#永久启动
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
#检查是否启动
2、创建配置文件
dev tun
proto udp
local 192.168.9.130
lport 1194
remote 192.168.9.132
rport 1194
secret aa.key
ifconfig 10.200.0.1 10.200.0.2
user nobody
group nobody
persist-tun
persist-key
keepalive 10 60
ping-timer-rem
verb 3
daemon #OpenVPN在所有初始化完成之后,会变成一个后台运行的守护进程
log-append /tmp/openvpn.log #参数指定在记录在日志文件中的条目的来源
选项参数讲解:
- local host:功能:设置用于绑定OpenVPN服务的本地机器的名字或IP地址,如果指定了,那么OpenVPN服务仅绑定到这个地址上。如果没有指定,那么OpenVPN服务将会监听所有网卡。
- remote host:指定远程主机名称或IP地址,可指定多个--remote,实现冗余,如果使用DNS名字,可通过DNS的轮询功能,实现简单的负载均衡。
- port:设定本地和远程的机器TCP/UDP端口号,注意这里设置时客户端、服务端全部设置了
- lport:设定本地主机绑定的TCP/UDP端口,这个时更细致的端口设置,只设置本地主机的端口号
- rport:只设定远程主机的TCP/UDP端口
- persist-tun、persist-key:如果运行UP/DOWN脚本并通过SIGUSR1或者--ping-restart来重启OpenVPN时,不要关闭和重新打开TUN/TAP设备。persist-key和persist-tun相似,不重新读取key文件。
对端检测预处理:OpenVPN有两个通道:数据通道,控制通道,检测发生在控制通道中
- ping n:如果n秒内没有发送数据包,那么就在控制通道上ping远程的机器。
- ping-exit n:如果n秒之后没有从远程收到ping或者其它数据包,那么OpenVPN服务器将会退出。
- ping-restart n:与ping-exit相似,只不过是通过发SIGUSR1信息来重启OpenVPN服务器。
- ping-timer-rem:这个就是是否启用以上功能,前提是如果有远程地址,那么就运行ping-exit、ping-restart定时器。
- keepalive n m:类似于ping的功能,会在连接上来回发送类似于ping的信号,以便于发现某一端断掉,n是时间间隔,每个多少秒ping一次,m表示ping之后多少秒没有收到回应,则表示对方已经断开。
日志选项:
- log file:将输出日志信息写入到指定文件。
- logappend file:将输出日志信息追加到指定文件,追加文件尾部。
3、VPN1运行配置:
[root@vpn1 ~]# openvpn --config new1.conf
#查看输出日志,会显示连接失败的食醋胡,这是因为我们起用了一段OpenVPN服务,另一端没有启用,把另一端启用后就行了。
Thu Jun 16 21:18:41 2022 read UDP [ECONNREFUSED|ECONNREFUSED]: Connection refused (code=111)
Thu Jun 16 21:18:45 2022 read UDP [ECONNREFUSED]: Connection refused (code=111)
Thu Jun 16 21:18:49 2022 read UDP [ECONNREFUSED]: Connection refused (code=111)
4、VPN2运行配置:
#开启路由转发
#只需要改变以下选项
local 192.168.9.132
remote 192.168.9.130
ifconfig 10.200.0.2 10.200.0.1
5、client配置
可以借助命令:route -n分析
这是个重点:现在我使用公司总部里面的PC(client2)去ping分支办公室里面的VPN服务器上面的TUN(10.200.0.1)
如果VPN2、client2的网卡配置信息没有错误那应该是clinet2可以ping通VPN2的TUN,WAN,LAN
但是你会发现client2无法ping通VPN1的TUN,这时为什么呢?ping不同肯定就是要么去的包不通,要么回来的包不通。
那现在分析下过程:首先client2发包:src-192.168.17.10,des-10.200.0.1,client2找到网关将包转发至VPN2,
VPN2发现des-10.200.0.1肯定需要多次封装,先经过TUN(虚拟网卡)隧道加密封装(src-10.200.0.2,des=10.200.0.1),在经过物理网卡封装(src-192.168.9.132,des-192.168.9.130),这样通过直连就将数据包转发至VPN1了,然后VPN1在进行层层解封装、层层封装,最终需要回应数据包(src-10.200.0.1,des-192.168.17.10)。
这时就出现问题了,会发现VPN1中根本找不到去往192.168.17.10的路由,因此问题就出现在这里。
解决办法:在VPN1中添加一条去往192.168.17.10的路由:
#这是原路由条目
[root@vpn1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.9.2 0.0.0.0 UG 100 0 0 ens33
0.0.0.0 192.168.16.2 0.0.0.0 UG 101 0 0 ens37
10.200.0.2 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
192.168.9.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.16.0 0.0.0.0 255.255.255.0 U 101 0 0 ens37
#新添加一条路由条目
[root@vpn1 ~]# route add -net 192.168.17.0/24 gw 10.200.0.2 #思考:为啥网关指定10.200.0.1,为什么不可以指定192.168.9.2?
192.168.17.0 10.200.0.1 255.255.255.0 UG 0 0 0 tun0
以上配置后,就可以client2就可以ping通VPN1的TUN了
那以此类推,想要client1ping通VPN2的TUN,也是在VPN2添加一条路由规则即可:
[root@vpn2 ~]# route add -net 192.168.16.0/24 gw 10.200.0.1
6、经过以上配置之后,client1(192.168.16.10)就可以和client2(192.168.17.10)互通了。
7、扩展:以上添加路由是我们自己手动添加的,那可不可以在启动OpenVPN时就自动添加路由规则呢?
是可以的。我们在配置文件中添写即可:
#不用指定下一跳地址,OpenVPN会自动指定
route 192.168.16.0 255.255.255.0
route 192.168.17.0 255.255.255.0
192.168.17.0 10.200.0.2 255.255.255.0 UG 0 0 0 tun0
192.168.16.0 10.200.0.1 255.255.255.0 UG 0 0 0 tun0
通过日志分析自动添加路由的过程:
/sbin/ip route add 192.168.17.0/24 via 10.200.0.2
6、选型:route network/IP [netmask] [gateway] [metric]
功能:在建立连接之后添加路由项,可以指定多个路由项
在TUN/TAP设备关闭之前,将会以逆序的方式自动删除这些添加的路由项
netmask默认值:255.255.255.255
gateway默认值:route-gateway的值或者是ifconfig的第二个参数,这也就是我们使用route选项时,不需要指定gw,就有默认的gw。
metric默认值:route-metric的值或0
network和gateway还支持以下关键字:
- vpn_gateway:表示远程VPN节点地址
- net_gateway:表示预先存在的默认网关地址
- remote_host:如果OpenVPN是运行在客户端模式下,并且没有定义Server模式,表示remote地址
7、选项:route-delay [n] [w](路由延迟)
功能:指定在建立完成之后,添加路由之前的延迟时间
[n]:如果是0,表示在完成连接之后立即添加路由,如果省略选项,那么在启用TUN/TAP设备--UP脚本被执行之后且在降级权限之前添加路由
[w]:在Windows上,通过在添加路由之前等待w秒,默认值w=30
三个站点互联
注意点:
1、三个OpenVPN隧道是两两相连,那监听的端口就需要不一样,A---B:1194,A---C:1195