假设我有 3 个 wireguard 对等点:我的 PC、我有完全访问权限的 VPS 服务器和我没有完全访问权限的 VPN 服务器。我想要实现的是将所有来自 PC 的流量路由到 VPS,然后路由到 VPN 服务器。当然,VPS 服务器本身不应该通过 VPN 路由流量。
我已阅读本指南 - https://www.procustodibus.com/blog/2022/06/multi-hop-wireguard/#internet-gateway-as-a-spoke。按照所述进行了所有操作,但我无法配置对等 C,即我的情况中的 VPN 服务器。它不起作用。启用后,我无法访问互联网或 wireguard 的网络 (10.0.0.*)。
这是我在 VPS 服务器上的配置:
[Interface]
Address = 10.68.200.191/32,10.0.0.1/32
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820
PrivateKey = <KEY>
Table = 123
PreUp = ip rule add iif wg1 table 123 priority 456
PostDown = ip rule del iif wg1 table 123 priority 456
[Peer]
PublicKey = <KEY>
AllowedIPs = 10.0.0.2/32
[Peer]
PublicKey = <KEY>
AllowedIPs = 0.0.0.0/0
Endpoint = <VPN_ADDR>:51820
那么,有没有什么方法可以在不访问最后一个对等点的情况下实现我想要的目标?
VPN 服务器要求客户端具有特定的 IP 地址 (10.68.200.191)。其自身的 WireGuard 配置不会接受来自其他地址(例如 10.0.0.2)的流量,即使接受,服务器也不会有返回这些任意地址的路由。
因此,为了使其正常工作,您的 VPS 必须对发往该对等点的所有流量进行 NAT(
SNAT
或MASQUERADE
),即重写所有流量,使其看起来像是来自 VPS 自己的地址(10.68.200.191)。目前,您正在添加一个 iptables MASQUERADE 规则,该规则仅匹配通过的数据包
-o eth0
(如果 VPS本身是用于访问 Internet 的 VPN 服务器,您将使用该规则),但这不是您的情况下数据包的去向;相反,流量会通过相同的方式返回wg1
,因此这就是 MASQUERADE 规则需要匹配的内容。当客户端和 VPN 服务器都通过同一接口连接时,规则可能应该缩小到
-s 10.0.0.2/32
除了之外还匹配源 IP 地址,即-o wg1
。但由于对等体代表两个完全不同的网络,我建议使用两个单独的接口并在它们之间进行路由...此外,当接口有多个 IP 地址时,MASQUERADE 可能无法始终自动选择正确的 IP 地址。同样,最好的解决方法是使用两个单独的 WireGuard 接口来表示您与两个网络的连接 - 但如果您坚持使用单个接口,那么替换
MASQUERADE
为SNAT
可以让您用 指定所需的地址--to-source
。请参阅“man iptables-extensions”文档。(除此之外,这两个操作的作用完全相同;MASQUERADE 只是自动 SNAT。)