欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

使用OpenVPN实现局域网互联

程序员文章站 2021-12-08 10:37:28
在 "使用OpenVPN搭建VPN服务" 中介绍了如何使用 _OpenVPN_ 搭建最基本的VPN服务, 可以实现单个客户端与服务端的网络互通, 但是客户端之间, 以及服务端和客户端所在的局域网还不能互联. 本文介绍如何在前文的基础上, 实现客户端之间, 以及服务端和客户端所在的局域网的互联. 注意 ......

在中介绍了如何使用 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转发的开启方法. 然后就可以开始修改服务端配置了.

  1. 在VPN Server的配置文件里添加客户端配置文件目录:

    /ect/openvpn/server/myvpn.conf 文件里, 添加开启配置项 client-config-dir , 例如:

     client-config-dir ccd

    OpenVPN 会在工作目录下的子目录 ccd 里, 读取需要为单个客户端所做的处理.

  2. 配置局域网VPN网关转发:

    在 _/etc/openvpn/server/ccd__ 目录下, 为两个局域网的VPN网关, 分别创建配置文件. 配置文件的文件名要和客户名相同.

    1. 创建文件 office-gateway100 , 并在文件里添加路由信息:

      iroute 192.168.100.0 255.255.255.0

    2. 创建文件 office-gateway200 , 并在文件里添加路由信息:

      iroute 192.168.200.0 255.255.255.0

    OpenVPN 会将收到的数据根据这两个配置文件的路由信息, 转发到对应的客户端.

  3. 配置内核转发规则

    回到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设备上.

  4. 配置客户端推送规则

    在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网关上.