在两个 IPsec 隧道之间路由流量

在两个 IPsec 隧道之间路由流量

我在 DO 基础设施上运行一个后端,称之为站点伊维,连接到第三方网站普罗夫通过 IPsec 隧道,使用以下 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

普罗夫有一个服务器正在运行10.70.0.37,我可以从伊维

我的问题是,我正在设置一个本地开发环境(另一个网络中的 Ubuntu 盒子),每次我做出更改时,我都必须部署到伊维因为只有从那里我才能访问 API普罗夫。我想通过连接来避免这种情况当地的伊维并将该流量路由至普罗夫能够访问 API普罗夫当地的并简化开发。

我连接当地的伊维作为一名具有以下配置的公路战士:

conn remote-dev-client
  ...
  left=$YVI_IP
  leftsubnet=10.31.3.0/28
  right=%any
  rightaddresspool=10.31.4.1-10.31.4.254

连接已成功建立,并且当地的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继续伊维然后从当地的ping 10.70.0.37;我可以看到数据包到达伊维(来自 xfrm 监视器伊维),但只有传出,而不是响应(例如,如果我 ping 10.31.3.1,就会看到响应),这表明伊维正在接收流量但未将其路由到普罗夫?我真的不知道该如何解释这一点。

我认为我必须添加路线伊维将流量路由到普罗夫API 正确,但添加与上述规则类似的规则却不起作用。如果能帮助我理解我遗漏了什么以及我做错了什么,我将不胜感激。

我们也欢迎提出不同的方法建议,尽管连接到普罗夫我无法控制,是通过 IPsec 隧道从伊维,我确实可以控制。

答案1

我能够使用 iptables NAT 规则解决这个问题。ip xfrm策略不是必需的。对于像我这样不是专家的人来说,这是我所做的事情的一个小解释:

伊维我正在为 road warriors 分配一个10.31.4.0/24子网,因此密钥守护进程(在我的情况下是 libreswan)会自动安装该网络的路由,因此我在伊维/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

指示*natiptables 将规则应用到 NAT 表,而实际上COMMIT会保存规则。-F只是为了方便,因为 UFW 会在 上添加规则ufw enable,但不会 上删除它们ufw disable,所以最终会出现重复,因此需要使用 flush 标志-F

PREROUTING规则适用于从road warrior子网发往的数据包10.31.3.2,它的作用是将目标地址更改为,而不是10.70.0.3710.31.3.2有效地将该IP地址分配给普罗夫服务器,从公路战士的角度来看。

POSTROUTING规则适用于从 road warrior 子网传入的即将发出的数据包(即刚好符合预路由规则的数据包),并将其目标地址从中10.70.0.37的地址更改为。这是必要的,因为我无法控制 中的路由、服务器或任何东西10.31.4.0/010.31.3.1普罗夫, 因此,如果普罗夫收到来自子网的请求10.30.4.0/24,它不知道如何响应。但它知道10.31.3.1

就这样!现在我可以到达普罗夫当地的通过伊维10.31.3.2

相关内容