|
本帖最后由 mantouboji 于 2023-7-11 00:59 编辑
最近几个月都在折腾wireguard ,从之前的小盒子,变成了RouterOS 7内置,一些经验总结下来,MTU参数的设置值得一提,写下来供参考:
首先要了解,wireguard协议增加的开销是16字节头加16字节尾,一共32字节。
如果你的wireguard两端都是IPv4地址连接,一个包(假设长度为 x B)到达对方的 wireguard 虚拟网卡之后:
1. 加上 wireguard 的 header 和 authentication tag,此时长度为 x + 32
2. 加上 udp header,此时长度为 x + 32 + 8
3. 加上 IPv4 header,此时长度为 x + 32 + 8 + 20
为了不丢包,应该有 x + 32 + 8 + 20 <= 1500(以太网的MTU),得到 x <= 1440,所以 wireguard 的 MTU 最大可设置为 1440
如果我们是直接在两台LAN连接的电脑上架设wireguard,考虑到以太网卡的MTU是1500, 这时候可以选择的wireguard MTU就是
- 1500 - 32 - 8 - 20 = 1440
复制代码
如果你中间使用了IPv6 协议连接两端,因为v6的地址长,协议开销变大,这时候在以太网和PPPoE下的最大MTU分别成了
- 1500 - 32 - 8 - 40 = 1420
- 1500 - 8 - 32 - 8 - 40 = 1412
复制代码 缺省情况下,Linux的wg-quick 脚本会按照使用了IPv6的最大包络,从系统中各个网卡的MTU找到一个最小的,减去80, 作为缺省MTU。这也就是Linux上常见到wireguard接口的MTU是1420的缘故。
实质上你用这个在纯v4网络上是有一点浪费的,但无所谓了,更保险。
这个时候还应该想到:你在本地是PPPoE连接,但是你的海外VPS人家可是LAN连接,所以会发生你这里1492-80=1412人家那里1500-80=1420的情况。好在这个-80是按照IPv6最大包罗万象来选的,对于IPv4线路而言还有足够的余量,不至于产生影响。但是为了安全起见,还是应该在两端的配置文件里都指定同一个MTU数值为好(这种情况下1412是一个合理的选择)。
因为wireguard 是走UDP协议的,会受到运营商QoS策略的限制,一段时间后断线或者限流,于是出现了一些把UDP伪装成TCP的办法。这些办法的配置各有不同,但重点是:它们都会添加额外的协议开销字节数,减少了wireguard的有效MTU,所以在使用了这些手段之后,必须要减少wireguard接口MTU配置。
对于最常用的两种伪装手段而言,udp2raw 是 44字节,phantun 是 12字节。于是,在普通PPPoE宽带上使用的wireguard接口MTU就应该是
- udp2raw : 1412 - 44 = 1368
- phantun: 1412 - 12 = 1400
复制代码
最后,更戏剧性的来了,笔者丧心病狂购买了所谓的"国际精品网",还是PPPoE拨号,然而MTU却大幅度缩水成了1442, 被电信内部的网络白白吃掉了50个字节(恐怖的是MTU小了,MRU还是1492)。那么可怜的wireguard MTU就变成了:
- UDP: 1442 - 32 - 8 - 40 = 1362
复制代码
所以,这时候你就需要按照自己的情况,选择合适的MTU,保证网络畅通了。
哥有段时间心血来潮,想着既然VPS和本地都已经有IPv6地址,那么顺序切换IPv4和IPv6地址来建立wireguard连接应该是一个有希望的方案。然而当时没有仔细考虑这个MTU设置,设成IPv6连接后各种不舒服……再加上发现精品网只是IPv4部分,IPv6走的路由依旧是普通的163线路,延迟巨大,所以彻底打消了这个念头。如果你一直是用普通的163线路,那倒是可以一试。163线路的PPPoE MTU还是1492呢。
总结一下:
正常普通PPPoE宽带: 1412
正常普通PPPoE宽带套phantun: 1400
精品网: 1362
精品网套phantun: 1350
像我一样的洁癖强迫症:1280 + 32 + 32 = 1344 (算是个整数?)
|
评分
-
查看全部评分
|