VPN構築やPPPoE接続の設計・トラブル対応で「Webサイトの一部が表示されない」「大きなファイルの転送だけ失敗する」といった症状に直面したことはないでしょうか。その原因の多くはMTU(Maximum Transmission Unit)とMSS(Maximum Segment Size)の設定ミスです。
本記事では、MTUとMSSの違い・Ciscoルータでの確認コマンド・pingを使った実践的なMTU調査方法・よくあるトラブルの対処まで体系的に解説します。
IPsec VPNを構築した直後、「社内から外部のWebサイトにアクセスできるが、特定のサイトだけページが途中で止まる」という問い合わせがありました。pingは通るし、小さいファイルのダウンロードもできる。なのになぜ?
原因はIPsecトンネルのMTUオーバーヘッドでパケットが分割されてしまい、経路途中のファイアウォールがフラグメントパケットを破棄していたことでした。トンネルインターフェースにip tcp adjust-mss 1360を設定した瞬間に症状が解消しました。「pingは通るのにWebが開けない」という症状を見たら、まずMTU/MSSを疑うようにしています。

MTUとMSSの違い
- IP層で扱える1パケットの最大サイズ
- イーサネットのデフォルト:1500バイト
- インターフェース単位で設定
- これを超えるパケットは分割(フラグメント)されるか破棄される
- TCP層で送信できる1セグメントの最大サイズ
- MTU − IPヘッダ(20B)− TCPヘッダ(20B)= 1460バイト
- TCPの3ウェイハンドシェイク時に両端でネゴシエーション
- Ciscoで
ip tcp adjust-mssで調整可能
CiscoルータでのMTU・MSS確認コマンド
インターフェースのMTU確認
Router# show interface GigabitEthernet0/0GigabitEthernet0/0 is up, line protocol is up
Hardware is Gigabit Ethernet, address is aabb.ccdd.ee01
MTU 1500 bytes, BW 1000000 Kbit/sec ← MTU値はここで確認
Full-duplex, 1000Mb/sip mtu と ip tcp adjust-mssの違い
MTU関連の設定コマンドが2種類あり、混同しやすいので整理します。
- そのインターフェースで転送するIPパケットの最大サイズを変更
- この値を超えるパケットはフラグメントまたは破棄
- TCP以外のプロトコル(UDP・ICMPなど)にも適用される
- TCPのSYNパケットのMSSフィールドを書き換える
- TCP通信のみに効果がある
- VPN・PPPoEでTCPセッションが失敗するときに有効
ip tcp adjust-mssはTCPのMSSフィールドを書き換えるだけなので、UDPやICMPには効果がありません。UDP通信(DNSの大きな応答・VoIPなど)でもフラグメント問題が発生する場合はip mtuでインターフェースのMTUそのものを調整する必要があります。MSSの調整設定(VPN・PPPoE時)
VPNやPPPoEではヘッダのオーバーヘッドが追加されるため、実効MTUが1500バイトより小さくなります。ip tcp adjust-mssを設定することで、TCPセッション確立時にMSSを適切な値に自動調整できます。
| 接続方式 | MTUの目安 | MSSの目安 | オーバーヘッドの内訳 |
|---|---|---|---|
| 通常のイーサネット | 1500 | 1460 | なし(デフォルト) |
| PPPoE | 1492 | 1452 | PPPoEヘッダ8バイト分を差し引く |
| IPsec VPN(ESP) | 約1400 | 1360 | ESP・新IPヘッダなど50〜100バイト程度 |
| GREトンネル | 1476 | 1436 | GREヘッダ4B+新IPヘッダ20B=24バイト |
! VPN/IPsecトンネルインターフェースにMSS調整を設定
Router(config)# interface Tunnel0
Router(config-if)# ip tcp adjust-mss 1360
! PPPoEインターフェースに設定する場合
Router(config)# interface Dialer0
Router(config-if)# ip tcp adjust-mss 1452
! ip mtuでパケット最大サイズを変更する場合(TCP以外にも影響する)
Router(config)# interface Tunnel0
Router(config-if)# ip mtu 1400
! 設定の確認
Router# show running-config interface Tunnel0 | include mtu\|adjustPMTUD(Path MTU Discovery)の仕組み
TCPはPMTUD(Path MTU Discovery)という仕組みで、経路上の最小MTUを自動的に検出しようとします。DFビット(Don’t Fragment)を立てたパケットを送信し、経路上の機器がパケットを廃棄する際にICMP Type3 Code4(Fragmentation Needed)を返送することで最適なMTUを学習します。
ip tcp adjust-mssはPMTUDに依存しないためこの問題を回避できます。pingコマンドを使ったMTU調査方法
DFビットを立てたpingを送信し、成功する最大サイズを探ることで現在の経路MTUを調査できます。
ヘッダサイズの計算(重要)
ICMPヘッダ = 8バイト
合計オーバーヘッド = 28バイト
MTU 1500 を確認したい場合:1500 − 28 = 1472バイトを
-lまたは-sに指定するWindowsでのping MTU調査
! MTU 1500を確認(-l 1472 + 28バイトオーバーヘッド = 1500)
C:\> ping -f -l 1472 8.8.8.8
! MTU 1400を確認する場合
C:\> ping -f -l 1372 8.8.8.8
! -f:DFビットを立てる(フラグメント禁止)
! -l:送信データサイズ(ヘッダを除くデータ部分)(成功時の出力)
Reply from 8.8.8.8: bytes=1472 time=15ms TTL=117
→ MTUは1500以上あることを確認
(失敗時の出力)
Packet needs to be fragmented but DF set.
→ MTUが1500未満。-l の値を小さくして再試行Linuxでのping MTU調査
! Linuxでのコマンド(-M do でDFビットを立てる)
$ ping -M do -s 1472 8.8.8.8
! -M do:DFビット(フラグメント禁止)
! -s:送信データサイズ(ヘッダを除くデータ部分)macOSでのping MTU調査
! macOSではオプションが異なる(-D でDFビットを立てる)
$ ping -D -s 1472 8.8.8.8
! macOSは -M do ではなく -D を使う点に注意-M doは使えません。-DでDFビットを立てます。また-sはLinux同様にデータサイズを指定します。二分探索でMTUを特定する手順
ping -f -l 1472(MTU 1500の確認)→ 失敗したら次へping -f -l 1400(MTU 1428の確認)→ 失敗したらさらに減らすping -f -l 1364(MTU 1392の確認)→ 成功/失敗で値を絞り込む-l値 + 28バイト(IP+ICMPヘッダ)= 現在のMTUよくあるトラブルと対処法
| 症状 | 原因 | 対処 |
|---|---|---|
| pingは通るがWebサイトが開けない・途中で止まる | MTUオーバーによるフラグメント破棄またはPMTUD Blackhole | ip tcp adjust-mssをトンネルIFに設定 |
| VPN越しの通信が一部だけ失敗する | IPsecオーバーヘッドでMTUを超えMSSが調整されていない | Tunnel0にip tcp adjust-mss 1360を設定 |
| 小さなパケットは通るが大きなパケットが失敗 | MTU制限でフラグメントが発生しているが途中で破棄 | pingでMTUを特定し、ip mtuまたはadjust-mssで調整 |
| トンネルインターフェースだけ通信が遅い | MTU調整不足によるフラグメント増加またはQoSとの干渉 | MTU・MSS調整後、QoSポリシーとの競合も確認 |
| PPPoEでWebがたまに遅い | PPPoEのMTU 1492に対してMSS未調整 | Dialer0にip tcp adjust-mss 1452を設定 |
まとめ
MTUとMSSは、パケットがスムーズに転送されるための重要なパラメータです。特にVPNやPPPoEなどMTUが制限される構成では適切な調整が必須です。
- MTUは
show interfaceでインターフェース単位で確認する ip tcp adjust-mssはTCP通信のみ。UDPにも対応するならip mtuで調整- 「pingは通るがWebが開けない」はPMTUD BlackholeまたはMSS未調整が原因の可能性が高い
- pingによるMTU調査:成功した最大の
-l値 + 28バイト = 現在のMTU - macOSのpingは
-Dを使う(Linuxの-M doとは異なる) - VPN/IPsec:MSS 1360、PPPoE:MSS 1452が一般的な目安
トラブル発生時はpingでMTUを実測し、ip tcp adjust-mssとip mtuを組み合わせて対応することで多くの問題を解決できます。



