Cisco IOS MTU MSS ping VPN / PPPoE

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確認方法図
MTU/MSS確認方法:パケット構造の関係とping・ip tcp adjust-mssによる調整手順

MTUとMSSの違い

MTU(Maximum Transmission Unit)
  • IP層で扱える1パケットの最大サイズ
  • イーサネットのデフォルト:1500バイト
  • インターフェース単位で設定
  • これを超えるパケットは分割(フラグメント)されるか破棄される
MSS(Maximum Segment Size)
  • TCP層で送信できる1セグメントの最大サイズ
  • MTU − IPヘッダ(20B)− TCPヘッダ(20B)= 1460バイト
  • TCPの3ウェイハンドシェイク時に両端でネゴシエーション
  • Ciscoでip tcp adjust-mssで調整可能
図1:MTUとMSSの関係(イーサネット標準の場合)
Ethernetフレーム(最大1518バイト) IPヘッダ 20B TCPヘッダ 20B TCPペイロード(MSS:最大1460バイト) ← MTU:1500バイト(IP層)→

CiscoルータでのMTU・MSS確認コマンド

インターフェースのMTU確認

Router# show interface GigabitEthernet0/0
GigabitEthernet0/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/s

ip mtu と ip tcp adjust-mssの違い

MTU関連の設定コマンドが2種類あり、混同しやすいので整理します。

ip mtu [サイズ]
  • そのインターフェースで転送するIPパケットの最大サイズを変更
  • この値を超えるパケットはフラグメントまたは破棄
  • TCP以外のプロトコル(UDP・ICMPなど)にも適用される
ip tcp adjust-mss [サイズ]
  • TCPのSYNパケットのMSSフィールドを書き換える
  • TCP通信のみに効果がある
  • VPN・PPPoEでTCPセッションが失敗するときに有効
ℹ UDPやICMPはip tcp adjust-mssでは制御できない ip tcp adjust-mssはTCPのMSSフィールドを書き換えるだけなので、UDPやICMPには効果がありません。UDP通信(DNSの大きな応答・VoIPなど)でもフラグメント問題が発生する場合はip mtuでインターフェースのMTUそのものを調整する必要があります。
図2:MTU/MSS設定が必要になる主な原因(現場経験ベース)

MSSの調整設定(VPN・PPPoE時)

VPNやPPPoEではヘッダのオーバーヘッドが追加されるため、実効MTUが1500バイトより小さくなります。ip tcp adjust-mssを設定することで、TCPセッション確立時にMSSを適切な値に自動調整できます。

接続方式MTUの目安MSSの目安オーバーヘッドの内訳
通常のイーサネット15001460なし(デフォルト)
PPPoE14921452PPPoEヘッダ8バイト分を差し引く
IPsec VPN(ESP)約14001360ESP・新IPヘッダなど50〜100バイト程度
GREトンネル14761436GREヘッダ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\|adjust

PMTUD(Path MTU Discovery)の仕組み

TCPはPMTUD(Path MTU Discovery)という仕組みで、経路上の最小MTUを自動的に検出しようとします。DFビット(Don’t Fragment)を立てたパケットを送信し、経路上の機器がパケットを廃棄する際にICMP Type3 Code4(Fragmentation Needed)を返送することで最適なMTUを学習します。

🚨 ICMPブロックがPMTUDを妨げる「PMTUD Blackhole」問題 ファイアウォールでICMPをすべてブロックしている環境では、「ICMPの経路到達不能(Fragmentation Needed)」が送信元に届かず、MTU自動検出が機能しません。これを「PMTUD Blackhole」と呼びます。「pingは通るのにHTTPSだけ失敗する」はこの典型症状です。ip tcp adjust-mssはPMTUDに依存しないためこの問題を回避できます。

pingコマンドを使ったMTU調査方法

DFビットを立てたpingを送信し、成功する最大サイズを探ることで現在の経路MTUを調査できます。

ヘッダサイズの計算(重要)

IPヘッダ = 20バイト
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 を使う点に注意
⚠ macOSのpingオプションはLinuxと異なる macOSでは-M doは使えません。-DでDFビットを立てます。また-sはLinux同様にデータサイズを指定します。

二分探索でMTUを特定する手順

1
ping -f -l 1472(MTU 1500の確認)→ 失敗したら次へ
2
ping -f -l 1400(MTU 1428の確認)→ 失敗したらさらに減らす
3
ping -f -l 1364(MTU 1392の確認)→ 成功/失敗で値を絞り込む
4
成功した最大の-l+ 28バイト(IP+ICMPヘッダ)= 現在のMTU

よくあるトラブルと対処法

症状原因対処
pingは通るがWebサイトが開けない・途中で止まるMTUオーバーによるフラグメント破棄またはPMTUD Blackholeip 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を組み合わせて対応することで多くの問題を解決できます。