Wireguard ipv6环境下问题频出,下面对ipv6环境下的MTU问题做一个研究。
前言:
现实中ipv6网络墙很低,使用ipv6网络建立跨国Wireguard互联安全稳定,基本不会被墙。但是在实际操作中遇到了一些MTU设置的问题,下面总结如下。
在一个Wireguard ipv6跨国组网案例中,客户端(桌面或服务器)无法通过wg peer对端隧道内与其他主机完成TCP握手,怀疑是MTU过大。但使用手机客户端(如iOS)则运行流畅。
Wireguard 默认的MTU为1420,降低至1380后问题解决。
原理:
众所周知ipv6不支持分片(DF),必须设置合理的MTU。而Wireguard通过ipv6连接时,作为ipv6上面负载的udp包,也应该符合MTU的要求。但是如果在不使用Wireguard时能正常使用ipv6网络,说明ipv6网络的MTU值设置小于1420,而Wireguard客户端,特别是一些路由器上的客户端没有正确响应too big,仍然按照1420打包而被拒绝。
iOS之所以没有问题,因为iOS的MTU是最小值1280,苹果已经考虑到此类兼容问题。
通过在隧道内使用 ping -l 命令测试能允许通过的包大小,设置一个合适的Wireguard MTU,我这里是1380左右,略微损失一些效率。
隧道两端Peer MTU值不同怎么办?
现实中大多数人会把隧道两端的MTU值同步。但是经过实际测试,每一个Peer上的MTU,只负责由本Peer发出的包的大小。如果本方无法接受对端的较大回包,应该将对端MTU改小,本端不需要修改。