OpenVPN 路由到伺服器後面的 LAN

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

但是,我完全無法採取相反的方式(從伺服器 ping 用戶端網路 -Net2- 上的某些內容)。我什至無法從伺服器獲取 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 不會封鎖任何內容(一切設定為接受):

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 網路有所了解,但是......看來我錯了:)。我不知道為什麼這不起作用,而且我已經沒有可以嘗試的想法了。誰能指出我正確的方向嗎?

謝謝你!

答案1

您可能會錯過iroute.除了推送路由之外,您還需要iroute設定檔。以下是 OpenVPN 手冊頁的摘錄。

--iroute 網路 [網路遮罩]

產生到特定客戶端的內部路由。網路遮罩參數(如果省略)預設為 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 所有。不會將路由推送到客戶端,從而實現此目的。

您將需要在各自的客戶端和伺服器中使用如下所示的設定條目。

路由 192.168.3.0 255.255.255.0

此外,如果多個客戶端背後有多個網絡,您可能需要檢查 CCD。

客戶端配置目錄

該指令設定一個客戶端設定目錄,OpenVPN 伺服器將在每個傳入連線上掃描該目錄,搜尋特定於客戶端的設定檔(有關更多信息,請參閱手冊頁)。該目錄中的檔案可以即時更新,無需重新啟動伺服器。請注意,此目錄中的變更僅對新連線生效,對現有連線無效。如果您希望特定於用戶端的設定檔變更在目前連線的用戶端(或已斷線但伺服器尚未使其實例物件逾時)上立即生效,請使用管理指令終止用戶端實例物件介面(如下所述) 。這將導致客戶端重新連接並使用新的 client-config-dir 文件

答案2

Fossil的答案正是我所需要的,我已經接受了。我只想為可能遇到相同問題的其他人添加一些資訊。因為這個問題之前已經在 serverfault 上提出過,但答案要么沒有提到 iroute (一個例子),或只有死連結(例如這個

所以...首先,我找到了 iroute 的一個很好的解釋(以及為什麼需要它)這裡。但由於我剛剛提到了連結失效的風險,我還將嘗試在下面提到最重要的想法。

看起來核心路由不足以讓流量通過 OpenVPN 隧道。如果您想要存取 OpenVPN 用戶端後面的 LAN,您還需要 OpenVPN 內部路由 (iroute)。這是透過在 server.conf 中使用 client-configuration-dir 語句並在該子目錄內的設定檔中加入 iroute 語句來新增的。

就我而言,我還需要:

#Inside server.conf
client-configuration-dir my-config-dir

#Inside my-config-dir/client1 (same name as the client!)
#Tell OpenVPN that 192.168.13.0/24 is reachable via client1
iroute 192.168.13.0 255.255.255.0

這也引發了一個有趣的問題 - 如果 OpenVPN 無法僅使用核心路由工作,乍一看似乎不可能在 ovpn 隧道之上運行路由協定。有人得到這樣的解決方案(ovpn+rip/ospf)嗎?

相關內容