![使用 wireguard 进行 IP 透明隧道](https://linux22.com/image/754276/%E4%BD%BF%E7%94%A8%20wireguard%20%E8%BF%9B%E8%A1%8C%20IP%20%E9%80%8F%E6%98%8E%E9%9A%A7%E9%81%93.png)
假设我有节点 1 和节点 2,它们通过互联网连接。节点 1 上的应用服务器具有针对节点 2 的 IP 的 IP acl。
出于安全原因,我在节点之间打开了 Wireguard 隧道。我想保持应用程序的配置不变(因此“透明的”在问题标题中),但是我遇到了以下问题:
Node2 在与 node1 上的应用程序服务器通信时使用其 vpn 源地址,但其 ACL 中没有该 IP。
这是 VPN 设置中的常见问题,还是 Wireguard 的实现选择?有人知道一个优雅的解决方案吗?在网络级别进行额外配置就可以了。在这种情况下,在应用程序级别更改 ACL 不是一种选择
到目前为止,我尝试通过引入策略 source-nat 将 node1 的公共地址用作 vpn 地址,但是在 wireguard 的情况下,这会彻底失败,这会将远程隧道端点的静态路由添加到路由表中;导致以下结果:
- Node2 成功使用其现有 IP 与 node1 进行通信
- Node1 的应用服务器看到数据包进来并回复
- Node1 的 IP 堆栈通过 WAN 路由数据包,而不是通过 Wireguard 隧道。
答案1
如果您想使用“正常”主机 IP 来发送通过隧道的传出流量,那么对我来说,只需执行以下操作即可:
[Interface]
Address = 10.102.0.1/24
PostUp = iptables -t nat -A POSTROUTING -s 10.102.0.1/32 -o wg-p2p -j SNAT --to-source 1.2.3.4
PostDown = iptables -t nat -D POSTROUTING -s 10.102.0.1/32 -o wg-p2p -j SNAT --to-source 1.2.3.4
...
[Peer]
AllowedIPs = 10.102.0.0/24, 1.2.3.4/32
...
因此,基本上,你设置了一个简单的 wireguard 隧道,并且只使用 iptables magic,你就可以在最新的时刻将源地址(如果它是隧道源 ip)更改为你的“正常”IP 地址(POSTROUTING
)