「pingは通る、小さい通信もできる。でもファイル転送やSSLだけ固まる」。この不思議な障害の犯人は、たいていMTU/MSSです。
MTUとMSS
- MTU(Maximum Transmission Unit) … 1つのフレームで運べる最大サイズ。イーサネットは通常1500バイト。
- MSS(Maximum Segment Size) … TCPが1セグメントで運べるデータの最大サイズ。ざっくり MTU − IPヘッダ − TCPヘッダ(1500 − 40 = 1460)。
TCPは接続時に、互いのMSSを教え合います。
トンネルで実効MTUが縮む
VPN(IPsec等)やPPPoEを通ると、カプセル化のヘッダが付く分、実際に運べるサイズが1500より小さくなります。ところが端末は「1500で送れる」と思ったまま大きなパケットを出すため、途中でサイズオーバーが起きます。
なぜ「大きい通信だけ」止まるのか
小さいパケット(pingや軽い通信)は上限に収まるので通ります。ところがファイル転送やTLSハンドシェイクのような大きいパケットは上限を超え、途中のルータで「これ以上運べない」となります。ここで、
- ルータが「分割して」と通知(ICMP)を返す
- でもFWがそのICMPを弾いている
と、通知が届かず送信側が調整できません。結果、大きいパケットだけが黙って消える=「特定通信だけ固まる」になります。これがPMTUD(Path MTU Discovery)ブラックホールです。
切り分け:サイズを変えてping
分割禁止フラグ付きでサイズを変えてpingすると、どこで詰まるか分かります。
# Windows: -f 分割禁止, -l サイズ
ping -f -l 1472 8.8.8.8 … 1472+28=1500。通るか?
ping -f -l 1400 8.8.8.8 … 小さくすると通る=MTU問題の可能性大
小さくすると通り、大きくすると通らないなら、経路のMTU不足がほぼ確定です。
対処
- 経路上でICMP(Type3 Code4)を通す
- ルータでMSSを調整する(MSSクランプ)
interface Tunnel0
ip tcp adjust-mss 1360
これでTCPのMSSを実効MTUに合わせ、大きすぎるパケットが出ないようにします。
まとめ
「小さい通信はOK、大きい通信だけNG」を見たら、まずMTU/MSSを疑う。VPN・PPPoE区間では定番のトラブルです。ping のサイズ変更で切り分け、MSSクランプで対処、という型を覚えておくと強いです。