Vpn

OpenVPN 路由到伺服器後面的 LAN

  • January 22, 2017

我有一個使用 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 文件

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