OpenVPN 站點到站點路由問題
我正在使用用於連接兩個站點的 openVPN 設置進行鬥爭。這就是場景的樣子
辦公室 1(伺服器):
- 本地網路:192.168.178.0/24
- openvpn 伺服器公共 ip: 192.168.178.2 on br0
- openvpn 伺服器內部 ip: 192.168.0.1 on tun0
辦公室 2(客戶):
- 本地網路:192.168.177.0/24
- openvpn 客戶端公共 ip: 192.168.177.2 on p2p1
- openvpn 客戶端內部 ip: 192.168.0.6 on tun0
- openvpn內網:192.168.0.0/24
客戶端和伺服器都位於動態分配 IP 地址的 NAT 路由器後面。
基本上,任何一個辦公室中涉及的機器都應該“看到”對方。在兩個站點上設置隧道並正確配置路由表後,兩個網路上的正常主機可以 ping 這兩個網路上的所有內容。目前很好。
但是,端點只能看到彼此,而不能看到它們各自遠端網路上的任何主機。例如,如果做一個
ping 192.168.178.2
從 VPN 端點 192.168.177.2,它工作得很好,任何其他地址都不能工作;房東不會回复。
現在看看 tcpdump 的輸出,當我 ping 另一個地址時,例如 192.168.178.3。
11:11:28.104640 IP 192.168.0.6 > 192.168.178.3:ICMP 回應要求,id 2130,seq 1,長度 64
源 IP 似乎不太正確。它屬於 OpenVPN 的內部網路,我沒有收到 ICMP 回复。
當我明確指示 ping 使用正確的源 IP 時,事情開始起作用:
ping 192.168.178.3 -I 192.168.177.2
現在,tcpdump 的輸出也可以了:
11:20:08.266271 IP 192.168.177.2 > 192.168.178.3:ICMP echo 請求,id 7883,seq 17,長度 64 11:20:08.316037 IP 192.168.178.3 > 192.168.177.2:ICMP echo 回复 17, eq8, 7s8長度 64
查看客戶端路由表中的關鍵條目,很明顯源地址來自內部網路:
default via 192.168.177.1 dev p2p1 192.168.0.1 via 192.168.0.5 dev tun0 192.168.0.5 dev tun0 proto kernel scope link src 192.168.0.6 192.168.177.0/24 dev p2p1 proto kernel scope link src 192.168.177.2 192.168.178.0/24 via 192.168.0.5 dev tun0
是否有可能讓 OpenVPN 使用適當的src創建該條目?
這是我的 openVPN 配置文件。我將跳過 TLS 部分,因為隧道本身按預期工作。
辦公室 1 的伺服器:
local 192.168.178.2 server 192.168.0.0 255.255.255.0 proto tcp-server port 1194 dev tun mssfix user nobody group nogroup keepalive 20 120 ping-timer-rem persist-tun persist-key float comp-lzo push "comp-lzo" push "route 192.168.178.0 255.255.255.0" route 192.168.177.0 255.255.255.0 client-config-dir client-configs
有一個客戶端配置,如下所示:
iroute 192.168.177.0 255.255.255.0 push "route 192.168.178.0 255.255.255.0 vpn_gateway"
辦公室 2 的客戶:
client dev tun0 remote <server address> proto tcp-client port 1194 connect-retry 15 comp-lzo user nobody group nogroup persist-tun persist-key
我真的很茫然……非常感謝您的幫助。
您看到的行為是設計使然。預設情況下,網路上的主機將使用流量退出的介面的 IP 地址作為源 IP。
其中一個 LAN 上的客戶端電腦將使案例如 192.168.178.10 作為其源 IP,因為它不是多宿主的。然後網關會將數據包路由到您的 OpenVPN 盒子,它將毫無問題地通過隧道。
但是,如果您從 OpenVPN 盒子本身出發,它將使用 OpenVPN 介面的 IP 地址,因為這是數據包退出的地方。
這很好。它到達遠端站點。但隨後遠端站點想要將 ping 響應的數據包發送到 192.168.0.6。響應發送到網關,但是由於網關(我假設,因為您沒有在網路上發佈網關的路由表)沒有該網路的路由,所以它不知道如何繼續。
解決此問題的最簡單方法是將 192.168.0.0/24(您的 OpenVPN 網路)的路由添加到兩個網路的網關。
另一種選擇,如果您的作業系統支持它(您沒有指定執行 OpenVPN 的作業系統),則可以查看是否可以使用路由的“src”參數來覆蓋選擇 IP 地址的預設行為的出口介面。請參閱標題為如何在 openvpn 中設置自定義路由源的問題以獲取更多資訊。