MTUとMSSの「最適解」:パケット断片化という悪夢を回避する、境界防御の深層
ネットワークの世界において、「サイズ」ほど残酷な現実は存在しない。MTU(Maximum Transmission Unit)とMSS(Maximum Segment Size)の不一致は、単なる設定ミスではない。それはパケットの断片化(Fragmentation)を引き起こし、CPU負荷を増大させ、ファイアウォールのステートフル・インスペクションを混乱させ、そして何より、TLSハンドシェイクの完遂を阻害する「サイレント・キラー」だ。
今日は、パケットが物理層の制約をどう受け入れ、TCP層がいかにしてそれを調整しているのか、その深淵を覗いてみよう。
—
1. なぜ「断片化」はエンジニアを殺すのか
イーサネットの標準的なMTUは 1500 バイトだ。だが、VPNトンネル(IPsecやVXLAN)を通るパケットはどうなる? カプセル化によるオーバーヘッドが加わり、実効MTUは削られる。
ここでMSSの理解が甘いと何が起きるか。MTUを超えたパケットがルーターで断片化されると、後続の断片には「TCPヘッダー」が含まれない。ファイアウォールやIDS/IPSは、最初のパケット(ヘッダー付き)でセッションを判断するが、後続の断片は正しくマッチングできず、パケットドロップの憂き目に遭う。これが、「HTTP通信だけが途中で固まる」という、現場で最も頭を抱えるトラブルの正体だ。
—
2. MSSクランピングによる「外科手術」
MSSは、TCPの SYN パケット内でネゴシエーションされる。もし通信経路上のどこかでMTUが 1400 バイトに制限されているなら、エンドポイントにはそれを告げなければならない。
Linuxカーネルレベルでこれを解決する最もエレガントな方法は、iptables または nftables による TCPMSS ターゲットの適用だ。
# 経路のMTUが1400であると仮定し、TCPヘッダー(20byte)+IPヘッダー(20byte)を引いた
# 1360バイトをMSSの最大値として強制的に書き換える。
# ※これにより、TCPコネクション確立時にMSS値が強制的に調整される
sudo iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1360
この設定は、パケットそのものを断片化させるのではなく、通信開始時に「ここまでなら断片化させずに運べるぞ」と両端に握らせるものだ。パフォーマンスの低下を招く断片化を、根源から断つ。これがプロのやり方だ。
—
3. TLSハンドシェイクとRTT削減への執念
現代のWebセキュリティにおいて、TLS 1.3は不可欠だ。しかし、TLSハンドシェイクは複数の往復(RTT)を必要とし、サーバー証明書を含めるとパケットサイズは膨らむ。
もしTCPウィンドウサイズが不適切に小さければ、パケットは細切れに送信され、余計なRTTを浪費する。sysctl でのTCPバッファチューニングは、現代の高速ネットワークにおける必須要件だ。
# /etc/sysctl.conf に記述すべき、高トラフィック環境向けの最適化設定例
# TCPウィンドウサイズを動的に最大化し、スループットを向上させる
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 初期ウィンドウサイズ(initcwnd)を増やし、ハンドシェイク直後のデータ転送量を増やす
# これにより、RTTを減らし、ページのレンダリング開始を早める
# (IPルートテーブルの設定で適用するのが一般的)
sudo ip route change default via 192.168.1.1 dev eth0 initcwnd 10
initcwnd 10 は、コネクション開始直後のバースト送信量を増やす。CDNやクラウドネイティブな環境では、この設定一つで体感速度が劇的に変わる。
—
4. 境界防御の盲点:PMTUDのブラックホール
「Path MTU Discovery (PMTUD)」は、ICMP Type 3 Code 4(Fragmentation Needed)を用いて経路上の最小MTUを自動検出する仕組みだ。しかし、セキュリティ強固な環境では、往々にして ICMP が全遮断されている。
結果として、PMTUDは機能せず、パケットはブラックホールに消える。これを回避する究極の策は、「PMTUDに頼らないMTU設計」と「MSSクランピングの徹底」だ。
特に、クラウド環境のVPNや、Kubernetesのオーバーレイネットワーク(CalicoやFlannel)を利用している場合、コンテナネットワークのMTU(例えば 1450 バイト)と物理NICのMTU(1500 バイト)の整合性を、常に監視・自動修正する仕組みを組み込んでおくべきだ。
—
結論:ネットワークは「生き物」である
パケットは、単なるデータの塊ではない。それは、あなたが書いたコード、設定したルーティングテーブル、そして守るべきセキュリティポリシーが融合して初めて目的地へ辿り着く、「意思を持った旅人」のようなものだ。
MTUとMSSのバランスを最適化することは、単なるチューニングではない。それは、ネットワークという過酷な環境下で、セッションという名の生命線を守り抜く、インフラアーキテクトとしての矜持である。
次にサーバーを構築する際は、tcpdump を走らせて、SYN パケットの MSS 値を凝視してほしい。そこに、あなたのネットワークの健康状態のすべてが記されているはずだ。
コメント