IS-ISのIPv6対応とマルチトポロジ(TLV 236 / MT ID 2)
IS-ISはIPv6の経路も運べます。OSPFがIPv6対応にあたってOSPFv3という別のプロトコルになったのに対し、 IS-ISは新しいTLVを足すだけで済みました。
ただし、IPv4とIPv6を1つのトポロジとして扱うと、IPv6を有効にしていないリンクが混ざったときに 経路が破綻します。これを避けるのがマルチトポロジです。この記事では、IS-ISがIPv6をどう表すか、 シングルトポロジとマルチトポロジで何が変わるかを、IOS XRの実機で確かめます。
IS-ISがIPv6を運べる理由
IS-ISはIPのためのプロトコルではありません。OSI参照モデルのCLNPのために作られたルーティングプロトコルで、 IPの経路はTLV(Type-Length-Value)という可変長の入れ物に入れて運びます(IS-ISの基本は IS-ISとは、TLVの詳細はIS-ISの主要TLVで解説しています)。
運ぶ経路の種類はTLVの番号で決まるので、IPv6を運びたければIPv6用のTLVを定義すればよいことになります。 実際 RFC 5308 はTLVを2つ足しただけで、 PDUの形式もSPFの計算方法も変えていません。
IPv6の到達性を表すTLV
| TLV | 名前 | 内容 |
|---|---|---|
| 236(0xEC) | IPv6 Reachability | IPv6のプレフィックスとメトリック |
| 232(0xE8) | IPv6 Interface Address | そのルータのIPv6インタフェースアドレス |
TLV 236の構造は次のとおりです。メトリックは32ビットで、2行にまたがって並びます。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 236 | Length | Metric .. |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| .. Metric |U|X|S| Reserve | Prefix Len |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Prefix ...フラグは3つです。
| ビット | 名前 | 意味 |
|---|---|---|
| U | up/down bit | 上位レベルから下位レベルへ配られた経路(ルートリークで使う) |
| X | external original bit | 他のプロトコルから再配布された経路 |
| S | sub-TLV present bit | サブTLVが続くかどうか |
メトリックが32ビットなので、IPv6を運ぶには拡張メトリック(wide)が前提になります。narrowの6ビットメトリックは
IPv4用のTLV 128 / 130でしか使えません(IS-ISのメトリックで解説しています)。
経路の上限値 MAX_V6_PATH_METRIC は 0xFE000000 で、SPFの途中でこれを超えた経路はこの値に丸められます。
リンクローカルアドレスはTLV 236で広告してはいけないと定められています。
シングルトポロジとその限界
TLVを足しただけなので、LSPは1種類のままです。1台のルータは1つのLSPにIPv4の経路(TLV 135)と IPv6の経路(TLV 236)を並べて入れ、受け取った側は1回のSPF計算で両方の経路を求めます。 これがシングルトポロジ(ST)です。
シンプルですが、IPv4とIPv6が同じトポロジであることが前提になります。SPFが使うのは 「どのルータとどのルータが隣接しているか」の情報(TLV 22)だけで、そこにIPv4とIPv6の区別がありません。
IPv6への移行は普通、一部の区間から順に進めます。つまり移行期はほぼ必ずトポロジが一致しません。
マルチトポロジ
RFC 5120 は、トポロジを複数持てるようにして この問題を解決します。トポロジにはMT IDという番号が付き、SPFはMT IDごとに独立して回ります。
| MT ID | 用途 |
|---|---|
| 0 | 標準トポロジ(IPv4) |
| 1 | IPv4のインバンド管理用 |
| 2 | IPv6ルーティングトポロジ |
| 3 / 4 | IPv4 / IPv6のマルチキャスト用 |
| 5 | IPv6のインバンド管理用 |
MTでは、既存のTLVにMT IDを2バイト前置した専用のTLVを使います。
| TLV | 名前 | 対応する非MTのTLV |
|---|---|---|
| 229 | Multi-Topology | —(所属するトポロジを通知する) |
| 222 | MT Intermediate Systems | 22(拡張IS到達性) |
| 235 | MT Reachable IPv4 Prefixes | 135(拡張IP到達性) |
| 237 | MT Reachable IPv6 Prefixes | 236(IPv6到達性) |
所属するトポロジはIIH(Helloパケット)のTLV 229で相手に伝えます。ただし MT ID 0だけの場合はTLV 229を省略してもよいと定められています。
隣接を張るかどうかの扱いは、リンクの種別で分かれます。
| リンク種別 | 規定 |
|---|---|
| point-to-point | 共通のMTが1つも無ければ隣接を張るべきでない(SHOULD NOT、2.1) |
| ブロードキャスト | 共通のMTが無くても常に隣接を張る(SHALL、2.2) |
ブロードキャストで常に張るのは、同じLANのルータがDIS(DISと疑似ノード)を通じて 一貫した疑似ノードLSPを作れるようにするためです。この記事の検証はすべてpoint-to-pointで行ったため、 ブロードキャストの挙動は観測していません。
IOS XRでの設定
IOS XRの既定はマルチトポロジです。address-family ipv6 unicast を足すだけでMTになり、
LSPにはTLV 229 / 222 / 237が載ります。シングルトポロジにしたい場合は single-topology を明示します。
router isis 1
address-family ipv6 unicast
metric-style wide
!
interface GigabitEthernet0/0/0/0
address-family ipv6 unicast
metric 10
!
!
!IOS XRでは、隣接を張るかどうかがインタフェースに設定したトポロジで決まります。 シングルトポロジにしたうえでインタフェースからIPv6を外すと、そのインタフェースは どのトポロジにも参加できなくなり、IPv4も含めて隣接が落ちます。
実機での検証
検証環境
XRd(IOS XR 26.1.1)4台の四角形です。単一エリア 49.0001、全台 level-2-only、全リンクpoint-to-point、
metric-style wide で、R1-R4のリンクだけメトリック100にしてあります。
R1-R4を100にしたのは、四角形のままだとR1からR3への経路が20対20の等コストになり、 経路が変わったことをtracerouteで示せないためです。この構成では、IPv4は必ずR1-R2-R3(合計20)を通ります。 IPv6がR2-R3を使えないときだけ、R1-R4-R3(合計110)へ変わります。
| ルータ | Lo0(IPv4) | Lo1(IPv6) |
|---|---|---|
| R1 | 1.1.1.1/32 | 2001:db8:1::1/128 |
| R2 | 2.2.2.2/32 | 2001:db8:2::2/128 |
| R3 | 3.3.3.3/32 | 2001:db8:3::3/128 |
| R4 | 4.4.4.4/32 | 2001:db8:4::4/128 |
観測はR1とR3の間で行い、各STEPでIPv4とIPv6の両方の ping と traceroute を取得しています。
検証のSTEP
| STEP | 操作 | 確かめること |
|---|---|---|
| 0 | IPv4のみ(初期状態) | IPv4の経路とLSPの中身 |
| 1 | 全台・全リンクでIPv6を有効化 | 既定でMTになること(TLV 229 / 222 / 237) |
| 2 | 全台でsingle-topology | TLVが236 / 232に変わること |
| 3 | R2-R3のIPv6を外す(STのまま) | STではその区間が使えなくなること |
| 4 | 全台でsingle-topologyを外す(MTへ) | IPv6だけが迂回して疎通が戻ること |
| 5 | R2-R3のIPv6を戻す | 両トポロジが一致し最短に戻ること |
| 6 | R2だけsingle-topologyに戻す | ルータ間で設定が食い違ったときの壊れ方 |
| 7 | R2をMTに戻す | 復旧すること |
| 8 | R1-R4を共通MTの無いリンクにする | 隣接が上がらないこと(RFC 5120の2.1) |
| 9 | R1-R4を戻す | 復旧すること |
| 10 | R1-R2のIPv6メトリックを1000にする | トポロジごとに別の経路を引けること |
LSPの中身はST / MTで変わる(STEP 1・2)
STEP 1で address-family ipv6 unicast を足しただけの状態です。R1のLSPに MT: の行が2つ並び、
IPv6の経路とIS到達性が MT (IPv6 Unicast) として載ります。IOS XRの既定はマルチトポロジです。
R1.00-00 * 0x0000000b 0xa55e 1100 /* 0/0/0
Area Address: 49.0001
LSP MTU: 1492
NLPID: 0xcc
NLPID: 0x8e
MT: Standard (IPv4 Unicast)
MT: IPv6 Unicast 0/0/0
IP Address: 1.1.1.1
IPv6 Address: 2001:db8:1::1
Hostname: R1
Metric: 10 IS-Extended R2.00
Metric: 100 IS-Extended R4.00
Metric: 10 MT (IPv6 Unicast) IS-Extended R2.00
Metric: 100 MT (IPv6 Unicast) IS-Extended R4.00
Metric: 0 IP-Extended 1.1.1.1/32
Metric: 10 IP-Extended 10.0.12.0/24
Metric: 100 IP-Extended 10.0.14.0/24
Metric: 10 MT (IPv6 Unicast) IPv6 2001:db8:0:12::/64
Metric: 100 MT (IPv6 Unicast) IPv6 2001:db8:0:14::/64キャプチャーでも同じです。添付のSTEP 1のR1-R2間のNo.103がR1のLSPで、 TLV 229・222・232・237が入っています。TLV 229には所属する2つのトポロジが並びます。
Multi Topology (t=229, l=4)
Type: 229
Length: 4
IPv4 Unicast Topology (0x000)
IPv6 Unicast Topology (0x002)STEP 2で single-topology を入れると、MT: の行とMT付きの経路が消え、
IPv6のプレフィックスがTLV 236として素のまま並びます。
R1.00-00 * 0x00000010 0xd251 1094 /* 0/0/0
Area Address: 49.0001
LSP MTU: 1492
NLPID: 0xcc
NLPID: 0x8e
IP Address: 1.1.1.1
IPv6 Address: 2001:db8:1::1
Hostname: R1
Metric: 10 IS-Extended R2.00
Metric: 100 IS-Extended R4.00
Metric: 0 IP-Extended 1.1.1.1/32
Metric: 10 IP-Extended 10.0.12.0/24
Metric: 100 IP-Extended 10.0.14.0/24
Metric: 10 IPv6 2001:db8:0:12::/64
Metric: 100 IPv6 2001:db8:0:14::/64
Metric: 0 IPv6 2001:db8:1::1/128トポロジが一致しないとき(STEP 3・4)
STEP 3では、シングルトポロジのままR2-R3のIPv6を外しました。このリンクはIS-ISから完全に外れます。 理由は装置が表示します。
GigabitEthernet0/0/0/1 Enabled
Adjacency Formation: Disabled (No cfg topology can participate)
Prefix Advertisement: Enabled
Bandwidth: 1000000
Circuit Type: level-2-only (Configured: level-1-2)
Media Type: P2P
Circuit Number: 0隣接が落ちるので、IPv4の経路もこのリンクを使えなくなります。R1からR3へのtracerouteは、 IPv4もIPv6もR4経由に変わりました。
RP/0/RP0/CPU0:R1#traceroute 3.3.3.3 source 1.1.1.1 timeout 1 probe 2 maxttl 4
Type escape sequence to abort.
Tracing the route to 3.3.3.3
1 10.0.14.4 11 msec 6 msec
2 10.0.34.3 11 msec * STEP 4で single-topology を外すと隣接が戻り、IPv4とIPv6が別の経路を通るようになります。
IPv4は最短のR1-R2-R3、IPv6はR2-R3にIPv6が無いためR1-R4-R3です。
RP/0/RP0/CPU0:R1#traceroute 3.3.3.3 source 1.1.1.1 timeout 1 probe 2 maxttl 4
Type escape sequence to abort.
Tracing the route to 3.3.3.3
1 10.0.12.2 7 msec 5 msec
2 10.0.23.3 10 msec * RP/0/RP0/CPU0:R1#traceroute ipv6 2001:db8:3::3 source 2001:db8:1::1 timeout 1 probe 2 maxttl 4
Type escape sequence to abort.
Tracing the route to 2001:db8:3::3
1 2001:db8:0:14::4 8 msec 6 msec
2 2001:db8:3::3 13 msec 11 msec同じ物理構成のまま、アドレスファミリごとに別のトポロジでSPFが回っています。これがマルチトポロジの働きです。
ルータ間で設定が食い違うと(STEP 6)
STEP 6では、R2だけをシングルトポロジに戻しました。R2はIPv6のトポロジから消えます。
R1のIPv6ルーティングテーブルにはR3とR4のループバックは残るのに、
R2自身の2001:db8:2::2/128が無くなります。
i L2 2001:db8:0:23::/64
[115/120] via fe80::5054:ff:fe8f:a536, 00:01:45, GigabitEthernet0/0/0/1
i L2 2001:db8:0:34::/64
[115/110] via fe80::5054:ff:fe8f:a536, 00:01:45, GigabitEthernet0/0/0/1
L 2001:db8:1::1/128 is directly connected,
00:20:31, Loopback1
i L2 2001:db8:3::3/128
[115/110] via fe80::5054:ff:fe8f:a536, 00:01:45, GigabitEthernet0/0/0/1
i L2 2001:db8:4::4/128
[115/100] via fe80::5054:ff:fe8f:a536, 00:01:45, GigabitEthernet0/0/0/1IPv4は最短のR1-R2-R3のままで、IPv6だけがR2を避けて回り道をします。 移行期に1台だけ設定を変え忘れると、この形の障害になります。
共通のMTが無いリンクでは隣接が上がらない(STEP 8)
STEP 8では、R1-R4のリンクをR1側はIPv6だけ、R4側はIPv4だけでIS-ISに入れました。 共通のトポロジが1つも無い状態です。隣接はsyslogの理由つきで落ちます。
RP/0/RP0/CPU0:Sep 20 15:44:20.621 UTC: isis[1003]: %ROUTING-ISIS-5-ADJCHANGE : ISIS (1): Adjacency to R4 (GigabitEthernet0/0/0/1) (L2) Down, No common topology No common topology はRFC 5120の2.1がそのままメッセージになったものです。キャプチャーでも確認できます。
R1のIIHはTLV 229でIPv6のトポロジだけを通知し(No.11)、R4のIIHにはTLV 229そのものがありません(No.12)。
MT ID 0だけのときはTLV 229を省略してよいという規定どおりで、結果として共通のトポロジがありません。
IPv6 Interface address(es) (t=232, l=16)
Type: 232
Length: 16
IPv6 interface address: fe80::5054:ff:fef9:cbbf
IPv6 Global Interface Address (t=233, l=16)
Type: 233
Length: 16
IPv6 Global interface address: 2001:db8:0:14::1
Multi Topology (t=229, l=2)
Type: 229
Length: 2
IPv6 Unicast Topology (0x002)
Unknown code (t=21, l=4) Area address(es) (t=1, l=4)
Type: 1
Length: 4
Area address (3): 49.0001
IP Interface address(es) (t=132, l=4)
Type: 132
Length: 4
IPv4 interface address: 10.0.14.4
Unknown code (t=21, l=4) 上のtshark出力のパケット(No.11 IIH)のpcapをダウンロード
対向のIIH(No.12、TLV 229 なし)のpcapをダウンロード
トポロジごとに別のメトリックを持てる(STEP 10)
MTではトポロジごとにメトリックを別に持てます。STEP 10では、R1-R2のリンクのIPv6のメトリックだけを 1000にしました。両方のアドレスファミリが全リンクで有効なままでも、経路が分かれます。
router isis 1
interface GigabitEthernet0/0/0/0
address-family ipv6 unicast
metric 1000
!
!
!RP/0/RP0/CPU0:R1#traceroute 3.3.3.3 source 1.1.1.1 timeout 1 probe 2 maxttl 4
Type escape sequence to abort.
Tracing the route to 3.3.3.3
1 10.0.12.2 7 msec 5 msec
2 10.0.23.3 61 msec * RP/0/RP0/CPU0:R1#traceroute ipv6 2001:db8:3::3 source 2001:db8:1::1 timeout 1 probe 2 maxttl 4
Type escape sequence to abort.
Tracing the route to 2001:db8:3::3
1 2001:db8:0:14::4 6 msec 6 msec
2 2001:db8:3::3 11 msec 9 msecIPv4とIPv6で使う回線を分けたい、片方だけ広帯域の経路に寄せたい、といった運用ができます。
検証Configおよびshow結果
各STEPで4台すべてから取得しています。検証Configはこの..._run.txtです(最終状態は最後のSTEPのもの)。
| ファイル | 内容 |
|---|---|
..._show.txt | show version / show interface description / show route / show route ipv6 / show isis / show isis interface / show isis neighbors detail / show isis topology / show isis database detail / show isis spf-log ほか |
..._ping.txt | R1とR3から、IPv4とIPv6のping(50発)とtraceroute |
..._clear.txt | そのSTEPでクリアしたカウンタ(clear counters interface)の記録 |
..._log.txt | そのSTEPの範囲だけに絞ったshow logging |
..._run.txt | そのSTEP時点のshow running-config(=そのSTEPの検証Config) |
..._commit.cfg | そのSTEPで実際にcommitされた設定だけ |
..._trace.txt | show isis trace all | include ADJ。トレースバッファは起動時から累積するので、最後のSTEP 10のものが全STEPぶんを含んでいる(1ファイル400KB超のため、STEP 10の4台分だけを添付) |
STEP 0:IPv4のみ(初期状態)
| ルータ | show出力 | ping | clear | syslog | running-config |
|---|---|---|---|---|---|
| R1 | show | ping | clear | log | run |
| R2 | show | — | clear | log | run |
| R3 | show | ping | clear | log | run |
| R4 | show | — | clear | log | run |
STEP 1:全台・全リンクでIPv6を有効化
| ルータ | show出力 | ping | 投入した設定 | syslog | running-config |
|---|---|---|---|---|---|
| R1 | show | ping | commit | log | run |
| R2 | show | — | commit | log | run |
| R3 | show | ping | commit | log | run |
| R4 | show | — | commit | log | run |
STEP 2:全台でsingle-topology
| ルータ | show出力 | ping | 投入した設定 | syslog | running-config |
|---|---|---|---|---|---|
| R1 | show | ping | commit | log | run |
| R2 | show | — | commit | log | run |
| R3 | show | ping | commit | log | run |
| R4 | show | — | commit | log | run |
STEP 3:R2-R3のIPv6を外す(STのまま)
| ルータ | show出力 | ping | 投入した設定 | syslog | running-config |
|---|---|---|---|---|---|
| R1 | show | ping | — | log | run |
| R2 | show | — | commit | log | run |
| R3 | show | ping | commit | log | run |
| R4 | show | — | — | log | run |
STEP 4:全台でsingle-topologyを外す(MTへ)
| ルータ | show出力 | ping | 投入した設定 | syslog | running-config |
|---|---|---|---|---|---|
| R1 | show | ping | commit | log | run |
| R2 | show | — | commit | log | run |
| R3 | show | ping | commit | log | run |
| R4 | show | — | commit | log | run |
STEP 5:R2-R3のIPv6を戻す
| ルータ | show出力 | ping | 投入した設定 | syslog | running-config |
|---|---|---|---|---|---|
| R1 | show | ping | — | log | run |
| R2 | show | — | commit | log | run |
| R3 | show | ping | commit | log | run |
| R4 | show | — | — | log | run |
STEP 6:R2だけsingle-topologyに戻す
| ルータ | show出力 | ping | 投入した設定 | syslog | running-config |
|---|---|---|---|---|---|
| R1 | show | ping | — | log | run |
| R2 | show | — | commit | log | run |
| R3 | show | ping | — | log | run |
| R4 | show | — | — | log | run |
STEP 7:R2をMTに戻す
| ルータ | show出力 | ping | 投入した設定 | syslog | running-config |
|---|---|---|---|---|---|
| R1 | show | ping | — | log | run |
| R2 | show | — | commit | log | run |
| R3 | show | ping | — | log | run |
| R4 | show | — | — | log | run |
STEP 8:R1-R4を共通MTの無いリンクにする
| ルータ | show出力 | ping | 投入した設定 | syslog | running-config |
|---|---|---|---|---|---|
| R1 | show | ping | commit | log | run |
| R2 | show | — | — | log | run |
| R3 | show | ping | — | log | run |
| R4 | show | — | commit | log | run |
STEP 9:R1-R4を戻す
| ルータ | show出力 | ping | 投入した設定 | syslog | running-config |
|---|---|---|---|---|---|
| R1 | show | ping | commit | log | run |
| R2 | show | — | — | log | run |
| R3 | show | ping | — | log | run |
| R4 | show | — | commit | log | run |
STEP 10:R1-R2のIPv6メトリックを1000にする(最終状態)
| ルータ | show出力 | ping | 投入した設定 | syslog | running-config | trace |
|---|---|---|---|---|---|---|
| R1 | show | ping | commit | log | run | trace |
| R2 | show | — | commit | log | run | trace |
| R3 | show | ping | — | log | run | trace |
| R4 | show | — | — | log | run | trace |
パケットキャプチャーはSTEPごとに取得しています。
| STEP | R1-R2間 | R2-R3間 | R1-R4間 |
|---|---|---|---|
| 0 | pcap | pcap | pcap |
| 1 | pcap | pcap | pcap |
| 2 | pcap | pcap | pcap |
| 3 | pcap | pcap | pcap |
| 4 | pcap | pcap | pcap |
| 5 | pcap | pcap | pcap |
| 6 | pcap | pcap | pcap |
| 7 | pcap | pcap | pcap |
| 8 | pcap | pcap | pcap |
| 9 | pcap | pcap | pcap |
| 10 | pcap | pcap | pcap |
参考
| 標準 | タイトル | 概要 |
|---|---|---|
| RFC 5308 | Routing IPv6 with IS-IS | TLV 236(IPv6 Reachability)とTLV 232(IPv6 Interface Address)を定義する。メトリックは32ビットで、U(up/down)・X(external original)・S(sub-TLV present)の3ビットを持つ。MAX_V6_PATH_METRICは0xFE000000。リンクローカルアドレスの広告を禁じている。 |
| RFC 5120 | M-ISIS: Multi Topology (MT) Routing in Intermediate System to Intermediate Systems (IS-ISs) | TLV 229 / 222 / 235 / 237とMT IDを定義する。7.5節でMT ID 0を標準トポロジ、MT ID 2をIPv6ルーティングトポロジと予約している。2.1節でpoint-to-pointは共通のMTが無ければ隣接を張るべきでないとし、2.2節でブロードキャストは共通のMTが無くても常に張るとしている。 |
関連記事
- IS-ISとは
- IS-ISのNSAPアドレスとNET(System ID)
- IS-ISのレベル1とレベル2(階層構造)
- IS-ISパケットの種類とヘッダーフォーマット
- IS-ISの隣接関係の確立と状態遷移
- IS-ISのDISと疑似ノード(Pseudonode)
- IS-ISのネットワークタイプ(broadcast / point-to-point)
- IS-ISのメトリック(narrow / wide)
- IS-ISの認証(hello-password / lsp-password)
- IS-ISのLSPとリンクステートデータベース
- IS-ISの主要TLV
- IS-ISのフラッディングとLSDB同期
- IS-ISのSPF計算と経路選択
- IS-ISのATTビットとレベル1のデフォルトルート
- IS-ISのルートリークとup/downビット
- IS-ISの経路集約
- IS-ISのオーバーロードビット
- IS-ISのIPv6対応とマルチトポロジ(TLV 236 / MT ID 2)
- IS-ISのHelloとHolding Time
- IS-ISの収束タイマー(SPF / LSP生成)
- IS-ISのフラッディングのタイマー(LSP送信間隔・再送・CSNP / PSNP)
- IS-ISへの再配布(connected / static)
- IS-ISへのBGP経路の再配布