2024年10月6日 星期日

Linux PPPoE NAT MTU and MSS

Linux 在 PPPoE 環境下 NAT,下面的 Client 可能會有部份網站連不上,
已知 LINE 的網站 (https://line.me) 及 LINE 服務就有這個狀況

這個問題是因為 Client 的 MTU 1500 大於 Linux NAT WAN 端的 MTU 1492 所導致,
解決方式有兩種:

1. 在 Linux NAT 解決,加一行 Rule
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
TCPMSS 這個 target 會更改 TCP SYN 封包的 MSS 值
--clamp-mss-to-pmtu 會根據 path_MTU 自動設定 MSS (Maximun segment size) 的值,即 path_MTU - 40 (for IPv4)
2. 更改 Client 端的 MTU 跟 NAT WAN 端一致

這兩種方式明顯是方法 1 較佳,不用動到 Client 端

原理:
一般 Ethernet MTU 是 1500,PPPoE 是 1492,
Client PC 沒特別調整的話,MTU 也是 1500,進行 TCP SYN 連線,
TCP Option 中的 MSS 會是 1460 (1500-40 TCP Header)



在尚未加上面的 Rule 時,NAT 會原封不動轉送出去,
導致回應封包有可能會超出 PPPoE 環境的值1452,後續就收不到 Server Hello 封包,就會卡住沒通
加入該 Rule 後,封包在轉送出去時,會改成 MSS 值為 1452,後續就會通



那為何大部份的網站都會通呢?
因為用了較小的 MSS,例如 Google 是 1412

沒有留言:

Linux PPPoE NAT MTU and MSS

Linux 在 PPPoE 環境下 NAT,下面的 Client 可能會有部份網站連不上, 已知 LINE 的網站 ( https://line.me ) 及 LINE 服務就有這個狀況 這個問題是因為 Client 的 MTU 1500 大於 Linux NAT WAN 端的 ...