WireGuard组网经验-高丢包降低MTU,不成功换端口,不持久iptables规则,用mtr测试
目录
WireGuard是一个很好的组网工具,可以用来构建私有内网,实现不暴露生产环境Mysql等数据库到公网。
本博客分享笔者的WireGuard组网经验。
用mtr测试
mtr是一个很好的测试工具,可以通过wsl在linux里安装运行。能够测量一段时间的延迟和丢包率。
简单的说,和win的tracert只测量网络路径上每一跳3次延迟和丢包率相比,mtr可以测量几个小时甚至几天,测很多次。
换端口
WireGuard的配置非常简单,配置文件写好[Interface]的PrivateKey、Address、ListenPort和[Peer]的PublicKey、AllowedIPs、Endpoint总共6个字段加上防火墙开放相关端口即可组网。
如果组网失败,运用各种网络工具调试意义不大,可以先直接尝试换个端口尝试,实在不行再运用抓包工具等调试排查。
降低MTU
我曾经遇到组网成功后丢包率高达10+%,延迟很高。
mtr测试发现直接测peer(对端)的丢包率很低(0-1%),组网后测内网ip的丢包率才高达10+%的。
这里需要了解路径最大MTU的概念,
简单的说,在互联网中,数据被分成许多很小的数据包传输,互联网在两个终端之间有很多路由器转发数据包到下一个路由器,直到能直接将数据包转发给目的终端。 每两个计算机之间能转发的最大数据包大小是最大MTU,从一个终端到另一个终端,所有参与数据包转发的计算机里,这些最大MTU中最小的一个是路径最大MTU。任何数据包超过这个大小,要么分成多份,要么丢包。 这通常导致丢包率增加。
如何测量路径最大MTU
可以在wsl里运行(win不能运行)
ping -M do -s <icmp载荷大小> <目的ip>
- 对于ipv4: icmp载荷大小+28为路径最大MTU
- 对于ipv6: icmp载荷大小+48为路径最大MTU
在WireGuarg的配置文件[Interface] 部分加上一行 MTU=路径最大MTU-60(ipv4 头(20 字节)+ UDP 头(8 字节)+ WireGuard 加密头(约 32 字节)) 实测可以有效降低丢包率。(如果内网不涉及ipv6的情况)
例如路径最大MTU为1420,那在WireGuarg的配置文件加上一行 MTU=1360。
不持久iptables规则
生产环境配置WireGuard时,如果没有持久化iptables规则,一旦怀疑设置错误,重启即可重置到设置前。
否则在可能在极端情况,由于ssh断开连接,直接难以进行任何操作。