我必须设置一个 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 to
nftables 中添加规则。例如:
# /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
}
}