はじめに
MPLS LSP pingは、入力と出力間のラベルスイッチドパス(LSP)の状態を検証するために使用される基本ツールです。 このドキュメントの目的は、LSPツリートレースにおける発信側と応答側の間のマルチパス情報の相互作用について説明することです。このツールで使用できる詳細なオプションについては、このドキュメントを参照してください。
背景説明
MPLS EM:MPLS LSPマルチパスツリートレース機能のこの実装は、RFC 4379「Detecting Multi-Protocol Label Switched (MPLS) Data Plane Failures」に基づいています。
プローブパケットのIP宛先アドレスをループバックアドレス(127.x.x.x)として設定することにより、LSPツリートレースを使用して、パケットのIPルーティングを回避し、LSPの障害を検出できます。そのため、エンドツーエンドの接続の問題が発生した場合は、最初のステップとしてLSP Pingを使用してLSPの障害を排除すると便利です。
マルチパスのシナリオの場合、LSP pingはすべてのLSP障害の識別に必ずしも役立つとは限りません。すでに述べたように、複数の出力インターフェイスから送出できるラベル付きパケットを受信したラベルスイッチルータ(LSR)は、パケットから特定のキーを使用し、ハッシュアルゴリズムに入力して出力インターフェイスを決定します。ベンダーやハードウェアなどによって、ハッシュに関して次のオプションが考慮されます。
- 着信ラベルスタックのみ。
- 着信ラベルスタックとIPヘッダーの詳細(ペイロードがIPの場合)。
- 着信ラベルスタック、IPヘッダー、およびトランスポートヘッダーの詳細。
通常、Ciscoルータでは、スタックのサイズが3以下(IPをペイロードとする)の場合、ラベルスタックとIPヘッダーの組み合わせが考慮されます。
次のトポロジを想定します。
R1 ~ R7はルータです。上記のトポロジでは、次のようにR1からR5への等コストマルチパス(ECMP)ルートが3つあります。
パス1:R1-R2-R3-R4-R5
パス2:R1-R2-R6-R4-R5
パス3:R1-R2-R6-R7-R5
R6とR7の間に問題(破損したラベル配布プロトコル(LDP)やラベルのミスプログラミングなど)があり、これが原因で、R1からR5へのPATH3を経由するトラフィックがドロップすると仮定します。R1からのLSP pingがPATH1またはPATH2を使用する場合、R1とR5の間のパスが正常であると見なされてしまう可能性があります。
LSP pingでは、IP宛先アドレスを127.0.0.0/8の範囲の任意のアドレスに設定できます。1つの簡単なオプションは、異なる宛先アドレスで複数のpingパケットを手動で送信することですが、すべての可能なECMPパスが検証されるという保証はありません。送信元と宛先の間のすべての可能なパスを照会して検証する方法が必要です。LSPマルチパスツリートレースは、RFC4379のセクション3.3.1で定義されている「マルチパス情報エンコーディング」を利用し、すべてのECMPパスの検証に役立ちます。
LSPツリーのトレース – 仕組み
通常のMPLS pingまたはtracerouteは、中継ルータがECMP上でパケットをロードシェアリングする方法によっては障害がないことを示す場合がありますが、LSPツリートレースを使用すると、すべてのパスが実際に機能していることを検証するより優れた方法を提供できます。
LSPツリートレースでは、発信側ルータは先頭ラベルに1から始まる増分的な方法でTTLを設定することにより、MPLSエコー要求を各ホップに送信します。エコー要求は、IPアドレスの範囲(127.0.0.0/8の範囲内)またはエントロピーラベルの範囲を伝送するマルチパス情報(MPTLV)を伝送します。現在、シスコデバイスはIP宛先オプションをサポートしているため、この例ではIPアドレス範囲について詳しく説明します。
要求パケットを受信した各トランジットLSRは、すべてのECMP発信インターフェイスで応答し、各インターフェイスの要求からIPアドレスの範囲(またはエントロピーラベル)を関連付けます。
LSPツリーのトレース:詳細な例
次のトポロジを例として考えます。
わかりやすくするために、この例では127.0.0.0 ~ 127.0.0.200のアドレス範囲を使用しています。LSPツリートレースの手順の詳細を次に示します。
1)発信側(R1)が次の詳細情報を含むエコー要求を送信します。
- 127.0.0.0としてIP宛先
- 127.0.0.0 ~ 127.0.0.200のアドレス範囲を伝送するマルチパス情報TLV。
- トップラベルのTTLは1に設定されます。
2)R2は同じものを受信すると、各出力インターフェイスに対してマルチパス情報を使用して応答します。この例では、次のように応答します。
- IPの宛先が127.0.0.0から127.0.0.100の範囲内である場合、パケットはR3に送信されます。
- IP宛先が127.0.0.101から127.0.0.200の間の場合、パケットはR6に送信されます。
3) R1は2つのECMPパスが存在することを認識するため、TTLを2に設定して2つのエコー要求を送信する必要があります。さまざまなテストから、イニシエータが次に進む前に常に1つのパスで終了することが確認されました。(ただし、これは特定の実装に当てはまる場合があります)。
4) R1は次の詳細情報を含むエコー要求を送信します。
- 127.0.0.0としてIP宛先
- 127.0.0.0 ~ 127.0.0.100のアドレス範囲を伝送するマルチパス情報TLV。
- トップラベルのTTLは2に設定されます。
5) R2はパケットをR3に転送します(宛先アドレスが127.0.0.0であるため)。出力インターフェイスが1つしかないため、同じものを受信したR3は同じマルチパス情報で応答します。
R5に到達するまで同じことが言えます。
6) PATH1トレースが完了したら(出力からの応答を受信した後)、イニシエータはPATH2に対してクエリーを実行します。これは、次の詳細を含むエコー要求を送信することで実行されます。
- 127.0.0.101としてIP宛先
- 127.0.0.101 ~ 127.0.0.200のアドレス範囲を伝送するマルチパス情報TLV
- 最上位ラベルのTTLは2に設定されます。
7) R2はパケットをR6に転送します(宛先アドレスが127.0.0.101であるため)。同じものを受信したR6は、次のようにマルチパス情報で応答します。
- IPの宛先が127.0.0.101から127.0.0.150の間の場合、パケットはR4に送信されます。
- IP宛先が127.0.0.151 ~ 127.0.0.200の範囲内である場合、パケットはR7に送信されます。
8) R1は、可能なパスの合計を3に設定するECMPパスがもう1つあることを認識します。R1は次の詳細を含む次のエコー要求を送信してPATH2へのクエリーを続行します。
- 127.0.0.101としてIP宛先
- 127.0.0.101 ~ 127.0.0.150のアドレス範囲を伝送するマルチパス情報TLV
- トップラベルのTTLは3に設定されます。
9) R2はパケットをR6(宛先が127.0.0.101)に転送し、R6はパケットをR4(宛先が127.0.0.101)に転送します。R4にはECMPパスがないため、同じマルチパス情報で応答します。次のパケットは出力R5に到達します。
10) PATH2トレースが完了したので、R1はPATH3のクエリを続行します。これは、次の詳細を含むエコー要求を送信することで実行されます。
- 127.0.0.151としてIP宛先
- 127.0.0.151 ~ 127.0.0.200のアドレス範囲を伝送するマルチパス情報TLV
- トップラベルのTTLは3に設定されます。
11) R2はパケットをR6に転送し、次にR7に転送します。R7は同じマルチパス情報TLVで応答します。次のパケットは出力ルータR5に到達します。
これらの手順が完了すると、R1は次の詳細情報を取得します。
127.0.0.0および127.0.0.100内の宛先アドレスを使用すると、パケット転送はPATH1を介して行われ、他の範囲のアドレスを使用すると、パケットは各パスを介して転送されます。
12)イニシエータは、TTLが255に設定された3つのエコー要求パケットを送信し、すべてのパスがエンドツーエンドで検証されるように各範囲からアドレスを選択します。
ECMPトレースに使用するコマンドは、traceroute mpls multipath ipv4 <prefix> <mask>です。次に出力例を示します。
R1#traceroute mpls multipath ipv4 10.1.5.5 255.255.255.255
Starting LSP Multipath Traceroute for 10.1.5.5/32
Codes: '!' - success, 'Q' - request not sent, '.' - timeout,
'L' - labeled output interface, 'B' - unlabeled output interface,
'D' - DS Map mismatch, 'F' - no FEC mapping, 'f' - FEC mismatch,
'M' - malformed request, 'm' - unsupported tlvs, 'N' - no label entry,
'P' - no rx intf label prot, 'p' - premature termination of LSP,
'R' - transit router, 'I' - unknown upstream index,
'l' - Label switched with FEC change, 'd' - see DDMAP for return code,
'X' - unknown return code, 'x' - return code 0
Type escape sequence to abort.
LLL!
Path 0 found,
output interface Et0/0.12 nexthop 10.1.12.2
source 10.1.12.1 destination 127.0.0.4
LL!
Path 1 found,
output interface Et0/0.12 nexthop 10.1.12.2
source 10.1.12.1 destination 127.0.0.2
L!
Path 2 found,
output interface Et0/0.12 nexthop 10.1.12.2
source 10.1.12.1 destination 127.0.0.0
Paths (found/broken/unexplored) (3/0/0)
Echo Request (sent/fail) (9/0)
Echo Reply (received/timeout) (9/0)
Total Time Elapsed 27 ms
上記の出力は、3つのパスがあり、すべてのパスが正常に機能していることを示しています。上記のコマンドでverboseノブを使用すると、次のようにすべてのホップが表示されます。
R1#traceroute mpls multipath ipv4 10.1.5.5 255.255.255.255 verbose
Starting LSP Multipath Traceroute for 10.1.5.5/32
Codes: '!' - success, 'Q' - request not sent, '.' - timeout,
'L' - labeled output interface, 'B' - unlabeled output interface,
'D' - DS Map mismatch, 'F' - no FEC mapping, 'f' - FEC mismatch,
'M' - malformed request, 'm' - unsupported tlvs, 'N' - no label entry,
'P' - no rx intf label prot, 'p' - premature termination of LSP,
'R' - transit router, 'I' - unknown upstream index,
'l' - Label switched with FEC change, 'd' - see DDMAP for return code,
'X' - unknown return code, 'x' - return code 0
Type escape sequence to abort.
LLL!
Path 0 found,
output interface Et0/0.12 nexthop 10.1.12.2
source 10.1.12.1 destination 127.0.0.4
0 10.1.12.1 10.1.12.2 MRU 1500 [Labels: 22 Exp: 0] multipaths 0
L 1 10.1.12.2 10.1.23.3 MRU 1500 [Labels: 23 Exp: 0] ret code 8 multipaths 2
L 2 10.1.23.3 10.1.34.4 MRU 1500 [Labels: 22 Exp: 0] ret code 8 multipaths 1
L 3 10.1.34.4 10.1.45.5 MRU 1500 [Labels: implicit-null Exp: 0] ret code 8 multipaths 1
! 4 10.1.45.5, ret code 3 multipaths 0
LL!
Path 1 found,
output interface Et0/0.12 nexthop 10.1.12.2
source 10.1.12.1 destination 127.0.0.2
0 10.1.12.1 10.1.12.2 MRU 1500 [Labels: 22 Exp: 0] multipaths 0
L 1 10.1.12.2 10.1.26.6 MRU 1500 [Labels: 16 Exp: 0] ret code 8 multipaths 2
L 2 10.1.26.6 10.1.46.4 MRU 1500 [Labels: 22 Exp: 0] ret code 8 multipaths 2
L 3 10.1.46.4 10.1.45.5 MRU 1500 [Labels: implicit-null Exp: 0] ret code 8 multipaths 1
! 4 10.1.45.5, ret code 3 multipaths 0
L!
Path 2 found,
output interface Et0/0.12 nexthop 10.1.12.2
source 10.1.12.1 destination 127.0.0.0
0 10.1.12.1 10.1.12.2 MRU 1500 [Labels: 22 Exp: 0] multipaths 0
L 1 10.1.12.2 10.1.26.6 MRU 1500 [Labels: 16 Exp: 0] ret code 8 multipaths 2
L 2 10.1.26.6 10.1.67.7 MRU 1500 [Labels: 17 Exp: 0] ret code 8 multipaths 2
L 3 10.1.67.7 10.1.57.5 MRU 1500 [Labels: implicit-null Exp: 0] ret code 8 multipaths 1
! 4 10.1.57.5, ret code 3 multipaths 0
Paths (found/broken/unexplored) (3/0/0)
Echo Request (sent/fail) (9/0)
Echo Reply (received/timeout) (9/0)
Total Time Elapsed 29 ms