MTUミスマッチの解決:「Frag needed and DF set」エラーの修正方法

intermediate🌐 Networking2026-04-29| Linux (Ubuntu/CentOS), Windows Server, Cisco/Mikrotikルーター, AWS/Azure VPC

Error Message

Frag needed and DF set (mtu = 1500)
#ネットワーク#MTU#フラグメンテーション#パケットロス#VPNトラブルシューティング

シナリオ:「ゴースト」コネクションVPNが「接続済み」と表示されているのに、実際には全く通信ができないという経験はありませんか?非常にストレスのたまる状況です。サーバーへのPingは即座に返ってきます。小さなDNSクエリも問題なく解決されます。しかし、5MBのPDFをダウンロードしようとしたり、Salesforceのような重いサイトを読み込もうとしたりした瞬間、ブラウザの読み込みアイコンが回り続け、最終的にタイムアウトしてしまいます。これは完全な停止ではなく、ボトルネックが発生している状態です。

この挙動は、MTU(最大伝送ユニット)ミスマッチの典型的な特徴です。ノートPCとサーバーの間のどこかに、IPsec、GRE、VXLANなどのトンネルがあり、その容量が標準的な1500バイトのイーサネットフレームよりも小さくなっています。大きなパケットがその狭いパイプに到達すると、ルーターはそれを分割(フラグメンテーション)する必要があります。しかし、現代のTCPトラフィックは効率を維持するために「Don't Fragment」(DF)ビットを使用します。パケットが大きすぎて分割できない場合、ルーターは単にパケットを破棄し、ICMPエラーを返します。

エラーの特定:Frag needed and DF setWiresharkでトラフィックを監視したり、障害発生時にルーターのログを確認したりすると、次のような警告が表示されます。

Frag needed and DF set (mtu = 1450)

エラーに含まれるMTU値は、次のホップの正確な上限値を示しています。現代のWebトラフィックの多くは、フラグメンテーションをパフォーマンス低下の要因として扱うため、パケットは小さくなるのではなく、消えてしまいます。コンピューターは、ルーターがすでに破棄したデータを待ち続けることになります。

Pingによるボトルネックの特定手動のPingテストを使用して、正確な限界点を特定できます。特定のパケットサイズを強制し、フラグメンテーションを禁止することでこれを行います。大きな値から始めて、徐々に下げていきます。

Linuxの場合:

# 1500バイトのパケットをテスト(1472ペイロード + 28ヘッダー)
ping -M do -s 1472 8.8.8.8

Windowsの場合:

ping -f -l 1472 8.8.8.8

「Packet needs to be fragmented but DF set」と表示された場合は、応答が得られるまでサイズを10〜20バイトずつ下げてください(例:1460、1440、1400)。正常に動作する魔法の数字が見つかったら、それに28を加えます。その結果があなたの環境のパスMTU(Path MTU)です。

修正方法:ギャップを埋める3つの方法### オプション1:MSSクランプ(ルーター側での修正)ゲートウェイを管理している場合、MSSクランプ(MSS Clamping)は最もスマートな解決策です。これは初期のTCPハンドシェイクを傍受し、最初から小さなセグメントサイズで合意するように両端を「騙し」ます。これにより、大きなパケットが送信されるのを未然に防ぎます。

iptablesを使用したLinuxファイアウォールでは、次のルールを使用して、パス探索(Path Discovery)に合わせてMSSを自動的に調整します。

iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Cisco管理者の場合は、これをトンネルインターフェースに直接適用して、セグメントを1360バイトに制限します(ほとんどのVPNで安全な値です)。

interface Tunnel0
 ip tcp adjust-mss 1360

オプション2:ローカルインターフェースのMTU調整ネットワーク機器を制御できない場合は、特定のマシンが通信する方法を変更する必要があります。ネットワークインターフェースカード(NIC)のMTUを下げることで、システムから送信されるすべてのパケットがパイプに収まるようになります。

Linuxの場合:

# インターフェースを特定し、1400に設定
sudo ip link set dev eth0 mtu 1400

Windows(PowerShell)の場合:

# 'Ethernet'アダプターのMTUを永続的に設定
netsh interface ipv4 set subinterface "Ethernet" mtu=1400 store=persistent

オプション3:ICMPのブロックを停止するパスMTU探索(PMTUD)は、ICMP Type 3 Code 4メッセージに依存しています。多くのセキュリティチームは、すべてのICMPトラフィックを遮断することでファイアウォールを過剰に強化してしまいます。これらの「Destination Unreachable」メッセージをブロックすると、送信側はパケットを小さくする必要があることを知ることができません。ネットワークが自己修復できるように、エッジセキュリティポリシーでこの特定のICMPコードを許可するようにしてください。

修正の検証修正を適用した後、Pingテストに戻ります。MTUを1400に下げた場合、ペイロード1372(1372 + 28 = 1400)のPingが通るはずです。さらに重要なのは、実際に負荷の高いタスクを試すことです。以前は0%で停止していたscpによるファイル転送や大規模なデータベースのエクスポートが、通常通り帯域幅を使い切って動作するはずです。

学んだ教訓MTUの悩みは、ほとんどの場合「カプセル化のオーバーヘッド」に起因します。標準のイーサネットでは1500バイトが提供されますが、各トンネルレイヤーがその一部を消費します。

  • IPsec: 暗号化のために約50〜70バイトを消費。- VXLAN: 50バイトのオーバーヘッドを追加。- GRE: 24バイトを消費。- PPPoE: 8バイトを使用(DSLや光回線の家庭用接続で一般的)。新しいVPCや拠点間リンクを設計する際は、Subnet Calculatorのようなツールを使用して、早い段階でネットワーク階層を計画します。CIDRブロックや潜在的なトンネルの重複を可視化することで、最初のパケットが送信される前に、これらの「ゴースト」接続の問題を防ぐことができます。小さなパケットは通るのに大きなパケットが失敗する場合は、まずMTUを確認してください。

Related Error Notes