在 strongswan 中,单个 IP 离开子网并通过隧道路由流量

在 strongswan 中,单个 IP 离开子网并通过隧道路由流量

我必须设置一个 ipsec 隧道才能使用另一家公司提供的外部服务(因此我无法控制另一端,也无法更改那里的任何内容)。假设:

  • 192.168.0.0/24 是我的本地子网
  • 150.150.150.151 是我的公共外部 IP
  • 160.160.160.161 是我必须连接的远程对等体

我准备了一个装有 Ubuntu Server 和 Strongswan 的虚拟机(假设为 192.180.0.100),然后从 /etc/ipsec.conf 设置左右 ip、加密和密钥 - IPsec 第 1 阶段开始。

现在,为了启动第 2 阶段,另一端仅接受某个地址/32 作为左子网(假设为 170.170.170.171/32)。如果我不这样做,隧道就不会启动。这一点得到了另一端设置隧道的人的证实。右子网是我需要到达的 IP 范围,同样是一个 IP(假设为 180.180.180.181/32)。

经过这样的设置后,连接就建立了,在 ipsec 状态下,它显示已安装并正在运行。现在,我从 /etc/networks 添加 170.170.170.171 作为辅助 ip,我可以 ping 和 nmap 180.180.180.181,所以它正常工作了。

现在,我不明白当我想要到达 180.180.180.181 时,如何将流量从 192.168.0.0/24 路由​​到隧道。我尝试使用路由器的静态路由,在请求 180.180.180.181 时强制流量到 192.168.0.100,但跟踪路由显示,到达 192.168.0.100 后,流量会返回主网关并按照常规路径到达互联网,而不是进入隧道。

所以基本上的问题是,在这种情况下我该如何通过隧道路由流量?

答案1

除了路由之外,您还需要 SNAT(伪装)来使用网关自己的 170.170.170.171 地址重写 LAN 主机的源 IP 地址 - 首先,因为这是唯一允许通过的地址;其次,因为其他公司的服务不会有返回您 LAN 子网的路由。

SNAT 是通过防火墙完成的 –-j SNAT在 iptables 或snat tonftables 中添加规则。例如:

# /etc/nftables.conf
table ip nat {
  chain postrouting {
    type nat hook postrouting priority srcnat;
    ip daddr 180.180.180.181 snat to 170.170.170.171
  }
}

相关内容