このドキュメントでは、マルチプロトコル ラベル スイッチング(MPLS)環境で traceroute コマンドがどのように機能するかを説明します。
次の項目に関する知識があることが推奨されます。
MPLS の基礎知識
詳細については、『初心者向けの MPLS の FAQ』を参照してください。
このドキュメントの内容は、特定のソフトウェアやハードウェアのバージョンに限定されるものではありません。
ドキュメント表記の詳細は、『シスコ テクニカル ティップスの表記法』を参照してください。
このセクションでは、従来の traceroute コマンドがどのように動作するかについて説明します。次の図はサービス プロバイダーの設定を示しています。Router 1(R1)と Router 4(R4)は、プロバイダー エッジ(PE)ルータであり、Router 2(R2)と Router 3(R3)はプロバイダー(P)ルータです。
この例では、R1からR4ループバック14に対してtracerouteを実行します。R1は、任意の宛先ポート値が32000を超えるUDPデータグラムを使用します。ポート番号にこのような高い値を指定します。R1 は、このデータグラムを IP パケットに格納します。
注:このドキュメントでは、IPパケットが記述されるたびに、UDPデータグラムを含むIPパケットです。
次に示すのは、通常の traceroute コマンドの一連のイベントです。
R1 は宛先アドレスが 14 で存続可能時間(TTL)が 1 の IP パケットをその eth1 インターフェイスから送信します。
R2はパケットを受信し、パケットのTTLが1であることを確認します。パケットをドロップし、TTL期限切れのインターネット制御メッセージプロトコル(ICMP)メッセージをR1に送信します。このICMPメッセージの送信元アドレスは、R2 eth0(元のパケットを受信インターフェイスのアドレス)のです。
ICMP メッセージを受信すると、R1 は宛先に 14、TTL に 2 を設定した別の IP パケットを自身の eth1 インターフェイスから送信します。
R2はパケットを受信し、R3を通じて宛先に到達できることを確認します。R2はTTLを2から1に減らして、パケットをR3に転送します。R3はパケットを受信し、宛先ではないことがわかります。TTLは1です。パケットをドロップし、TTL期限切れICMPメッセージを送信元アドレスとしてR1に送信します。
R1はICMPメッセージを受信し、TTL値3で別のIPパケットをeth1インターフェイスを介して14に送信します。途中で、R2とR3はTTLを減らしてR4に渡します。R4はパケットを取得し、UDPデータグラムのののポート値に接続します。R4 はこのポートが存在しないことを確認して、ICMP port unreachable エラー メッセージを R1 に送信します。
以前と同様に、このICMPメッセージの送信元アドレスはR4のeth0です。tracerouteプログラムは、対応する送信元アドレスを持つすべてのICMPエラーメッセージを受信し、宛先への完全なルートを持ちます。
このシナリオは、「通常の traceroute コマンド」のセクションで詳しく説明されているシナリオと同じです。ただし、R1 から R4 までのすべてのルータが、IP フォワーディングではなくラベル スイッチングを行います。テスト ベッドの設定を次の図に示します。テスト ベッドに示されているすべてのインターフェイスは、ネットワーク 10.13.0.0 にあります。
このドキュメントの目的上、以下のことを仮定します。
R1 は R4 に到達するためにラベル 47 を使用し、パケットを R2 に転送します。
R2 は R4 に到達するためにラベル 45 を使用し、パケットを R3 に転送します。
R3 はラベルを取り去り、R4 にパケットを転送します。
R4 は R1 に到達するためにラベル 28 を使用し、パケットを R3 に転送します。
R3 は R1 に到達するためにラベル 26 を使用し、パケットを R2 に転送します。
R2 はラベルを取り去り、R1 にパケットを転送します。
次の手順では、R1 から R4 ループバック 10.13.1.51 に traceroute を実行するためのイベントのシーケンスを示します。
R1は、ラベル47とTTL 1を持つラベル交換パケットをR2に送信します。IPパケットのTTLフィールドは、ラベルヘッダーのTTLフィールドにコピーされます。
R2は、これが意図された受信者ではなく、TTLが1であることを認識します。パケットをドロップし、通常のIPパケットと同様にTTL期限切れICMPメッセージを作成します。この場合、ICMP メッセージ パケットは MPLS の ICMP 拡張ごとに生成されます。
R2 は、ICMP メッセージにラベル 47(期限が切れた受信ラベル)を付加します。R2 は、R1 に直接パケットを送信しません。代わりに、ラベル転送情報ベース(LFIB)に問い合わせ、ラベル47で受信したパケットにはラベル45を使用する必要があることを検出します。ラベル45をパケットに付加し、TTL期限切れICMPメッセージをR3に送信します。
R3はラベルをポップしてR4に送信します。R4は宛先がR1であることを確認し、28のラベルをメッセージに付け、R3とR2を介してR1に送信します。
ICMPエラーメッセージは、R1に戻される前に相手側に送信されます。次の例は図を示しています。
R4のイーサネットインターフェイスでスニファパケットがステップ1 ~ 5を確認します。スニファ出力では、フレーム1が着信パケット、フレーム2がR4からの発信パケットです。出力はこの説明を反映してフォーマットされ、注目すべき点が太字です。
Frame 1 (182 on wire, 182 captured) Ethernet II Destination: 00:04:4e:7a:74:00 (Cisco_7a:74:00) Source: 00:03:fd:1c:86:84 (Cisco_1c:86:84) Type: IP (0x0800) Internet Protocol Version: 4 Header length: 20 bytes Time to live: 254 Protocol: ICMP (0x01) Header checksum: 0x1b8e (correct) Source: 10.13.2.33 (10.13.2.33) Destination: 10.13.2.34 (10.13.2.34) Internet Control Message Protocol Type: 11 (Time-to-live exceeded) Code: 0 (TTL equals 0 during transit) Checksum: 0x0c88 (correct) Data (140 bytes) 04500 001c 9e19 0000 0111 044a 0a0d 0222E..........J..." 100a0d 0133 989d 829a 0008 cd37 0000 0000...3.......7.... 200000 0000 0000 0000 0000 0000 0000 0000................ 300000 0000 0000 0000 0000 0000 0000 0000................ 400000 0000 0000 0000 0000 0000 0000 0000................ 500000 0000 0000 0000 0000 0000 0000 0000................ 600000 0000 0000 0000 0000 0000 0000 0000................ 700000 0000 0000 0000 0000 0000 0000 0000................ 802000 edf2 0008 0101 0002 f101........... Frame 2 (186 on wire, 186 captured) Ethernet II Destination: 00:03:fd:1c:86:84 (Cisco_1c:86:84) Source: 00:04:4e:7a:74:00 (Cisco_7a:74:00) Type: MPLS label switched packet (0x8847) MultiProtocol Label Switching Header MPLS Label: Unknown (28) MPLS Experimental Bits: 6 MPLS Bottom Of Label Stack: 1 MPLS TTL: 253 Internet Protocol Version: 4 Header length: 20 bytes Time to live: 253 Protocol: ICMP (0x01) Header checksum: 0x1c8e (correct) Source: 10.13.2.33 (10.13.2.33) Destination: 10.13.2.34 (10.13.2.34) Internet Control Message Protocol Type: 11 (Time-to-live exceeded) Code: 0 (TTL equals 0 during transit) Checksum: 0x0c88 (correct) Data (140 bytes) 04500 001c 9e19 0000 0111 044a 0a0d 0222E..........J..." 100a0d 0133 989d 829a 0008 cd37 0000 0000...3.......7.... 200000 0000 0000 0000 0000 0000 0000 0000................ 300000 0000 0000 0000 0000 0000 0000 0000................ 400000 0000 0000 0000 0000 0000 0000 0000................ 500000 0000 0000 0000 0000 0000 0000 0000................ 600000 0000 0000 0000 0000 0000 0000 0000................ 700000 0000 0000 0000 0000 0000 0000 0000................ 802000 edf2 0008 0101 0002 f101...........
出力のフレーム1では、R4が受信した最初のパケットは、R2(元のパケットが受信されたインターフェイス)からR1(10.13.2.34)へのTTL期限切れICMPメッセージです。 ICMPメッセージのデータ部分で、バイト0x89および0x8Aの最初のニブルでは、MPLSラベル(20バイト)が期限切れになり、その値は0x02F、つまり47です。これはTTLが1のパケットの着信ラベルです。
出力の Frame 2 で、Type が MPLS label switched packet として示されており、MPLS パケットであることを意味します。R4 はラベル 28 を Frame 1 に付加し、これをラベルスイッチド パス経由で R1 に転送します。フレーム内の MPLS ヘッダーは太字で示されています。また、パケットのTTL部分を参照すると、フレーム1の値は254で、フレーム2の値は253です。R4では1ずつ減少しています。
R1はICMPメッセージを受信し、ラベルが47でTTLが2の別のパケットをR2に送信します。R2はラベルを入れ替え、TTL(2から1)を減らしてR3に転送します。ステップ2と同様に、R3は期限切期限切のの期限切TTLをR1。
次に示す R4 のスニファ出力で手順 6 を確認します。
Frame 3 (182 on wire, 182 captured) Ethernet II Destination: 00:04:4e:7a:74:00 (Cisco_7a:74:00) Source: 00:03:fd:1c:86:84 (Cisco_1c:86:84) Type: IP (0x0800) Internet Protocol Version: 4 Header length: 20 bytes Time to live: 255 Protocol: ICMP (0x01) Header checksum: 0x146f (correct) Source: 10.13.3.134 (10.13.3.134) Destination: 10.13.2.34 (10.13.2.34) Internet Control Message Protocol Type: 11 (Time-to-live exceeded) Code: 0 (TTL equals 0 during transit) Checksum: 0x0c88 (correct) Data (140 bytes) 04500 001c 9e1b 0000 0211 0348 0a0d 0222E..........H..." 100a0d 0133 9292 829b 0008 d341 0000 0000...3.......A.... 200000 0000 0000 0000 0000 0000 0000 0000................ 300000 0000 0000 0000 0000 0000 0000 0000................ 400000 0000 0000 0000 0000 0000 0000 0000................ 500000 0000 0000 0000 0000 0000 0000 0000................ 600000 0000 0000 0000 0000 0000 0000 0000................ 700000 0000 0000 0000 0000 0000 0000 0000................ 802000 0df3 0008 0101 0002 d101........... Frame 4 (186 on wire, 186 captured) Ethernet II Destination: 00:03:fd:1c:86:84 (Cisco_1c:86:84) Source: 00:04:4e:7a:74:00 (Cisco_7a:74:00) Type: MPLS label switched packet (0x8847) MultiProtocol Label Switching Header MPLS Label: Unknown (28) MPLS Experimental Bits: 6 MPLS Bottom Of Label Stack: 1 MPLS TTL: 254 Internet Protocol Version: 4 Header length: 20 bytes Time to live: 254 Protocol: ICMP (0x01) Header checksum: 0x156f (correct) Source: 10.13.3.134 (10.13.3.134) Destination: 10.13.2.34 (10.13.2.34) Internet Control Message Protocol Type: 11 (Time-to-live exceeded) Code: 0 (TTL equals 0 during transit) Checksum: 0x0c88 (correct) Data (140 bytes) 04500 001c 9e1b 0000 0211 0348 0a0d 0222E..........H..." 100a0d 0133 9292 829b 0008 d341 0000 0000...3.......A.... 200000 0000 0000 0000 0000 0000 0000 0000................ 300000 0000 0000 0000 0000 0000 0000 0000................ 400000 0000 0000 0000 0000 0000 0000 0000................ 500000 0000 0000 0000 0000 0000 0000 0000................ 600000 0000 0000 0000 0000 0000 0000 0000................ 700000 0000 0000 0000 0000 0000 0000 0000................ 802000 0df3 0008 0101 0002 d101...........
フレーム3の出力からは、フレーム3がR3からR1へのICMPパケットであることを判別できます。送信元アドレス(10.13.3.134)は、元のパケットが受信されるアドレスです。ICMP エラー メッセージには、データ部分の末尾に期限切れラベルの情報が含まれています。その値は0x02dで、これは45です。フレーム4は、R4からR1に送信されるMPLSパケットです。
ICMPメッセージを受信すると、R1はラベル47とTTL 3を持つ別のパケットを送信します。その途中で、R2とR3はTTLを減分し、パケットをR4に転送します。R4は宛先であることを確認し、UDPデータグラムポートをします。R4 は、R3 と R2 を介して、ICMP の port unreachable メッセージを R1 に送信します。
このスニファ出力で注目すべき重要な点は、太字で示されています。
Frame 5 (60 on wire, 60 captured) Ethernet II Destination: 00:04:4e:7a:74:00 (Cisco_7a:74:00) Source: 00:03:fd:1c:86:84 (Cisco_1c:86:84) Type: IP (0x0800) Trailer: 00000000000000000000000000000000... Internet Protocol Version: 4 Header length: 20 bytes Time to live: 1 Protocol: UDP (0x11) Header checksum: 0x0446 (correct) Source: 10.13.2.34 (10.13.2.34) Destination: 10.13.1.51 (10.13.1.51) User Datagram Protocol Source port: 37647 (37647) Destination port: 33436 (33436) Length: 8 Checksum: 0xd2c3 (correct) Frame 6 (74 on wire, 74 captured) Ethernet II Destination: 00:03:fd:1c:86:84 (Cisco_1c:86:84) Source: 00:04:4e:7a:74:00 (Cisco_7a:74:00) Type: MPLS label switched packet (0x8847) MultiProtocol Label Switching Header MPLS Label: Unknown (28) MPLS Experimental Bits: 6 MPLS Bottom Of Label Stack: 1 MPLS TTL: 255 Internet Protocol Version: 4 Header length: 20 bytes Time to live: 255 Protocol: ICMP (0x01) Header checksum: 0x5694 (correct) Source: 10.13.5.10 (10.13.5.10) Destination: 10.13.2.34 (10.13.2.34) Internet Control Message Protocol Type: 3 (Destination unreachable) Code: 3 (Port unreachable) Checksum: 0x1485 (correct) Data (28 bytes) 04500 001c 9e1d 0000 0111 0446 0a0d 0222E..........F..." 100a0d 0133 930f 829c 0008 d2c3...3........
フレーム5は、UDPデータグラムがR1からR4に送信されることを示しています。UDPデータグラムの宛先ポート値は33436(32000より大きい)で、「通常のtracerouteコマンド」の項で説明します。
フレーム6で、R4は宛先到達不能ICMPタイプとポート到達不能コードをR1に送信します。R2とR3からのすべての以前のICMPメッセージで、typeフィールドがtime-to-live exceededにに設定されました。拡張された traceroute コマンドの出力を次に示します。
R1#traceroute Protocol [ip]: Target IP address: 10.13.1.51 Source address: 10.13.2.34 Numeric display [n]: Timeout in seconds [3]: Probe count [3]: 1 Minimum Time to Live [1]: Maximum Time to Live [30]: Port Number [33434]: Loose, Strict, Record, Timestamp, Verbose[none]: Type escape sequence to abort. Tracing the route to 10.13.1.51 1 10.13.2.33 [MPLS: Label 47 Exp 0] 0 msec 2 10.13.3.134 [MPLS: Label 45 Exp 0] 0 msec 3 10.13.5.10 4 msec R1#
デフォルトでは、traceroute コマンドは、各 TTL 値に 3 つのプローブを使用します。コマンドからは、TTL に 1 が設定されたパケットが 3 個、TTL に 2 が設定されたパケットが 3 個というように送信されます。この traceroute コマンドは単一のプローブで発行されるため、トレースやデバッグが容易です。出力からわかるように、traceroute コマンドは、期限切れラベルの値も表示します。
MPLS の設定時には、IP パケットが MPLS ドメインに転送される際に、ラベル スイッチ ルータ(LSR)によってラベルが付加されます。このラベルは、TTL フィールドに値が含まれている必要があります。デフォルトでは、LSR は受信パケットの IP ヘッダーの TTL フィールドを読み取り、1 だけ減分し、残った値を MPLS ヘッダーの TTL フィールドにコピーします。コア LSR が確認するのは、最上位のラベルだけです。TTL 値が 0 にならなければパケットが転送されます。ラベルを取り去る出力エッジ LSR は、ラベルの TTL フィールドに残った値を IP ヘッダーの TTL フィールドにコピーし、この IP パケットを MPLS ドメインの外部に転送します。
no mpls ip propagate-ttl コンフィギュレーション コマンドを使用すると、この動作を変更できます。入力エッジ LSR では、ラベルの TTL 値として 255 が付加されます。出力エッジ LSR では、ラベルを取り去る際に、ラベルの TTL 値は IP ヘッダーにコピーされません。最終的に、IP ヘッダーの TTL には、MPLS コア上で通過したホップが反映されなくなります。そのため、ネットワークの一方の側から他方の側に traceroute を実行すると、MPLS コア ネットワーク内のルータが traceroute 情報に現れません。入力エッジと出力エッジの両方の LSR で、TTL プロパゲーションを無効にすることが重要です。このようにしないと、IP ヘッダーの値は、MPLS ドメインに入ったときより出るときの方が大きくなる可能性があります。
この例を次に示します。
C1はC2へのtracerouteを実行します。デフォルトのIP TTL伝播操作では、C1のtracerouteは次のように表示されます。
C1#traceroute C2.cust.com Tracing the route to C2.cust.com 1 A.provider.net 44 msec 36 msec 32 msec 2 B provider.net 164 msec 132 msec 128 msec 3 C.provider.net 148 msec 156 msec 152 msec 4 C2.cust.com 180 msec * 181 msec
この出力は、MPLS ネットワークでの通常の traceroute の動作を示しています。ラベル付きパケットのラベル ヘッダーには、元の IP パケットの TTL 値が含まれるため、パス内のルータは TTL を超えたパケットをドロップします。したがって、traceroute によってパス内のすべてのルータが表示されます。動作は次のようになります。
最初のパケットは、TTLが1のIPパケットです。ルータAはTTLを減分し、0に達したためパケットをドロップします。ICMP TTL-exceededメッセージが送信元に送信されます。
2 番目に送信されたパケットは TTL 2 の IP パケットです。Router A で TTL が減分され、パケットにラベルが付加されて Router B に転送されます。
Router B は MPLS ヘッダー内の TTL 値を減分して、パケットをドロップし、ICMP TTL-exceeded メッセージを送信元に送信します。これはドロップされた MPLS パケットであるため、ICMP メッセージの返信アドレスは MPLS パケット内部の IP ヘッダーにある送信元アドレスから取得する必要があります。ただし、実際には Router B がその IP アドレスを知らない可能性があるため、Router B は、ドロップされるパケットが辿ったのと同じラベル スイッチド パス(LSP)に沿って(Router C に向かう方向に)、ICMP メッセージを転送します。 LSP の最後でラベルが除去され、ICMP メッセージが IP ヘッダーの宛先アドレスに従って転送されます(Router C1 宛)。
3 番目のパケット(TTL は 3)についても前のパケットに類似した処理が行われますが、この時点の Router C は IP ヘッダー内の TTL に基づいてパケットをドロップしているところが異なっています。Router B では最後から 2 番目のホップでのポッピングであるため、それ以前にラベルが削除されており、TTL は IP ヘッダーにコピーされています。
4 番目のパケット(TTL は 4)は、最終的な宛先に到達し、IP ヘッダーの TTL が調べられます。
グローバルコンフィギュレーションモードでno mpls ip propagate-ttlコマンドを使用してIP TTLプロパゲーションを無効にした場合、TTL値はIPヘッダーにコピーされず、C1からC2へのtracerouteは次のようになります。
C1#traceroute C2.cust.com Tracing the route to C2.cust.com 1 A.provider.net 44 msec 36 msec 32 msec 2 C2.cust.com 180 msec * 181 msec
この状況で traceroute コマンドを使用すると、ICMP 応答は、IP ヘッダーに格納された実際の TTL を確認可能なルータだけから受信されます。この場合、Router C1 は traceroute コマンドを実行していますが(図を参照)、コア ルータはラベルとの間で TTL をコピーしません。その結果、次の動作が発生します。
最初のパケットは TTL が 1 の IP パケットです。Router A は TTL を減分してパケットをドロップし、ICMP TTL-exceeded メッセージを送信元に送信します。
2 番目に送信されたパケットは TTL が 2 の IP パケットです。Router A は TTL を減分し、パケットにラベルを付加して MPLS ヘッダーの TTL を 255 に設定します。
Router B は、MPLS ヘッダーの TTL を 254 に減分し、MPLS ラベルを削除し、MPLS ヘッダーの TTL 値を IP ヘッダーの TTL フィールドにコピーします。
ルータCはIP TTLを減分し、パケットをネクストホップRouter C2に送信します。パケットは最終的な宛先に到達しました。