我有一个 Wireguard VPN 设置,基本上如下所示:
P1 ---- S ---- P2 --- Internet
IP地址:
P1 = 10.200.1.5
S = 10.200.1.1
P2 = 10.200.1.3
我通过allowedIps = 0.0.0.0/0
在 P1 的客户端配置中指定将 P1 的所有流量重定向到 S。
现在我希望 S 将流量路由到 P2。我在 S 上尝试了以下操作:
ip rule add from 10.200.1.5 lookup 200
ip route add default via 10.200.1.3 dev wg0 table 200
sysctl -w net.ipv4.ip_forward=1
但是,当我在 P2 上运行 tcpdump 时,我看不到任何流量进入。P1 也没有遇到任何互联网连接。
编辑:通过 S 测试自定义路由表
ip route get 8.8.8.8 from 10.200.1.5 iif wg0
给出以下响应
8.8.8.8 from 10.200.1.5 via 10.200.1.3 dev wg0 table 200
cache iif wg0
然而,这似乎很好
tcpdump -nn -i wg0
显示S
无法访问,如下所示
09:58:22.207251 IP 10.200.1.5.9134 > 8.8.8.8.53: 36555+ A? play.googleapis.com. (37)
09:58:22.207270 IP 10.200.1.1 > 10.200.1.5: ICMP host 8.8.8.8 unreachable, length 73
WireGuard 是第 3 层接口,因此这样的声明
via 10.200.1.3
无效,因为它将用于链路层协议(通常是 ARP)来解析此处不存在的第 2 层地址。所以
可以重写:
这有助于记住这部分不是选择数据包到 P1 或 P2 的部分:WireGuard 也有自己的内部路由:cryptokey -routing,这是通过
AllowedIPs
在每个对等点的配置中正确设置来完成的。有一个重要限制:与标准路由相反,AllowedIPs
不支持任何重叠地址。如果尝试这样做(例如在服务器 S 上AllowedIPs = 0.0.0.0/0
为 Peer P2 设置),这将自动擦除(该)其他对等点上的冲突地址(例如AllowedIPs = 10.200.1.5
从 Peer P1 擦除,因为0.0.0.0/0
与其他任何东西重叠)并且连接将受到影响( S 不会将任何内容加密路由到 P1:不再连接)。有两种方法可以解决这个问题:
使用两个不同的 WireGuard 接口
之前的限制是针对每个 WireGuard 接口的。使用第二个接口可以避免这种冲突,但会使路由更加复杂。现在在路由表200和/或主表中可能需要多个条目:一个用于左侧接口,一个(默认)用于右侧接口。
对冲突的范围进行一组减法
实际上可能有工具能够计算集合 0.0.0.0/0 和集合 10.200.1.5 之间的差异,但我不知道它们。还有一个名为
netmask
(主页:https ://github.com/tlby/netmask )的方便工具,它有助于将范围转换为最小的网络掩码集:这些是应该在服务器 S 上用于对等 P2 的值(用逗号分隔),
AllowedIPs
因此加密密钥路由将在那里路由任何东西,除了 10.0.0.0/8,其中只有 10.200.1.3 将在 P2 端定义,在 P1 一侧保留已定义的 10.200.1.5:不再有重叠。P1 发送到 Internet 的数据包现在应该继续到 P2 以进行进一步路由。