使用OpenVPN实现局域网互联
在中介绍了如何使用 OpenVPN 搭建最基本的VPN服务, 可以实现单个客户端与服务端的网络互通, 但是客户端之间, 以及服务端和客户端所在的局域网还不能互联. 本文介绍如何在前文的基础上, 实现客户端之间, 以及服务端和客户端所在的局域网的互联.
注意 绝大部分的配置变更都需要重启 OpenVPN 服务, 会导致所有的客户端连接断开.
客户端互联
默认配置下, 多个客户端之间是不能相互联通的. 如果需要实现客户端互联, 需要修改服务端的配置文件, 如 /etc/openvpn/server/myvpn.conf . 在配置文件中, 找到 client-to-client 配置项. 如果配置项前有 # 或者 ; , 将其删除. 如果没有这个配置项, 在一个空行中添加上. 修改后, 配置项如下:
# Uncomment this directive to allow different # clients to be able to "see" each other. # By default, clients will only see the server. # To force clients to only see the server, you # will also need to appropriately firewall the # server's TUN/TAP interface. client-to-client
保存配置后, 需要重启 OpenVPN 服务. 当客户端重新连接到服务后, 应当就可以互通了. 比如有两个客户端, VIP地址分别为10.8.0.6和10.8.0.10:
# ping -c 5 10.8.0.10 PING 10.123.0.10 (10.8.0.10): 56 data bytes 64 bytes from 10.8.0.10: icmp_seq=0 ttl=64 time=14.443 ms 64 bytes from 10.8.0.10: icmp_seq=1 ttl=64 time=14.490 ms 64 bytes from 10.8.0.10: icmp_seq=2 ttl=64 time=14.519 ms 64 bytes from 10.8.0.10: icmp_seq=3 ttl=64 time=14.841 ms 64 bytes from 10.8.0.10: icmp_seq=4 ttl=64 time=14.371 ms --- 10.8.0.10 ping statistics --- 5 packets transmitted, 5 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 14.371/14.533/14.841/0.162 ms
注意 在客户端可能会在TUN设备上看到两个地址, 其中一个是客户端面的VIP, 另外一个是网关. 比如下例中
utun3: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500 inet 10.8.0.6 --> 10.8.0.5/32 utun3
10.8.0.6是VIP, 而10.8.0.5是网关. 在互联时, 需要使用VIP而不是网关地址.
开放服务端所在局域网
比如我们希望从外部访问公司办公局域网的资源时, 可以在办公网里搭建一个VPN服务器, 然后作为网关将整个局域网开放给VPN客户端.
比如办公局域网的IP地址段为192.168.0.0/24, 我们需要在服务端的配置文件中添加需要推送给客户端的路由信息. 比如在本例中, 将以下配置添加到 /etc/openvpn/server/myvpn.conf :
push "route 192.168.0.0 255.255.255.0"
当客户端连接到服务端时, 服务端会将这条路由信息推送给客户端. 客户端接收到这条路由信息后, 会在本地路由表中添加一条新的路由规则, 将目标地址为192.168.0.0/24网段的数据包, 通过VPN的TUN设备发送到VPN服务端.
配置修改完成后, 重启VPN Server
# systemctl restart openvpn-server@myvpn
最后, 需要注意的是, 如果VPN服务端所在的节点不是其所在局域网的网关, 那么需要在局域网的网关上添加路由转发规则, 将目标地址为VPN VIP网段的数据包, 转发到VPN服务端所在节点.
多个客户端所在的局域网联通
比如当有两个不同地点的办公室, 各自有一个办公局域网, 我们希望这两个局域能够通过一个单独的VPN服务器互联.
两个局域网的IP地址段不能重合, 比如分别是192.168.100.0/24和192.168.200.0/24, 在两个局域网分别挑一个节点作为VPN网关, 分别命名为office-gateway100和office-gateway200.
首先, 需要在这两个VPN网关上开启IP转发功能. 具体方法参考中VPN服务端IP转发的开启方法. 然后就可以开始修改服务端配置了.
-
在VPN Server的配置文件里添加客户端配置文件目录:
在 /ect/openvpn/server/myvpn.conf 文件里, 添加开启配置项 client-config-dir , 例如:
client-config-dir ccd
OpenVPN 会在工作目录下的子目录 ccd 里, 读取需要为单个客户端所做的处理.
-
配置局域网VPN网关转发:
在 _/etc/openvpn/server/ccd__ 目录下, 为两个局域网的VPN网关, 分别创建配置文件. 配置文件的文件名要和客户名相同.
-
创建文件 office-gateway100 , 并在文件里添加路由信息:
iroute 192.168.100.0 255.255.255.0
-
创建文件 office-gateway200 , 并在文件里添加路由信息:
iroute 192.168.200.0 255.255.255.0
OpenVPN 会将收到的数据根据这两个配置文件的路由信息, 转发到对应的客户端.
-
-
配置内核转发规则
回到VPN Server配置文件 myvpn.conf, 添加两个局域网的转发规则:
route 192.168.100.0 255.255.255.0 route 192.168.200.0 255.255.255.0
这两项配置生效后, VPN Server所在系统内核会添加相应的路由规则, 将目标地址为这两个子网的数据, 转发到VPN Server的TUN设备上.
-
配置客户端推送规则
在VPN Server配置文件 myvpn.conf 中, 添加如下两条推送规则:
push "route 192.169.100.0 255.255.255.0" push "route 192.168.200.0 255.255.255.0"
VPN Server会将这两条路由规则推送给客户端, 这样客户端向这两个局域网的地址发送的数据, 都会被转发到VPN Server上来.
配置修改完成后, 重启VPN Server
# systemctl restart openvpn-server@myvpn
最后, 如果局域网内的VPN网关并不是局域网的实际网关时, 需要在实际网关上配置路由转发, 将目标地址为对方局域网的数据包, 转发到VPN网关上.