..

RouterOS 下基于 macvlan pppoe 拨号的 wireguard mtu 问题

最近发现 git clone github 上面稍微大一点的库的时候就会在下载到几百兆的时候报错断开。我一直以为是从 udp2raw 切换到 hysteria 才导致的线路不稳定。但是报错断开的同时观察 ping 数据,一直处于非常稳定的状态。最近这一次碰到的时候突然联想到了 mtu 。觉得可能和它有关系。就尝试调整了一下。

git clone 大致的报错如下:

remote: Enumerating objects: 222542, done.
remote: Counting objects: 100% (11400/11400), done.
remote: Compressing objects: 100% (466/466), done.
error: RPC failed; curl 92 HTTP/2 stream 5 was not closed cleanly: CANCEL (err 8)
error: 6407 bytes of body are still expected
fetch-pack: unexpected disconnect while reading sideband packet
fatal: early EOF
fatal: fetch-pack: invalid index-pack output

网络结构

flowchart TB subgraph routeros client_eth0[eth0 - mtu 1500] --- macvlan[macvlan - mtu 1500] --- pppoe[pppoe - mtu 1480] --- client_wg0[wg0 - mtu 1420] --- client_hysteria[hysteria] end subgraph remote[remote server] remote_eth0[eth0 - mtu 1500] --- remote_wg0[wg0 - mtu 1500] --- remote_hysteria[hysteria] end routeros <---> remote

之前用的是 udp2raw + udpspeeder,来包裹 wireguard 协议。udpspeeder 好像会重新对包进行组装。所以没有遇到网络问题。
但由于 routeros 中的 container 没有 iptables 的权限。没有办法运行 udp2raw,所以换成了 hysteria 对 wireguard 协议进行包裹。运行了一段时间之后感觉稳定性也还不错。延迟似乎还更低了一些。从 github 拉一些不太大的库也没有碰到问题。

这次怀疑 mtu 问题也只是猜测而已。尝试过设置两边的 wg0 接口 mtu 值为 1480, 1460, 1420, 1280 都没有解决问题。错误的设置甚至会导致 git clone 操作卡死不动,直到 timeout。

最后测试下来发现下面的设置是有效的:

  • 设置 macvlan mtu 为 1480
  • pppoe 拨号后会自动设置 mtu 为 1472 (1480-8)
  • 保持 routeros wg0 mtu 为默认的 1420
  • server 端 wg0 保持为 1500

其它

中间加入了一层 macvlan 是因为给 pppoe 做单线多拨。
很早之前也遇到过 mtu 导致的网络问题,但通常都是在访问 http 服务的时候出现的,而且大部分网站都会遇到访问问题。这次的情况好像只有 github 出现问题。并且只是在 git clone 的时候出现问题。通过浏览器访问、下载都是正常的。其实这次出现问题我也没有发现设置上明显的错误。最后虽然解决了,但也只是通过猜测解决的。暂时先记录一下。继续观察看看。


2024-03-29 更新:

最近又出现了 github 不能 clone 仓库的问题了。应该还是 mtu 导致的问题。最后找到了解决方案。通过下面的命令设置 server 的 pmtu

iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

并且设置:

  • 还原 routeros 中 macvlan mtu 为 1500
  • 设置 server 端 wg0 接口 mtu 为默认的 1420