IS-ISのルートリークとup/downビット
IS-ISのレベル1エリアは、外の経路を持ちません。外向きのパケットは最も近い出口へ渡され、その先は出口のルータが決めます。ATTビットが担うこの仕組みは単純ですが、レベル1のルータは「どの出口が近いか」しか知らないため、出口から先が近いか遠いかを判断できません。
これを補うのがルートリークです。レベル2で学んだ経路をレベル1のLSPへ落とせば、レベル1のルータも宛先までの距離で出口を選べるようになります。ただし落とした経路がレベル2へ戻るとループになるため、up/downビットという1ビットの印で向きを記録します。
この記事では、ビットがどこにあり、誰がいつ立て、何を禁じているかを、RFCの規定とIOS XRの実機で確認します。ATTビットの仕組みはIS-ISのATTビットとレベル1のデフォルトルートで解説しています。
なぜリークするのか
RFC 5302は、ATTビットに頼る出口選択をこう評しています。
最も近いL1L2ルータを使うということは、そのL1L2がメトリック情報を持たないデフォルトルートをL1エリアへ注入しているのと実質的に同じである。L1ルータが行う経路計算も同様に最適でない。
デフォルトルートには宛先ごとの距離がありません。出口Aが近くても、目的地が出口Bのすぐ隣にあるなら、Bを通るほうが速いはずです。レベル1のルータにはその判断材料がありません。
そこでレベル2の経路そのものをレベル1へ広告するのがルートリークです。プレフィックスとメトリックが手元に来るので、レベル1のルータも普通のSPF計算で出口を選べます。
なおルートリークはISO/IEC 10589:2002には無い仕組みです。RFC 1195がIPの経路を運ぶために定めたTLVに対して、IETFが後から足した拡張になります。
up/downビットはどこにあるか
ビットの位置はTLVによって違います。
| TLV | メトリックの形 | up/downビットの位置 |
|---|---|---|
| 128 / 130(narrow) | 1バイトのdefaultメトリック | そのバイトのbit 8 |
| 135(wide、RFC 5305) | 4バイトのメトリック | 後ろに続く制御バイトのbit 8 |
TLV 135の制御バイトは1バイトに3つの情報を詰めています。
| ビット | 意味 |
|---|---|
| 8 | up/downビット |
| 7 | サブTLVが続くか |
| 1〜6 | プレフィックス長(0〜32) |
narrowのTLV 128では、defaultメトリックのbit 8が元々「予約」でした(bit 7は内部か外部かを示すI/Eビット、bit 1〜6が値)。RFC 5302がこれをup/downビットとして再定義しています。TLVの構造はIS-ISの主要TLVで解説しています。
0と1が意味するもの
RFC 5305が値の決め方を定めています。
up/downビットは、プレフィックスがIS-ISに最初に注入されたときは0にしなければならない。あるプレフィックスが上位のレベルから下位のレベルへ(たとえばレベル2からレベル1へ)広告される場合は、このビットを1にしなければならない。
つまり1は「上から降りてきた」という印です。0は「このレベルで生まれた」を意味します。
同じRFCは、同じレベルの別エリアへ広告する場合も1にすると定めています。レベルは同じでも、エリアをまたいだ時点で「よそから来た経路」になるためです。
RFC 5302は、誰が立てるかをこう書いています。
L1L2ルータは、L2ルーティングから導出されL1のLSPへ広告されるプレフィックスについて、このビットを1にしなければならない。L1またはL2のLSPに載る他のすべてのIPプレフィックスでは0にしなければならない。
なおRFC 7794は、プレフィックスに付ける別のサブTLV(Prefix Attribute Flags)にRフラグを定義しています。「プレフィックスがあるレベルから別のレベルへ、上向きにも下向きにもリークされたときに立てる」もので、向きを区別しない点がup/downビットと違います。
ループを防ぐ規則
up/downビットの目的はループの防止です。RFC 5302の規定がその要になります。
up/downビットが立っていてL1ルーティングで学んだプレフィックスを、L1L2ルータはL2へ戻して広告してはならない。
レベル2から降ろした経路が、別のL1L2ルータによってレベル2へ押し戻されると、経路が循環します。降りてきた経路には印が付いているので、L1L2ルータはそれを見て「これは上げてはいけない」と判断できます。
RFC 5305も同じことを別の言い方で述べています。
up/downビットが1のプレフィックスは、階層の下方向にしか広告してはならない。
古い実装との互換性
up/downビットを知らないレベル1の実装は、リークされた経路をエリア内の経路として取り込んでしまいます。RFC 5302はこれについて、次のように整理しています。
それ自体がL1のみのルータ同士でルーティングループを起こすことはない。
ループを止めているのはL1L2ルータの側だからです。レベル1のみのルータは経路を再広告しないので、印を読めなくても循環は生じません。
どこまでリークするか
リークは無料ではありません。RFC 5302はこう述べています。
ドメイン全体でプレフィックス数が増える。その結果、ドメイン全体でメモリ消費・伝送・計算の要求が増える。
これは妥協であり、IS-ISで得られる最大のスケーラビリティを提供するものではない。この機能を使うドメインは、スケーラビリティと最適性の間で取引をしていることを認識し、それに応じてネットワークを設計・監視すべきである。
レベル1エリアの利点は、外の情報を持たないことでデータベースが小さくなる点にあります。リークはその利点を削って最適性を買う操作です。そのためRFC 5302は、必要なものだけを落とすことと、既定では落とさないことを求めています。
上下いずれの方向にも、すべてのプレフィックスを広告する必要はない。実装は、LSPへ載せるエリア間プレフィックスの数をさらに減らすために、手動のフィルタリングや集約を許してもよい。
L1L2ルータの既定の設定では、L2の経路をL1へ一切広告しないことを推奨する。実装は、L2の経路をL1へ広告させるには、ネットワーク管理者に手動で設定させるべきである。
IOS XRでpropagate level 2 into level 1にroute-policyが必須なのは、この要求に沿った形になっています。
実機での検証
検証環境
エリア49.0001にR1・R2・R3を置き、R1だけをlevel-1にします。R2とR3はlevel-1-2で、別エリア49.0002のlevel-2-onlyなR4へつながります。R4にLoopback1(172.16.4.1/32)を置き、これをリークの対象にしました。
| ルータ | エリア | IS Type | ループバック | リンク |
|---|---|---|---|---|
| R1 | 49.0001 | level-1 | Lo0 1.1.1.1/32 | Gi0/0/0/0 10.1.2.1(R2へ、metric 10)/ Gi0/0/0/1 10.1.3.1(R3へ、metric 20) |
| R2 | 49.0001 | level-1-2 | Lo0 2.2.2.2/32 | Gi0/0/0/0 10.1.2.2 / Gi0/0/0/1 10.2.4.2(R4へ) |
| R3 | 49.0001 | level-1-2 | Lo0 3.3.3.3/32 | Gi0/0/0/0 10.1.3.3 / Gi0/0/0/1 10.3.4.3(R4へ) |
| R4 | 49.0002 | level-2-only | Lo0 4.4.4.4/32 / Lo1 172.16.4.1/32 | Gi0/0/0/0 10.2.4.4 / Gi0/0/0/1 10.3.4.4 |
メトリックはwide(TLV 135)にしています。narrowのTLV 128でもビットの意味は同じですが、制御バイトとして独立している分、wideのほうが観測しやすいためです。
検証のSTEP
| STEP | 操作 | 確かめること |
|---|---|---|
| 0 | 既定(リークなし) | R1は0.0.0.0/0だけを持ち、172.16.4.1/32は持たない |
| 1 | R2にL2→L1のリークを設定 | R1に172.16.4.1/32が現れ、R2のレベル1 LSPでup/downビットが1になること |
| 2 | R3にも同じリークを設定 | R1が両方の出口からこの経路を受け取ること |
| 3 | R2のR4向きリンクをmetric 100にする | デフォルトルートはR2のまま、リークした172.16.4.1/32だけがR3経由へ移ること |
| 4 | すべて元に戻す(最終状態) | STEP 0と一致 |
ATTビットを強制的に立てる/無視する設定も試そうとしましたが、IOS XR 26.1.1(XRd)にはattached-bitにあたるコマンドがありません(attached-bit / set-attached-bit のいずれも% Invalid input detected)。ATTビットの扱いはレベル構成とエリアの形で決まります。
STEP 0:出口はデフォルトルートだけ
R1の経路表です。
RP/0/RP0/CPU0:R1#show route isis
Fri Sep 11 12:29:53.589 UTC
i*L1 0.0.0.0/0 [115/10] via 10.1.2.2, 00:13:00, GigabitEthernet0/0/0/0
i L1 2.2.2.2/32 [115/10] via 10.1.2.2, 00:14:42, GigabitEthernet0/0/0/0
i L1 3.3.3.3/32 [115/20] via 10.1.3.3, 00:13:36, GigabitEthernet0/0/0/1
i L1 10.2.4.0/24 [115/20] via 10.1.2.2, 00:14:42, GigabitEthernet0/0/0/0
i L1 10.3.4.0/24 [115/30] via 10.1.3.3, 00:13:36, GigabitEthernet0/0/0/1外向きの経路はi*L1 0.0.0.0/0の1本だけで、172.16.4.1/32はどこにもありません。R2とR3の両方がATTビットを立てていますが、R1が選んだのはメトリックの小さいR2(10)です。
STEP 1:R2にリークを設定する
R2に、対象を172.16.4.1/32だけに絞ったルートポリシーを置き、propagate level 2 into level 1で適用しました。IOS XRではこのコマンドにroute-policyが必須で、省くと% Incomplete command.になります。
RP/0/RP0/CPU0:R2#show rpl route-policy LEAK-L2-TO-L1
Fri Sep 11 12:33:09.993 UTC
route-policy LEAK-L2-TO-L1
if destination in (172.16.4.1/32) then
pass
endif
end-policy
!R1のレベル1データベースです。
RP/0/RP0/CPU0:R1#show isis database detail
Fri Sep 11 12:32:53.923 UTC
IS-IS 1 (Level-1) Link State Database
LSPID LSP Seq Num LSP Checksum LSP Holdtime/Rcvd ATT/P/OL
R1.00-00 * 0x00000007 0x2165 909 /* 0/0/0
Area Address: 49.0001
LSP MTU: 1492
NLPID: 0xcc
IP Address: 1.1.1.1
Hostname: R1
Metric: 10 IS-Extended R2.00
Metric: 20 IS-Extended R3.00
Metric: 0 IP-Extended 1.1.1.1/32
Metric: 10 IP-Extended 10.1.2.0/24
Metric: 20 IP-Extended 10.1.3.0/24
R2.00-00 0x00000008 0x4796 1107 /1200 1/0/0
Area Address: 49.0001
LSP MTU: 1492
NLPID: 0xcc
IP Address: 2.2.2.2
Hostname: R2
Metric: 10 IS-Extended R1.00
Metric: 0 IP-Extended 2.2.2.2/32
Metric: 10 IP-Extended 10.1.2.0/24
Metric: 10 IP-Extended 10.2.4.0/24
Metric: 10 IP-Extended-Interarea 172.16.4.1/32
R3.00-00 0x00000006 0x764a 1126 /1200 1/0/0
Area Address: 49.0001
LSP MTU: 1492
NLPID: 0xcc
IP Address: 3.3.3.3
Hostname: R3
Metric: 20 IS-Extended R1.00
Metric: 0 IP-Extended 3.3.3.3/32
Metric: 20 IP-Extended 10.1.3.0/24
Metric: 10 IP-Extended 10.3.4.0/24
Total Level-1 LSP count: 3 Local Level-1 LSP count: 1R2のLSPの最後がIP-Extended-Interarea 172.16.4.1/32です。他のプレフィックスはIP-Extendedで、この語の違いがup/downビットが1であることを表しています。まだ設定していないR3のLSPには現れていません。
R1の経路表では型がinter-areaになります。
RP/0/RP0/CPU0:R1#show route 172.16.4.1
Fri Sep 11 12:32:53.034 UTC
Routing entry for 172.16.4.1/32
Known via "isis 1", distance 115, metric 20, type inter-area
Installed Sep 11 12:31:21.175 for 00:01:31
Routing Descriptor Blocks
10.1.2.2, from 2.2.2.2, via GigabitEthernet0/0/0/0
Route metric is 20
No advertising protos. 受け取る側のR1には何も設定していません。リークはレベル1とレベル2の両方を持つルータの仕事で、レベル1のルータは届いた経路を普通に計算に入れるだけです。実際、R1の_run.txtは全STEPで同一です。
注入した側では0のまま
同じプレフィックスをレベル2側で見ます。R4のデータベースです。
RP/0/RP0/CPU0:R4#show isis database detail
Fri Sep 11 12:36:03.318 UTC
IS-IS 1 (Level-2) Link State Database
LSPID LSP Seq Num LSP Checksum LSP Holdtime/Rcvd ATT/P/OL
R2.00-00 0x00000008 0x6f8f 796 /1200 0/0/0
Area Address: 49.0001
LSP MTU: 1492
NLPID: 0xcc
IP Address: 2.2.2.2
Hostname: R2
Metric: 10 IS-Extended R4.00
Metric: 10 IP-Extended 1.1.1.1/32
Metric: 0 IP-Extended 2.2.2.2/32
Metric: 30 IP-Extended 3.3.3.3/32
Metric: 10 IP-Extended 10.1.2.0/24
Metric: 30 IP-Extended 10.1.3.0/24
Metric: 10 IP-Extended 10.2.4.0/24
Metric: 40 IP-Extended 10.3.4.0/24
R3.00-00 0x00000007 0xa321 915 /1200 0/0/0
Area Address: 49.0001
LSP MTU: 1492
NLPID: 0xcc
IP Address: 3.3.3.3
Hostname: R3
Metric: 10 IS-Extended R4.00
Metric: 20 IP-Extended 1.1.1.1/32
Metric: 30 IP-Extended 2.2.2.2/32
Metric: 0 IP-Extended 3.3.3.3/32
Metric: 30 IP-Extended 10.1.2.0/24
Metric: 20 IP-Extended 10.1.3.0/24
Metric: 40 IP-Extended 10.2.4.0/24
Metric: 10 IP-Extended 10.3.4.0/24
R4.00-00 * 0x00000006 0x02b7 857 /* 0/0/0
Area Address: 49.0002
LSP MTU: 1492
NLPID: 0xcc
IP Address: 4.4.4.4
Hostname: R4
Metric: 10 IS-Extended R2.00
Metric: 10 IS-Extended R3.00
Metric: 0 IP-Extended 4.4.4.4/32
Metric: 10 IP-Extended 10.2.4.0/24
Metric: 10 IP-Extended 10.3.4.0/24
Metric: 0 IP-Extended 172.16.4.1/32
Total Level-2 LSP count: 3 Local Level-2 LSP count: 1R4自身のLSP(R4.00-00)の172.16.4.1/32はIP-Extended、つまりビットは0です。最初に注入したルータが0で出し、レベル1へ落としたR2とR3が1に変えているという関係になります。
このデータベースにはIP-Extended-Interareaの行が1つもありません。R2とR3はレベル1にリークした経路をレベル2のLSPへ載せていない、ということです。
パケットで見る
R1 — R2のキャプチャーのNo.33が、リーク直後にR2が送ったレベル1 LSPです。tsharkは制御バイトを3つに分けて表示します。
Ext. IP Reachability: 10.2.4.0/24
Metric: 10
0... .... = Distribution: Up
.1.. .... = Sub-TLV: Yes
..01 1000 = Prefix Length: 24
IPv4 prefix: 10.2.4.0
SubCLV Length: 3
subTLV: Prefix Attribute Flags (c=4, l=1): Flags:---
Code: Prefix Attribute Flags (4)
Length: 1
Flags: 0x00
0... .... = External Prefix: Not set
.0.. .... = Re-advertisement: Not set
..0. .... = Node: Not set
Ext. IP Reachability: 172.16.4.1/32
Metric: 10
1... .... = Distribution: Down
.1.. .... = Sub-TLV: Yes
..10 0000 = Prefix Length: 32
IPv4 prefix: 172.16.4.1
SubCLV Length: 3
subTLV: Prefix Attribute Flags (c=4, l=1): Flags:-RN
Code: Prefix Attribute Flags (4)
Length: 1
Flags: 0x60, Re-advertisement, Node
0... .... = External Prefix: Not set
.1.. .... = Re-advertisement: Set
..1. .... = Node: Set同じLSPの中で、R2自身のリンク10.2.4.0/24はDistribution: Up(bit 8が0)、リークした172.16.4.1/32はDistribution: Down(bit 8が1)です。プレフィックス長(..10 0000 = 32)とサブTLVの有無が同じ1バイトに入っていることも、そのまま読み取れます。
RFC 7794のRフラグも立っています(Flags:-RN)。こちらは方向を持たない「レベルをまたいでリークされた」という印で、up/downビットとは別のサブTLVに入ります。
STEP 2:R3にも同じ設定をする
RP/0/RP0/CPU0:R1#show route isis
Fri Sep 11 12:35:19.279 UTC
i*L1 0.0.0.0/0 [115/10] via 10.1.2.2, 00:18:26, GigabitEthernet0/0/0/0
i L1 2.2.2.2/32 [115/10] via 10.1.2.2, 00:20:07, GigabitEthernet0/0/0/0
i L1 3.3.3.3/32 [115/20] via 10.1.3.3, 00:19:02, GigabitEthernet0/0/0/1
i L1 10.2.4.0/24 [115/20] via 10.1.2.2, 00:20:07, GigabitEthernet0/0/0/0
i L1 10.3.4.0/24 [115/30] via 10.1.3.3, 00:19:02, GigabitEthernet0/0/0/1
i ia 172.16.4.1/32 [115/20] via 10.1.2.2, 00:03:58, GigabitEthernet0/0/0/0R3のLSPにも同じ行が出ますが、R1の経路は変わりません。R2経由が20(10+10)、R3経由が30(20+10)だからです。
STEP 3:近い出口と最良の出口が分かれる
R2のR4向きリンクをmetric 100にしました。R1からR2までの距離(10)は変えていません。
RP/0/RP0/CPU0:R1#show route isis
Fri Sep 11 12:38:30.384 UTC
i*L1 0.0.0.0/0 [115/10] via 10.1.2.2, 00:21:37, GigabitEthernet0/0/0/0
i L1 2.2.2.2/32 [115/10] via 10.1.2.2, 00:23:18, GigabitEthernet0/0/0/0
i L1 3.3.3.3/32 [115/20] via 10.1.3.3, 00:22:13, GigabitEthernet0/0/0/1
i L1 10.2.4.0/24 [115/110] via 10.1.2.2, 00:01:50, GigabitEthernet0/0/0/0
i L1 10.3.4.0/24 [115/30] via 10.1.3.3, 00:22:13, GigabitEthernet0/0/0/1
i ia 172.16.4.1/32 [115/30] via 10.1.3.3, 00:01:50, GigabitEthernet0/0/0/1デフォルトルートは10.1.2.2(R2)のまま、172.16.4.1/32だけが10.1.3.3(R3)経由に変わりました。デフォルトルートが比べているのはR1から出口までの距離で、リークした経路が比べているのはR1から宛先までの距離(30 対 110)です。両者が食い違うときに差が出ます。これがリークする理由そのものです。
STEP 4:元に戻す
2台のリークとメトリックを外しました。STEP 0との_run.txtの差分は時刻の行だけです。
検証Configおよびshow結果
R1 — R2のリンクで試験の全体をキャプチャーしています。上で引用したLSPはこの中のNo.33です。
試験全体のキャプチャー(R1 — R2、約14分)をダウンロード各STEPで4台すべてから、次の3種類をルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態は最後のSTEPのもの)。
| ファイル | 内容 |
|---|---|
..._show.txt | show version / show interface description / show route と、show isis 系一式(interface brief / neighbors / database detail / topology / route / adjacency-log / spf-log / lsp-log / statistics)、show rpl route-policy LEAK-L2-TO-L1 |
..._log.txt | そのSTEPの範囲だけに絞ったshow logging。各STEPの開始時にlogmsgでマーカーを入れ、その時刻をshow logging startに指定して取得したもの |
..._run.txt | そのSTEP時点のshow running-config(=そのSTEPの検証Config) |
STEP 0:初期状態(リークなし)
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 1:R2にL2→L1のルートリークを設定
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 2:R3にも同じリークを設定
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 3:R2のR4向きリンクをmetric 100に
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 4:すべて元に戻す(最終状態)
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
参考
| 標準 | タイトル | 概要 |
|---|---|---|
| RFC 5302 | Domain-Wide Prefix Distribution with Two-Level IS-IS | TLV 128 / 130のdefaultメトリックのbit 8をup/downビットとして再定義した(RFC 2966を廃止)。L1L2ルータがL2由来のプレフィックスをL1へ広告する際に1にすること、up/downビットが立ちL1で学んだプレフィックスをL2へ戻してはならないことを定めている。ATTビットによる出口選択が「メトリック情報を持たないデフォルトルートの注入」と同等であることの指摘も本RFC。 |
| RFC 5305 | IS-IS Extensions for Traffic Engineering | wideメトリック。TLV 135では4バイトのメトリックに続く制御バイトのbit 8がup/downビット、bit 7がサブTLVの有無、bit 1〜6がプレフィックス長。最初の注入時は0、上位から下位への広告時は1、同じレベルの別エリアへの広告時も1と定めている。 |
| RFC 7794 | IS-IS Prefix Attributes for Extended IPv4 and IPv6 Reachability | Prefix Attribute FlagsサブTLV(タイプ4)のX / R / Nフラグを定義している。Rフラグは「プレフィックスがあるレベルから別のレベルへ、上向きにも下向きにもリークされたときに立てる」もの。Nフラグは「広告しているルータ自身を指すホストプレフィックス(ループバック)のときに立てる」もの。 |
| RFC 1195 | Use of OSI IS-IS for Routing in TCP/IP and Dual Environments | IPの経路を運ぶための拡張。TLV 128 / 130を定義している。 |
| ISO/IEC 10589:2002(第2版) | Intermediate System to Intermediate System intra-domain routeing information exchange protocol | IS-IS本体の仕様。ルートリークとup/downビットは規定していない(IPプレフィックスを運ぶ仕組み自体がRFC 1195以降のIETF拡張のため)。 |
関連記事
- 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の経路集約