メインコンテンツへスキップ
  1. ネットワーク 記事一覧/
  2. IS-IS記事一覧/

IS-ISのIPv6対応とマルチトポロジ(TLV 236 / MT ID 2)

目次

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 ReachabilityIPv6のプレフィックスとメトリック
232(0xE8)IPv6 Interface AddressそのルータのIPv6インタフェースアドレス

TLV 236の構造は次のとおりです。メトリックは32ビットで、2行にまたがって並びます。

RFC 5308 の IPv6 Reachability TLV(236)
   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つです。

ビット名前意味
Uup/down bit上位レベルから下位レベルへ配られた経路(ルートリークで使う)
Xexternal original bit他のプロトコルから再配布された経路
Ssub-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)
1IPv4のインバンド管理用
2IPv6ルーティングトポロジ
3 / 4IPv4 / IPv6のマルチキャスト用
5IPv6のインバンド管理用

MTでは、既存のTLVにMT IDを2バイト前置した専用のTLVを使います。

TLV名前対応する非MTのTLV
229Multi-Topology—(所属するトポロジを通知する)
222MT Intermediate Systems22(拡張IS到達性)
235MT Reachable IPv4 Prefixes135(拡張IP到達性)
237MT Reachable IPv6 Prefixes236(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 を明示します。

IOS XR の IS-IS で IPv6 を有効にする
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にしてあります。

IS-ISのIPv6対応とマルチトポロジの検証構成

R1-R4を100にしたのは、四角形のままだとR1からR3への経路が20対20の等コストになり、 経路が変わったことをtracerouteで示せないためです。この構成では、IPv4は必ずR1-R2-R3(合計20)を通ります。 IPv6がR2-R3を使えないときだけ、R1-R4-R3(合計110)へ変わります。

ルータLo0(IPv4)Lo1(IPv6)
R11.1.1.1/322001:db8:1::1/128
R22.2.2.2/322001:db8:2::2/128
R33.3.3.3/322001:db8:3::3/128
R44.4.4.4/322001:db8:4::4/128

観測はR1とR3の間で行い、各STEPでIPv4とIPv6の両方の pingtraceroute を取得しています。

検証のSTEP

STEP操作確かめること
0IPv4のみ(初期状態)IPv4の経路とLSPの中身
1全台・全リンクでIPv6を有効化既定でMTになること(TLV 229 / 222 / 237)
2全台でsingle-topologyTLVが236 / 232に変わること
3R2-R3のIPv6を外す(STのまま)STではその区間が使えなくなること
4全台でsingle-topologyを外す(MTへ)IPv6だけが迂回して疎通が戻ること
5R2-R3のIPv6を戻す両トポロジが一致し最短に戻ること
6R2だけsingle-topologyに戻すルータ間で設定が食い違ったときの壊れ方
7R2をMTに戻す復旧すること
8R1-R4を共通MTの無いリンクにする隣接が上がらないこと(RFC 5120の2.1)
9R1-R4を戻す復旧すること
10R1-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の既定はマルチトポロジです。

STEP 1:R1のLSP(既定=マルチトポロジ)
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つのトポロジが並びます。

STEP 1 No.103:R1のLSPのTLV 229(tshark -V)
    Multi Topology (t=229, l=4)
        Type: 229
        Length: 4
        IPv4 Unicast Topology (0x000)
        IPv6 Unicast Topology (0x002)
上のtshark出力のパケット(No.103 LSP)のpcapをダウンロード

STEP 2で single-topology を入れると、MT: の行とMT付きの経路が消え、 IPv6のプレフィックスがTLV 236として素のまま並びます。

STEP 2:R1のLSP(single-topology)
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 2のR1のLSP(No.46、TLV 236)のpcapをダウンロード

トポロジが一致しないとき(STEP 3・4)

STEP 3では、シングルトポロジのままR2-R3のIPv6を外しました。このリンクはIS-ISから完全に外れます。 理由は装置が表示します。

STEP 3:R2のGi0/0/0/1(single-topology のままIPv6を外した)
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経由に変わりました。

STEP 3:R1からR3へ(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です。

STEP 4:R1からR3へ(IPv4)
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  * 
STEP 4:R1からR3へ(IPv6)
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が無くなります

STEP 6:R1のIPv6経路の末尾(R2だけsingle-topology)
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/1

IPv4は最短のR1-R2-R3のままで、IPv6だけがR2を避けて回り道をします。 移行期に1台だけ設定を変え忘れると、この形の障害になります。

共通のMTが無いリンクでは隣接が上がらない(STEP 8)

STEP 8では、R1-R4のリンクをR1側はIPv6だけ、R4側はIPv4だけでIS-ISに入れました。 共通のトポロジが1つも無い状態です。隣接はsyslogの理由つきで落ちます。

STEP 8:R1の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を省略してよいという規定どおりで、結果として共通のトポロジがありません。

STEP 8 No.11:R1のIIH(IPv6のトポロジだけを通知)
    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)
STEP 8 No.12:R4のIIH(IPv4のアドレスだけでTLV 229が無い)
    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にしました。両方のアドレスファミリが全リンクで有効なままでも、経路が分かれます。

STEP 10:IPv6だけメトリックを変える
router isis 1
 interface GigabitEthernet0/0/0/0
  address-family ipv6 unicast
   metric 1000
  !
 !
!
STEP 10:R1からR3へ(IPv4、R2経由)
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  * 
STEP 10:R1からR3へ(IPv6、R4経由)
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 msec

IPv4とIPv6で使う回線を分けたい、片方だけ広帯域の経路に寄せたい、といった運用ができます。

検証Configおよびshow結果

各STEPで4台すべてから取得しています。検証Configはこの..._run.txtです(最終状態は最後のSTEPのもの)。

ファイル内容
..._show.txtshow 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.txtR1と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.txtshow isis trace all | include ADJトレースバッファは起動時から累積するので、最後のSTEP 10のものが全STEPぶんを含んでいる(1ファイル400KB超のため、STEP 10の4台分だけを添付)

STEP 0:IPv4のみ(初期状態)

ルータshow出力pingclearsyslogrunning-config
R1showpingclearlogrun
R2showclearlogrun
R3showpingclearlogrun
R4showclearlogrun

STEP 1:全台・全リンクでIPv6を有効化

ルータshow出力ping投入した設定syslogrunning-config
R1showpingcommitlogrun
R2showcommitlogrun
R3showpingcommitlogrun
R4showcommitlogrun

STEP 2:全台でsingle-topology

ルータshow出力ping投入した設定syslogrunning-config
R1showpingcommitlogrun
R2showcommitlogrun
R3showpingcommitlogrun
R4showcommitlogrun

STEP 3:R2-R3のIPv6を外す(STのまま)

ルータshow出力ping投入した設定syslogrunning-config
R1showpinglogrun
R2showcommitlogrun
R3showpingcommitlogrun
R4showlogrun

STEP 4:全台でsingle-topologyを外す(MTへ)

ルータshow出力ping投入した設定syslogrunning-config
R1showpingcommitlogrun
R2showcommitlogrun
R3showpingcommitlogrun
R4showcommitlogrun

STEP 5:R2-R3のIPv6を戻す

ルータshow出力ping投入した設定syslogrunning-config
R1showpinglogrun
R2showcommitlogrun
R3showpingcommitlogrun
R4showlogrun

STEP 6:R2だけsingle-topologyに戻す

ルータshow出力ping投入した設定syslogrunning-config
R1showpinglogrun
R2showcommitlogrun
R3showpinglogrun
R4showlogrun

STEP 7:R2をMTに戻す

ルータshow出力ping投入した設定syslogrunning-config
R1showpinglogrun
R2showcommitlogrun
R3showpinglogrun
R4showlogrun

STEP 8:R1-R4を共通MTの無いリンクにする

ルータshow出力ping投入した設定syslogrunning-config
R1showpingcommitlogrun
R2showlogrun
R3showpinglogrun
R4showcommitlogrun

STEP 9:R1-R4を戻す

ルータshow出力ping投入した設定syslogrunning-config
R1showpingcommitlogrun
R2showlogrun
R3showpinglogrun
R4showcommitlogrun

STEP 10:R1-R2のIPv6メトリックを1000にする(最終状態)

ルータshow出力ping投入した設定syslogrunning-configtrace
R1showpingcommitlogruntrace
R2showcommitlogruntrace
R3showpinglogruntrace
R4showlogruntrace

パケットキャプチャーはSTEPごとに取得しています。

STEPR1-R2間R2-R3間R1-R4間
0pcappcappcap
1pcappcappcap
2pcappcappcap
3pcappcappcap
4pcappcappcap
5pcappcappcap
6pcappcappcap
7pcappcappcap
8pcappcappcap
9pcappcappcap
10pcappcappcap

参考

標準タイトル概要
RFC 5308Routing IPv6 with IS-ISTLV 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 5120M-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が無くても常に張るとしている。

関連記事