OSPFのRFC1583互換(外部経路の選択規則)
同じ外部経路を2台のASBRが広告していると、OSPFのルータはどちらを使うかを決めなければなりません。RFC 2328はその比較の順序を決めており、途中にRFC1583Compatibilityという設定で切り替わる段階が1つあります。この段階が働くと、コストの小さいASBRが選ばれるとは限らなくなります。
この記事では、その段階が何を比べるのか、なぜ作られたのかをRFC 2328で確認し、IOS XEとIOS XRの実機で選ばれるASBRを確かめます。外部経路の基本とE1 / E2の違いはOSPFの外部経路で解説しています。
外部経路を比べる順序
RFC 2328のSection 16.4は、同じ宛先の外部経路が複数あるとき、次の順に比べると定めています。
| 順 | 比べるもの |
|---|---|
| (a) | エリア内経路・エリア間経路は、外部経路より常に優先する |
| (b) | E1はE2より優先する。すべてE2なら、広告されたメトリックの小さいほうを優先する |
| (c) | まだ差が付かず、RFC1583Compatibilityが無効なら、ASBR(またはForwarding Address)へ至るAS内部の経路の種別で絞り込む(Section 16.4.1) |
| (d) | まだ差が付かなければ、ASBR(またはForwarding Address)までのコストで比べる |
(c)は、RFC1583Compatibilityが無効のときだけ働きます。有効なら(c)は飛ばされ、(d)のコストの比較に進みます。
(c)が使う種別の優先順位は、Section 16.4.1に書かれています。
バックボーン以外のエリアを通るエリア内経路が、常に最も優先される。それ以外の経路(バックボーンのエリア内経路とエリア間経路)は同じ優先度とする。 (RFC 2328 Section 16.4.1)
つまり、ASBRへバックボーン以外のエリアの中だけで届くなら、コストがいくら大きくてもそちらが選ばれます。バックボーンのエリア内経路とエリア間経路は同格なので、その場合は(d)のコストで決まります。
なぜこの段階があるのか
RFC 1583(RFC 2328の前の版)は(c)を持たず、外部経路をコストだけで比べていました。RFC 2328のAppendix C.1は、RFC1583Compatibilityを無効にした規則を次のように説明しています。
Section 16.4.1の優先規則は、同じ宛先のAS外部LSAが異なるエリアから出されたときのルーティングループを防ぐ。 (RFC 2328 Appendix C.1)
同じ外部経路を別々のエリアにいるASBRが出していると、コストだけの比較ではルータごとに判断が食い違い、ループになりうるためです。Appendix G.2は、とくにバーチャルリンクを使っている場合に、あるルータから見たバックボーンのエリア内経路が、別のルータからはエリア間経路に見えうることを挙げ、この2つを同格にしたと説明しています。
RFC 2328の既定はenabled(RFC 1583の規則のまま)です。そのうえでAppendix C.1は、ドメイン内のすべてのルータで同じ設定にすべきとしています。古いRFC 1583の実装が混ざっていれば全台enabled、そうでなければ全台disabledです。
機種ごとの扱い
IOS XEはrouter ospfの下のcompatible rfc1583で切り替えます。既定は有効(RFC 1583の規則)で、no compatible rfc1583でSection 16.4.1の規則になります。無効にするとrunning-configにno compatible rfc1583と表示されます。
IOS XR(XRd 26.1.1)には、この規則を切り替えるコマンドがありません。router ospfの下のcompatibleが% Invalid inputになります。外部経路はコストだけで比べるRFC 1583の規則で選ばれます。
| 機種 | 既定の動き | 切り替え |
|---|---|---|
| IOS XE(17.18.02) | RFC 1583の規則(compatible rfc1583) | no compatible rfc1583でRFC 2328の規則 |
| IOS XR(XRd 26.1.1) | RFC 1583の規則(コストだけで比べる) | できない |
両者を混在させたドメインでIOS XE側だけ無効にすると、ルータによって選ぶASBRが食い違います。Appendix C.1が全台で揃えるよう求めているのは、この食い違いがループの原因になるためです。
実機での検証
検証環境
R2とR3が、Null0あてのスタティック192.0.2.0/24を再配布して同じ外部経路(E2、メトリック20、Forwarding Address 0.0.0.0)を出します。R2はエリア0、R3はエリア1のASBRです。
R1とR4はどちらもエリア0とエリア1のABRで、R2へはコスト10、R3へはコスト30です。R1(IOS XE)で規則を切り替え、同じ位置にいるR4(IOS XR)と選ぶASBRを比べます。
(a)と(b)では差が付かないので、比較は(c)か(d)に進みます。R3へはエリア1の中だけで届くので、Section 16.4.1ではR3が優先されます。コストだけで比べるならR2です。
検証のSTEP
| STEP | 操作 | 確かめること |
|---|---|---|
| 0 | 既定のまま(再配布なし) | IOS XEにはcompatible rfc1583があり、IOS XRには無い |
| 1 | R2とR3で192.0.2.0/24を再配布 | 既定ではR1もR4もコストの小さいR2を選ぶ |
| 2 | R1でno compatible rfc1583 | R1はR3に切り替わり、R4はR2のまま |
| 3 | R1のR3向けコストを100に上げる | R1はR3のまま(種別がコストより先に効く) |
| 4 | R1でcompatible rfc1583に戻す | R1はR2に戻る |
| 5 | すべて既定に戻す(最終状態) | — |
設定できるかどうか(STEP 0)
R1(IOS XE)のrouter ospfの下でcompatible ?を打った結果です。
R1(config)#router ospf 1
R1(config-router)#compatible ?
rfc1583 compatible with RFC 1583
rfc1587 compatible with RFC 1587
rfc5243 supports DBD exchange optimization
R1(config-router)#compatible
% Incomplete command.rfc1583があります。同じことをR4(IOS XR)で行うと、compatibleの時点で拒否されます。
RP/0/RP0/CPU0:R4(config)#router ospf 1
RP/0/RP0/CPU0:R4(config-ospf)#compatible ?
^
% Invalid input detected at '^' marker.既定ではコストで選ぶ(STEP 1)
R2とR3が再配布を始めた後、R1が知っているASBRとそこまでの経路です。
R1#show ip ospf border-routers
OSPF Router with ID (1.1.1.1) (Process ID 1)
Base Topology (MTID 0)
Internal Router Routing Table
Codes: i - Intra-area route, I - Inter-area route
i 4.4.4.4 [20] via 10.0.12.2, GigabitEthernet1, ABR, Area 0, SPF 6
i 4.4.4.4 [60] via 10.0.13.3, GigabitEthernet2, ABR, Area 1, SPF 5
i 2.2.2.2 [10] via 10.0.12.2, GigabitEthernet1, ASBR, Area 0, SPF 6
i 3.3.3.3 [30] via 10.0.13.3, GigabitEthernet2, ASBR, Area 1, SPF 5R2(2.2.2.2)へはエリア0のエリア内経路でコスト10、R3(3.3.3.3)へはエリア1のエリア内経路でコスト30です。R1とR4の経路表は次のとおりです。
R1#show ip route 192.0.2.0
Routing entry for 192.0.2.0/24
Known via "ospf 1", distance 110, metric 20, type extern 2, forward metric 10
Last update from 10.0.12.2 on GigabitEthernet1, 00:03:31 ago
Routing Descriptor Blocks:
* 10.0.12.2, from 2.2.2.2, 00:03:31 ago, via GigabitEthernet1
Route metric is 20, traffic share count is 1RP/0/RP0/CPU0:R4#show route 192.0.2.0/24
Tue Sep 22 11:34:05.215 UTC
Routing entry for 192.0.2.0/24
Known via "ospf 1", distance 110, metric 20, type extern 2
Installed Sep 22 11:30:55.165 for 00:03:10
Routing Descriptor Blocks
10.0.24.2, from 2.2.2.2, via GigabitEthernet0/0/0/0
Route metric is 20
No advertising protos. どちらもfrom 2.2.2.2、つまりR2を選んでいます。IOS XEのforward metric 10はASBRまでのコストです。既定の規則ではコストだけで比べるので、コスト10のR2になります。
RFC1583互換を無効にする(STEP 2)
R1でno compatible rfc1583を投入しました。IOS XEのarchiveに記録された投入コマンドと、running-configです。
R1#show archive log config 71 99999 provisioning
router ospf 1
no compatible rfc1583 R1#show running-config | section router ospf
router ospf 1
router-id 1.1.1.1
no compatible rfc1583R1の経路表です。
R1#show ip route 192.0.2.0
Routing entry for 192.0.2.0/24
Known via "ospf 1", distance 110, metric 20, type extern 2, forward metric 30
Last update from 10.0.13.3 on GigabitEthernet2, 00:02:51 ago
Routing Descriptor Blocks:
* 10.0.13.3, from 3.3.3.3, 00:02:51 ago, via GigabitEthernet2
Route metric is 20, traffic share count is 1from 3.3.3.3(R3)に切り替わりました。forward metric 30で、コストの大きいほうです。R3へはエリア1のエリア内経路で届くため、Section 16.4.1でコストより先に選ばれます。
同じときのR4です。
RP/0/RP0/CPU0:R4#show route 192.0.2.0/24
Tue Sep 22 11:37:10.042 UTC
Routing entry for 192.0.2.0/24
Known via "ospf 1", distance 110, metric 20, type extern 2
Installed Sep 22 11:30:55.165 for 00:06:14
Routing Descriptor Blocks
10.0.24.2, from 2.2.2.2, via GigabitEthernet0/0/0/0
Route metric is 20
No advertising protos. R4はR2のままです。R4からもR3へはエリア1のエリア内経路で届くので、Section 16.4.1の規則ならR3のはずです。R4のshow ospf border-routersは、R1と同じ種別とコストを示しています。
RP/0/RP0/CPU0:R4#show ospf border-routers
Tue Sep 22 11:37:10.612 UTC
OSPF 1 Internal Routing Table
Codes: i - Intra-area route, I - Inter-area route
i 1.1.1.1 [20] via 10.0.24.2, GigabitEthernet0/0/0/0, ABR , Area 0, SPF 8
i 1.1.1.1 [60] via 10.0.34.3, GigabitEthernet0/0/0/1, ABR , Area 1, SPF 8
i 2.2.2.2 [10] via 10.0.24.2, GigabitEthernet0/0/0/0, ASBR , Area 0, SPF 8
i 3.3.3.3 [30] via 10.0.34.3, GigabitEthernet0/0/0/1, ASBR , Area 1, SPF 8同じ位置のABRでも、R1はR3を、R4はR2を選んでいます。この構成ではどちらもASBRに直接届くのでループにはなりませんが、Appendix C.1が全台で揃えるよう求めている食い違いそのものです。
コストを100にしても変わらない(STEP 3)
R1のR3向けインタフェース(GigabitEthernet2)のコストを100に上げました。
R1#show archive log config 73 99999 provisioning
interface GigabitEthernet2
ip ospf cost 100R1#show ip ospf border-routers
OSPF Router with ID (1.1.1.1) (Process ID 1)
Base Topology (MTID 0)
Internal Router Routing Table
Codes: i - Intra-area route, I - Inter-area route
i 4.4.4.4 [20] via 10.0.12.2, GigabitEthernet1, ABR, Area 0, SPF 7
i 4.4.4.4 [130] via 10.0.13.3, GigabitEthernet2, ABR, Area 1, SPF 7
i 2.2.2.2 [10] via 10.0.12.2, GigabitEthernet1, ASBR, Area 0, SPF 7
i 3.3.3.3 [100] via 10.0.13.3, GigabitEthernet2, ASBR, Area 1, SPF 7R1#show ip route 192.0.2.0
Routing entry for 192.0.2.0/24
Known via "ospf 1", distance 110, metric 20, type extern 2, forward metric 100
Last update from 10.0.13.3 on GigabitEthernet2, 00:05:58 ago
Routing Descriptor Blocks:
* 10.0.13.3, from 3.3.3.3, 00:05:58 ago, via GigabitEthernet2
Route metric is 20, traffic share count is 1R3までのコストは100で、R2の10倍です。それでもR1はR3を選んだままです。種別の比較(c)がコストの比較(d)より前にあるためです。
RFC1583互換を有効に戻す(STEP 4)
R1でcompatible rfc1583を投入しました。コストは100のままです。
R1#show archive log config 75 99999 provisioning
router ospf 1
compatible rfc1583 R1#show ip route 192.0.2.0
Routing entry for 192.0.2.0/24
Known via "ospf 1", distance 110, metric 20, type extern 2, forward metric 10
Last update from 10.0.12.2 on GigabitEthernet1, 00:02:51 ago
Routing Descriptor Blocks:
* 10.0.12.2, from 2.2.2.2, 00:02:51 ago, via GigabitEthernet1
Route metric is 20, traffic share count is 1R2(forward metric 10)に戻りました。(c)が飛ばされ、コストだけで比べた結果です。
設計上の注意
- IOS XRを含むドメインでは、IOS XE側も既定(
compatible rfc1583)のままにする。IOS XRはSection 16.4.1の規則に切り替えられないので、全台で揃えられるのはRFC 1583の規則のほうだけ - (c)の比較は、ASBRへ届く経路の種別が違うときにしか結果を変えない。同じ外部経路を別々のエリアのASBRが出す構成で、設定の食い違いが表に出る
検証Configおよびshow結果
各STEPで4台すべてから、次のファイルをルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態は最後のSTEPのもの)。
| ファイル | 内容 |
|---|---|
..._show.txt | R1(IOS XE)はshow version / show interfaces description / show ip route / show ip route ospf / show ip route 192.0.2.0 / show ip cef 192.0.2.0 / show ip ospf / show ip ospf interface brief / show ip ospf neighbor / show ip ospf border-routers / show ip ospf database(external / external 192.0.2.0 / asbr-summaryを含む) / show running-config | section router ospf。R2〜R4(IOS XR)はshow version / show interface description / show route / show route 192.0.2.0/24とshow ospf系一式(border-routers / database externalを含む) |
..._log.txt | そのSTEPの範囲だけに絞ったshow logging。各STEPの開始時にマーカーを入れ、それ以降を取得したもの |
..._run.txt | そのSTEP時点のshow running-config(=そのSTEPの検証Config) |
..._trace.txt | R2〜R4のshow ospf trace spf | include Begin SPFとshow ospf trace errors(IOS XRのみ) |
..._ping.txt | R1とR4から、R2(2.2.2.2)とR3(3.3.3.3)へのping(50発)と192.0.2.1へのtraceroute |
..._cfg.txt | R1(IOS XE)でそのSTEPに投入したコマンド(show archive log config <範囲> provisioning) |
..._commit.cfg | R2・R3(IOS XR)でそのSTEPにcommitされた設定(show configuration commit changes last 1) |
設定を変えていないSTEPとルータにはcfg / commitがありません。STEP 0の前に確かめたcompatible ?のヘルプはR1(IOS XE)とR4(IOS XR)にあります。最終状態では再配布を止め、R1のコストとRFC1583互換を既定に戻しています。
STEP 0:初期状態(再配布なし)
| ルータ | show出力 | syslog | running-config | trace | ping | 設定 |
|---|---|---|---|---|---|---|
| R1 | show | log | run | — | ping | — |
| R2 | show | log | run | trace | — | — |
| R3 | show | log | run | trace | — | — |
| R4 | show | log | run | trace | ping | — |
STEP 1:R2とR3で192.0.2.0/24を再配布
| ルータ | show出力 | syslog | running-config | trace | ping | 設定 |
|---|---|---|---|---|---|---|
| R1 | show | log | run | — | ping | — |
| R2 | show | log | run | trace | — | commit |
| R3 | show | log | run | trace | — | commit |
| R4 | show | log | run | trace | ping | — |
STEP 2:R1でno compatible rfc1583
| ルータ | show出力 | syslog | running-config | trace | ping | 設定 |
|---|---|---|---|---|---|---|
| R1 | show | log | run | — | ping | cfg |
| R2 | show | log | run | trace | — | — |
| R3 | show | log | run | trace | — | — |
| R4 | show | log | run | trace | ping | — |
STEP 3:R1のR3向けコストを100に上げる
| ルータ | show出力 | syslog | running-config | trace | ping | 設定 |
|---|---|---|---|---|---|---|
| R1 | show | log | run | — | ping | cfg |
| R2 | show | log | run | trace | — | — |
| R3 | show | log | run | trace | — | — |
| R4 | show | log | run | trace | ping | — |
STEP 4:R1でcompatible rfc1583に戻す
| ルータ | show出力 | syslog | running-config | trace | ping | 設定 |
|---|---|---|---|---|---|---|
| R1 | show | log | run | — | ping | cfg |
| R2 | show | log | run | trace | — | — |
| R3 | show | log | run | trace | — | — |
| R4 | show | log | run | trace | ping | — |
STEP 5:すべて既定に戻す(最終状態)
| ルータ | show出力 | syslog | running-config | trace | ping | 設定 |
|---|---|---|---|---|---|---|
| R1 | show | log | run | — | ping | cfg |
| R2 | show | log | run | trace | — | commit |
| R3 | show | log | run | trace | — | commit |
| R4 | show | log | run | trace | ping | — |
参考
| 出典 | 参照した箇所 |
|---|---|
| RFC 2328 OSPF Version 2 | Section 16.4(外部経路の計算)、Section 16.4.1(外部経路の優先規則)、Appendix C.1(RFC1583Compatibility)、Appendix G.2(RFC 2178からの変更) |
| RFC 1583 OSPF Version 2 | RFC 2328の前の版 |
| 実機 | Cisco IOS XE(cat8000v 17.18.02)、Cisco IOS XR(XRd 26.1.1)。設定の有無は設定モードのヘルプで確認 |
関連記事
- OSPFとは
- OSPFのルータID
- OSPFパケットの種類とヘッダーフォーマット
- OSPFの認証
- OSPFの状態遷移
- OSPF Optionsフィールド
- OSPFのDRとBDR
- OSPF ネットワークタイプ
- OSPFのコスト(メトリック)
- OSPFの外部経路(スタティックの再配布)
- OSPFのRFC1583互換(外部経路の選択規則)
- OSPFのマルチエリアとABR
- OSPFのバーチャルリンク
- OSPFのスタブエリアとトータリースタブエリア
- OSPFのNSSAとトータリーNSSA
- OSPFのデフォルトルート
- OSPFの経路集約
- OSPFのLSAとLSAヘッダー
- OSPFのHelloとDeadインターバル
- OSPFの収束タイマー(SPF / LSAスロットル)
- OSPFのLSAリフレッシュとペーシング
- OSPFのRouter-LSA(Type 1)
- OSPFのNetwork-LSA(Type 2)
- OSPFのSummary-LSA(Type 3)
- OSPFのASBR Summary-LSA(Type 4)
- OSPFのAS External-LSA(Type 5)
- OSPFのNSSA External-LSA(Type 7)