我在 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
直接相同):告诉 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