Juniper の MTU 設定でハマった話

Juniper の EX, MX の間の MTU 設定でハマった話.原因が分かるまで結構苦労したのでメモ.

原因

結論だけ書くと MX の特殊な設定方法と EX の MTU 誤表示.

現象

次のように EX と MX を trunk port で接続していた.

Host1–EX xe-0/0/0–xe-0/0/1 MX—Host2

Host1 と Host2 の間で ping を通るが,ファイル転送などが出来ない.同じブロードキャストドメインなのでファイアウォールなどは関係ない,というよく分からん状況.

色々調べてみるとパケットのサイズが大きいと MX 側でパケットがドロップしているらしいことが分かった.

設定

EX側の次のような設定.

xe-0/0/0 {
    unit 0 {
        family ethernet-switching {
            port-mode trunk;
            vlan {
                members [ 100 200 ];
            }
        }
    }
}

MX側の次のような設定.

xe-0/0/1 {
    unit 0 {
        family bridge {
            interface-mode trunk;
            vlan-id-list [ 100 200 ];
        }
    }
}

MTUの値を show interface で確認するとどちらのインターフェイスも Ethernet MTU が 1514 に設定されている.そう, MTU の不一致は発生していないように見える.

だがちょっと待って欲しい.普通の Ethernet MTU (フレームサイズ)は 1518 バイトである.内訳は次の通り.

  • 宛先MAC, 6バイト
  • 送信MAC, 6バイト
  • タイプ, 2バイト
  • ペイロード, 1500バイト
  • チェックサム(FCS), 4バイト

実は Junos では FCS の 4 バイト分を除いて表示している(多分,チェックサム計算はNICで実行される,ハードウェアオフロードされる,のでソフトウェア側では無視する実装になっているのだろう).だから 1514 = 1518 - 4 で正しいように見える.

だが,ちょっと待って欲しい.このインターフェイスは trunk ポートなので vlan タグの分の 4 バイトが余計に必要である.つまり MTU は 1518 として設定されているはずである.だが,そうなっていない.何が起こっているのか.

原因

原因は MX にある.EX の MTU は 1514 と表示されているだけで,実際は 1518 が設定されている(この不具合は修正済みかも).

実は MX はインターフェイスを trunk に設定しても MTU を自動的に増加しない(どうも EX は trunk を設定すると MTU を自動で増加させるようだ,というか,それが普通だろう).

従って, MX 側で MTU を手動で設定するか vlan-tagging を追加すれば良い.

xe-0/0/1 {
    vlan-tagging;
    unit 0 {
        family bridge {
            interface-mode trunk;
            vlan-id-list [ 100 200 ];
        }
    }
}

その他 ping で MTU をチェック方法

次のコマンドでサイズ 1500 の IP パケットが作成できる.

ping -M do -s 1472 8.8.8.8

オプション -M do で Don’t Fragment (DF) ビットを1にセット, オプション -s でICMPペイロードのサイズを指定する.これでサイズ 1500 のIPパケットができる,内訳は次である.

  • IP ヘッダ, 20 バイト
  • ICMP ヘッダ, 8 バイト
  • ICMP ペイロード, 1472 バイト

以上.