前言
如果你像我一樣,在 Linux 或是各種路由器裡面隧道來隧道去的話,你很有可能下這麼一條 ip6tables 指令:
ip6tables -t mangle -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1208
這是因為我們要強制設定 TCP 的 MSS 到某個特定的值,避免封包大過這個隧道能提供的最大 MSS,造成封包碎片化,這可能導致上網不順暢或吞吐量下降。
不過當你開始無限套娃,例如 Wireguard 疊加 Wireguard,那這時候計算 MSS 的工作就會變得枯燥乏味,那有沒有更好的方式?
PMTU
Path Maximum Transmission Unit (PMTU) 是在 ICMPv6 的一種重要機制。當封包太大時,某個路由器發現封包大小超過下一跳允許的 MTU 時,則他可以丟棄這個封包,並向來源方發送一個 Packet Too Big 的錯誤訊息。而這個錯誤訊息會指出允許的 MTU 大小,因此來源方可以根據此資訊來動態的調整應該使用的大小並重新傳送。
因此,你可以在你的各種路由器,把我們上面的規則改成這樣:
ip6tables -t mangle -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
這樣就可以自適應你的各種隧道網路囉。