在法国用二手 ThinkPad 跑 WireGuard 回家,MTU 别照抄 1420
家里是 Freebox Pop,光纤 2G/700M,盒子放在客厅,NAS 和一台旧 ThinkPad T480(Debian 12,内核 6.1)在储物间。人在外面用手机或笔记本连回家里取文件、看监控,走的是 WireGuard,服务端就跑在这台 T480 上。跑起来前两周一切正常,SSH 和网页都行,直到我开始往外传 4GB 左右的备份包,传到 60%~80% 之间卡死,重连后继续传又能过一段,反复几次才传完。小文件完全没问题,所以一开始怀疑是硬盘或者 Samba,绕了不少路。
做法上我没动服务端默认配置,只改了客户端 MTU,然后固定下来:
[Interface]
PrivateKey = <client-key>
Address = 10.66.66.2/24
DNS = 10.66.66.1
MTU = 1380
[Peer]
PublicKey = <server-pub>
Endpoint = <ddns>:51820
AllowedIPs = 10.66.66.0/24, 192.168.1.0/24
PersistentKeepalive = 25
服务端那边只做了两件事:net.ipv4.ip_forward=1,以及 PostUp/PostDown 里加 iptables MASQUERADE,转发到 192.168.1.0/24。MTU 1380 是这么试出来的:先按 1420(1500 减 80)设,大包仍会卡;用 ping -M do -s 1352 10.66.66.1 逐级往下试,1352 能过、1360 不通,加上 28 字节 IP/ICMP 头就是 1380,留了点余量。
为什么不是照抄社区里常见的 1420:WireGuard 走 UDP,外层还要再套一层 PPPoE 和 Freebox 的 NAT,实际可用载荷比理论值小。1420 在纯以太网环境里通常够用,但套上 PPPoE 的 1492 之后,1500 减 80 的算法就不成立了,表现不是「连不上」,而是「小包正常、大包静默丢」,TCP 靠重传硬撑,看起来像慢,实际是卡。代价是 MTU 调小后每个包的有效载荷变少,同样传 4GB,包数会多一些,吞吐略降,但在家宽上行 700M 的场景下基本看不出来。
会失效的地方:一是我把 AllowedIPs 限成内网段,如果哪天想全局代理,客户端 MTU 要重新测,因为出口链路变了;二是换到手机热点或者别家运营商,外层封装又不一样,1380 不一定最优,我在 Orange 的 4G 上就见过 1360 才稳;三是 ping -M do 只能测 ICMP,UDP 路径上如果有设备做分片策略,测出来能过不代表 WireGuard 不丢,最终还是要拿大文件实测。
你们在外面连回家时,MTU 是照默认 1420 抄的,还是按自己那条链路重新测过?
0 条评论
还没有评论,写下第一条。