IPv6 WireGuard ULA路由问题:NAT环境下两台设备无法通过VPS WireGuard VPN互访
看起来你已经做了不少基础配置——开启了VPS的IPv6转发,清空了ip6tables规则,路由表也看似配置了对应网段的转发,但核心问题大概率出在WireGuard本身的AllowedIPs配置上,毕竟WireGuard的转发逻辑和普通IP路由不一样,它依赖AllowedIPs来决定哪些流量该发给哪个Peer,而不是单纯看系统路由表。
我帮你梳理下问题和解决步骤:
核心问题分析
从你的路由表来看,Alice和Bob都配置了到对方网段的路由(通过VPS的WireGuard地址),VPS也有到两个子网的路由,但WireGuard需要明确知道:
- 对于VPS来说,发往
fd0d:87fa:c3bc:5::/64的流量要交给Alice这个Peer,发往fd0d:87fa:c3bc:6::/64的流量要交给Bob这个Peer; - 对于Alice来说,发往Bob网段的流量要交给VPS这个Peer;
- 对于Bob来说,发往Alice网段的流量要交给VPS这个Peer;
如果AllowedIPs没配置对,即使系统路由表正确,WireGuard也不会转发这些流量。
具体检查与修复步骤
1. 检查并修改VPS的WireGuard配置
打开VPS上的/etc/wireguard/wg0.conf,找到Alice和Bob的Peer段:
- 确保Alice的Peer条目里
AllowedIPs明确包含她的子网:[Peer] PublicKey = <Alice的公钥> AllowedIPs = fd0d:87fa:c3bc:5::/64 - 确保Bob的Peer条目里
AllowedIPs明确包含他的子网:[Peer] PublicKey = <Bob的公钥> AllowedIPs = fd0d:87fa:c3bc:6::/64
这一步是让VPS知道,对应子网的流量要转发给对应的WireGuard Peer。
2. 检查并修改Alice的WireGuard配置
打开Alice上的/etc/wireguard/wg0.conf,找到VPS的Peer段,修改AllowedIPs包含Bob的子网:
[Peer] PublicKey = <VPS的公钥> AllowedIPs = fd0d:87fa:c3bc:1::/64, fd0d:87fa:c3bc:6::/64 # 或者如果你的整个ULA前缀是fd0d:87fa:c3bc::/48,直接写这个更省事: # AllowedIPs = fd0d:87fa:c3bc::/48
这样Alice才会把发往Bob网段的流量交给VPS。
3. 检查并修改Bob的WireGuard配置
同理,打开Bob上的/etc/wireguard/wg0.conf,修改VPS Peer的AllowedIPs包含Alice的子网:
[Peer] PublicKey = <VPS的公钥> AllowedIPs = fd0d:87fa:c3bc:1::/64, fd0d:87fa:c3bc:5::/64 # 或者用全局前缀:AllowedIPs = fd0d:87fa:c3bc::/48
4. 重启WireGuard服务并验证
在VPS、Alice、Bob上分别重启WireGuard:
wg-quick down wg0 && wg-quick up wg0
然后在VPS上用wg show wg0查看每个Peer的allowed ips是否正确配置。
最后再测试Alice和Bob的互ping,应该就能通了。
额外验证点(可选)
虽然你已经开启了wg0接口的IPv6转发,但最好确认VPS的全局IPv6转发是否开启:
sysctl net.ipv6.conf.all.forwarding
如果输出是net.ipv6.conf.all.forwarding = 0,执行以下命令开启并永久生效:
sysctl -w net.ipv6.conf.all.forwarding=1 echo "net.ipv6.conf.all.forwarding=1" >> /etc/sysctl.conf
备注:内容来源于stack exchange,提问作者liamdiprose

