WireGuard VPN IPv6回包异常问题求助(IPv4正常)
WireGuard VPN IPv6回包异常问题求助(IPv4正常)
兄弟我太懂你这个糟心的问题了!之前帮朋友排查过几乎一模一样的IPv6路由坑,咱们先把问题根源掰明白:
你服务器的eno2接口被Debian自动配置了一条x:x:x:x::/64 dev eno2的本地路由,而你的本地网络和公网用的是同一个IPv6前缀——当你从本地网络通过VPS的WireGuard隧道发数据包到服务器的wg0接口时,服务器一看数据包的源IP属于那个本地/64前缀,直接就走eno2接口回包了,但你这边是通过WireGuard的NAT隧道发的,根本不认服务器从eno2发回来的IP,自然就出问题了。
至于IPv4为啥正常?因为IPv4做了NAT,服务器收到的数据包源IP是VPS的内网IPv4,不是你本地网络的IP,根本不会匹配eno2的本地IPv4路由,所以乖乖走WireGuard回包了。
给你几个靠谱的解决方案,按需选就行:
方案一:调整路由优先级,让WireGuard路由优先
- 先查一下当前的IPv6路由表,确认那条本地路由的优先级:
ip -6 route,一般eno2的自动路由优先级是100左右 - 给WireGuard的IPv6路由设置更高的优先级(比如50):
- 如果用wg-quick管理WireGuard,直接在配置文件里加一行
RouteMetric = 50 - 或者手动添加针对那个本地前缀的高优先级路由:
ip -6 route add x:x:x:x::/64 dev wg0 metric 50
这样服务器再收到源IP属于该前缀的数据包时,会优先走wg0回包。
- 如果用wg-quick管理WireGuard,直接在配置文件里加一行
方案二:用策略路由强制“进哪出哪”(最稳妥)
这个方法能彻底解决路由匹配的问题,不管源IP是什么,只要是从wg0进来的数据包,回包必走wg0:
- 给wg0进来的IPv6数据包打标记:
ip6tables -t mangle -A PREROUTING -i wg0 -j MARK --set-mark 0x1 - 创建一个专门的路由表:
echo "100 wgroute" >> /etc/iproute2/rt_tables - 给这个路由表添加WireGuard的默认路由:
ip -6 route add default dev wg0 table 100 - 添加策略规则,让打了标记的数据包用这个路由表:
要是想让配置重启后生效,把这些命令加到开机脚本里就行(比如/etc/rc.local)。ip -6 rule add fwmark 0x1 table 100
方案三:禁用eno2的自动IPv6路由(谨慎使用)
如果你的服务器不需要在本地IPv6网络里和其他设备通信,可以直接让Debian别自动加那条路由:
- 要是用netplan配置网络,在eno2的配置块里加:
ipv6: autoconf: false accept-ra: false - 要是用传统的/etc/network/interfaces,加:
注意:这么做会让服务器失去本地IPv6网络的自动配置,要是有本地IPv6通信需求,得手动添加必要的路由。iface eno2 inet6 static autoconf 0 accept_ra 0
备注:内容来源于stack exchange,提问作者libesesc0
相关产品推荐
相关产品推荐

