今年春节在家里放了一个 armbian 盒子(Ubuntu),接入的移动宽带;在上海的电脑是 Windows ,接入的联通宽带。两台机器都安装了 ZeroTier 和 TailScale (以下简称 ZT 和 TS )。
春节结束返回上海以后发现 ZeroTier 和 TailScale 都能 ping 通 armbian ,但是 ssh 均无法连接。ping 延时都在 50ms 左右,说明都是直连。经过一番搜索,把目光投向了 MTU 。通过在 Windows 下执行ping x.x.x.x -l 1472 -f
指令( x.x.x.x 是组网工具分配的 IP ),并逐步缩小 ICMP 数据大小,发现 ZT 网络内的上限是 1166 ,TS 的上限是 1252 。算上 28 字节的 ICMP 头,即 ZT 的最大 MTU 为 1194 ,TS 的为 1280
执行netsh interface ipv4 show subinterfaces
查看各个网卡的 MTU ,发现电脑上 ZT 配置的 MTU 是惊人的 2800 ,TS 的为 1280 。修改 ZT 网卡的 MTU 为 1194 后能使用 ZT 网内的 IP 地址连上 ssh ,测试了一个网页服务也正常访问。但是 TS 这边,MTU 已经是正确的了,仍然无法 ssh 连接。
我不是科班背景也不熟悉网络这块的内容,请教一下专业的朋友:
我理解,当数据来到 ZeroTier 的网卡时,还要在 ZeroTier 网络内拆包然后借助真实的网卡发送出去,这种情况下 2800 的 MTU 似乎也并无不可。但是实际表现来看稍大的 MTU 网络就不能工作,为什么会有这样的表现?
TailScale 这边 MTU 已经是正确的了,但是仍然无法连通,希望大家能指点一下排查思路
题外:有没有什么推荐的书可以比较系统性地介绍一下类似的网络知识?不需要细致到能进行相应开发工作的程度,只需要能够在网络出现问题时能够定位大致方向和排查思路即可
提前谢谢各位~
1
YGBlvcAK 276 天前
因为 mtu 导致的 ssh 不通,这个很奇怪,我这边有 7 ,8 个节点,也是不同运营商,没调整过 mtu 完全没问题,期待大神解答
|
2
hanssx 276 天前 1
和科班关系应该不大,网络方面也只学过谢希仁的计算机网络第 5 版,但是不实践很难理解得深。
我是用的 wireguard ,mtu 当时也遇到了问题,最后设置的值是 1280 ,具体我忘了是什么原因,勉强回忆了一下可能的几个点: 1 、网卡本身有几个大包特性,看看是不是要关闭,比如现在大多数网卡都具有 LRO/GRO 功能,即网卡收包时将同一流的小包合并成大包 ( tcpdump 抓包可以看到>MTU 1500bytes 的数据包)交给内核协议栈。 2 、协议本身可能占的字节也要考虑,比如 ZeroTier 和 TailScale 应该是有协议字段的,当一个包到达 TailScale 网卡的时候,TailScale 封装完之后要满足真实网卡的 MTU 才行,所以 TailScale 的 MTU 肯定是要小于真实网卡 MTU 。 另外,你好像少计算了 IP Header 的 20 个字节,MTU 是 2 层的 payload ,实际也就是 3 层的全包内容。 |
3
hanssx 276 天前
思路大概就是先对齐 MTU ,然后慢慢降低吧,tcpdump 一下,比如我没看到你提及在对端配置的 MTU ,两端都要配置。
|
4
rulagiti 276 天前
没关注过这个,平常使用 wg 也没啥问题,mtu 有问题岂不是 wifi 和手机 5g 要配置不同的 mtu ?
|
5
bigfei 276 天前 via Android
zt 或者 ts 网络是 overlay 的网络,mtu 的事情是由底层协议处理的。
zt 2800 的 mtu 在转发大包的时候,应该可以自动 fragment 为底层协议的 mtu |