Routing

OpenVPN 站點到站點路由問題

  • July 23, 2014

我正在使用用於連接兩個站點的 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 中設置自定義路由源的問題以獲取更多資訊。

引用自:https://serverfault.com/questions/614817