在兩個 IPsec 隧道之間路由流量
我在 DO 基礎設施上執行了一個後端,稱為站點Yvi ,它通過 IPsec 隧道連接到第三方站點Prov ,使用以下 libreswan 配置:
conn prov-client ... right=$YVI_IP rightsourceip=10.31.3.1 rightsubnet=10.31.3.0/28 left=$PROV_IP leftsubnet=10.70.0.36/28
Prov有一個伺服器正在執行
10.70.0.37
,我可以從Yvi與它進行互動。我的問題是我正在設置一個本地開發環境(另一個網路中的 Ubuntu 機器),每次我進行更改時,我都必須部署到Yvi,因為只有從那裡我才能訪問Prov中的 API 。我想通過將Local連接到Yvi並將該流量路由到Prov來避免這種情況,以便能夠從Local訪問****Prov中的 API並簡化開發。
我使用以下配置將Local連接到Yvi作為公路戰士:
conn remote-dev-client ... left=$YVI_IP leftsubnet=10.31.3.0/28 right=%any rightaddresspool=10.31.4.1-10.31.4.254
連接已成功建立,我可以從Local我到達Yvi。我想要的是從Local到達Prov。到網路的路由不會自動添加,所以我嘗試在Local上手動設置一些規則:
10.31.3.1``10.70.0.37``10.70.0.36/28``ip xfrm``ip route
# Outgoing ip xfrm policy add dst 10.70.0.37 src 10.31.4.1 dir out tmpl src $LOCAL_IP dst $YVI_IP proto esp spi $SPI reqid $REQID mode tunnel priority 100000 # Incoming ip xfrm policy add dst 10.31.4.1 src 10.70.0.37 dir fwd tmpl src $YVI_IP dst $LOCAL_IP proto esp reqid $REQID mode tunnel priority 100000 ip xfrm policy add dst 10.31.4.1 src 10.70.0.37 dir in tmpl src $YVI_IP dst $LOCAL_IP proto esp reqid $REQID mode tunnel priority 100000 ip route add table 220 src 10.31.4.1 10.70.0.37 via $LOCAL_IP dev $LOCAL_IF proto static
我現在
ip xfrm monitor
在Yvi上執行,然後從Local ping執行10.70.0.37
;我可以看到到達Yvi的數據包(來自****Yvi中的 xfrm 監視器),但只有傳出,而不是響應(例如,如果我 ping 10.31.3.1 可以看到),這表明Yvi正在接收流量但沒有路由它對省?我真的不知道如何解釋這個。我想我必須在Yvi中添加路由才能正確地將流量路由到Prov API,但是在上面添加類似的規則並沒有奏效。我很感激幫助我理解我所缺少的,以及我做錯了什麼。
也歡迎提出不同方法的建議,儘管連接到我無法控制的Prov的唯一方法是通過我控制的****Yvi的 IPsec 隧道。
我能夠使用 iptables NAT 規則解決它。這些
ip xfrm
政策是不必要的。對於像我這樣不是專家的人來說,這是對我所做的事情的一個小解釋:從Yvi我為公路勇士分配了一個
10.31.4.0/24
子網,因此該網路的路由由密鑰守護程序(在我的情況下為 libreswan)自動安裝,所以我在Yvi (中添加了 NAT 規則/etc/ufw/before.rules
,因為我使用的是 UFW,但你可以實現與iptables
直接相同):*nat -F :PREROUTING ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] # PRE -A PREROUTING -s 10.31.4.0/24 -d 10.31.3.2 -j DNAT --to-destination 10.70.0.37 # POST -A POSTROUTING -s 10.31.4.0/24 -d 10.70.0.37 -j SNAT --to-source 10.31.3.1 COMMIT
告訴 iptables將
*nat
規則應用於 NAT 表並COMMIT
實際保存規則。-F
只是為了方便起見,因為 UFW 添加了規則但ufw enable
不會刪除它們,ufw disable
因此您最終會出現重複項,因此是 flush flag-F
。該
PREROUTING
規則適用於從 Road Warriors 子網傳入的發往 的數據包10.31.3.2
,它所做的是將目標地址更改為10.70.0.37
而不是,從 Road Warriors 的角度來看10.31.3.2
,有效地將該 IP 地址分配給Prov伺服器。該
POSTROUTING
規則適用於從 Road Warriors 子網傳入即將發送到的數據包10.70.0.37
(因此,剛剛符合預路由規則的數據包),並將其目標地址從地址更改10.31.4.0/0
為10.31.3.1
. 這是必要的,因為我不控制 Prov 中的路由、伺服器或任何東西**,所以如果Prov**從子網收到請求10.30.4.0/24
,它不知道如何響應。但它確實知道10.31.3.1
。就是這樣!現在我可以通過Yvi從Local到達Prov。
10.31.3.2