OpenVPN 路由到伺服器後面的 LAN
我有一個使用 OpenVPN 配置的站點到站點 VPN。隧道似乎很好(我可以從一端ping到另一端),但我無法讓兩端的網路相互看到。
我的拓撲如下:
Net1 (192.168.13.0/24) | | | 192.168.13.35 ens160 ----------- OVPN Client ----------- tun0 10.13.10.2 | | 10.13.10.1 tun0 ----------- OVPN Server ----------- ens160 10.1.121.6 | | Net2 (10.1.121.0/26)
我可以從客戶端ping到伺服器:
srv# ping 10.13.10.2 PING 10.13.10.2 (10.13.10.2) 56(84) bytes of data. 64 bytes from 10.13.10.2: icmp_seq=1 ttl=64 time=5.46 ms 64 bytes from 10.13.10.2: icmp_seq=2 ttl=64 time=5.01 ms
我可以從客戶端到 Net1(當然,在添加適當的路由之後):
client#ping 10.1.121.8 PING 10.1.121.8 (10.1.121.8) 56(84) bytes of data. 64 bytes from 10.1.121.8: icmp_seq=1 ttl=63 time=48.0 ms
但是,我完全無法反其道而行之(從伺服器對客戶端網路-Net2- 執行 ping 操作)。我什至無法從伺服器訪問 Net2 上的客戶端 IP:
server#ping 192.168.13.35 PING 192.168.13.35 (192.168.13.35) 56(84) bytes of data. ^C --- 192.168.13.35 ping statistics --- 3 packets transmitted, 0 received, 100% packet loss, time 2014ms
我確實有適當的路線:
server# ip route default via 10.1.121.1 dev ens160 onlink 10.1.121.0/26 dev ens160 proto kernel scope link src 10.1.121.6 10.13.10.0/24 dev tun0 proto kernel scope link src 10.13.10.1 192.168.13.0/24 via 10.13.10.2 dev tun0 client# ip route default via 192.168.13.1 dev ens160 onlink 10.1.121.0/24 via 10.13.10.1 dev tun0 10.13.10.0/24 dev tun0 proto kernel scope link src 10.13.10.2 192.168.13.0/24 dev ens160 proto kernel scope link src 192.168.13.35
IPTables 沒有阻止任何東西(一切都設置為 ACCEPT):
client# iptables -L -vn Chain INPUT (policy ACCEPT 56 packets, 3839 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 40 packets, 4343 bytes) pkts bytes target prot opt in out source destination server# iptables -L -vn Chain INPUT (policy ACCEPT 736 packets, 75398 bytes) pkts bytes target prot opt in out source destination 2 168 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT 4 packets, 236 bytes) pkts bytes target prot opt in out source destination 1 84 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0 Chain OUTPUT (policy ACCEPT 449 packets, 43393 bytes) pkts bytes target prot opt in out source destination
如果我在隧道介面上執行 tcpdump,我會看到 ICMP 數據包離開客戶端,但看不到它們在伺服器上傳入:
server# ping 192.168.13.35 PING 192.168.13.35 (192.168.13.35) 56(84) bytes of data. 16:57:40.262004 IP 10.13.10.1 > 192.168.13.35: ICMP echo request, id 1562, seq 1, length 64 16:57:41.269165 IP 10.13.10.1 > 192.168.13.35: ICMP echo request, id 1562, seq 2, length 64 16:57:42.277154 IP 10.13.10.1 > 192.168.13.35: ICMP echo request, id 1562, seq 3, length 64 16:57:43.285163 IP 10.13.10.1 > 192.168.13.35: ICMP echo request, id 1562, seq 4, length 64 client# tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes
兩個端點都是 Ubuntu 16.04 Server LTS(x64,大部分預設安裝)。
我以為我對 Linux 網路有所了解,但是……看來我錯了 :) 。我不知道為什麼這不起作用,而且我已經沒有什麼可以嘗試的想法了。誰能指出我正確的方向?
謝謝!
您可能缺少
iroute
. 除了推送路線之外,您還需要iroute
在配置文件中。這是 OpenVPN 手冊頁的摘錄。–iroute網路
$$ netmask $$ 生成到特定客戶端的內部路由。如果省略網路遮罩參數,則預設為 255.255.255.255。該指令可用於將固定子網從伺服器路由到特定客戶端,無論客戶端從何處連接。請記住,您還必須將路由添加到系統路由表中(例如使用 –route 指令)。需要兩條路由的原因是 –route 指令將數據包從核心路由到 OpenVPN。一旦進入 OpenVPN,–iroute 指令就會路由到特定的客戶端。此選項必須在客戶端實例配置文件中使用 –client-config-dir 或使用 –client-connect 腳本動態生成。–iroute 指令還與 –push “route …” 有重要的互動作用。–iroute 本質上定義了一個由特定客戶端擁有的子網(我們稱之為客戶端 A)。如果您希望其他客戶端能夠訪問 A 的子網,您可以使用 –push “route …” 和 –client-to-client 來實現這一點。為了讓所有客戶端都能看到 A 的子網,OpenVPN 必須將此路由推送到除 A 之外的所有客戶端,因為子網已經由 A 擁有。OpenVPN 通過不將路由推送到客戶端來完成此操作路由。
您需要在各自的客戶端和伺服器中進行如下配置條目。
iroute 192.168.3.0 255.255.255.0
此外,如果您在多個客戶端后面有多個網路,您可能需要檢查 CCD。
客戶端配置目錄
該指令設置客戶端配置目錄,OpenVPN 伺服器將掃描每個傳入連接,搜尋特定於客戶端的配置文件(有關更多資訊,請參閱手冊頁)。此目錄中的文件可以即時更新,而無需重新啟動伺服器。請注意,此目錄中的更改只會對新連接生效,對現有連接無效。如果您希望特定於客戶端的配置文件更改對目前連接的客戶端(或已斷開連接,但伺服器未超時其實例對象的客戶端)立即生效,請使用管理終止客戶端實例對象介面(如下所述)。這將導致客戶端重新連接並使用新的 client-config-dir 文件