在 "使用OpenVPN搭建VPN服務" 中介紹瞭如何使用 _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轉發功能. 具體方法參考使用OpenVPN搭建VPN服務中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網關上.