Vpn

在兩個 IPsec 隧道之間路由流量

  • December 7, 2020

我在 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 monitorYvi上執行,然後從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/010.31.3.1. 這是必要的,因為我不控制 Prov 中的路由、伺服器或任何東西**,所以如果Prov**從子網收到請求10.30.4.0/24,它不知道如何響應。但它確實知道10.31.3.1

就是這樣!現在我可以通過YviLocal到達Prov10.31.3.2

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