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

OSPFのRFC1583互換(外部経路の選択規則)

目次

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 rfc1583no compatible rfc1583でRFC 2328の規則
IOS XR(XRd 26.1.1)RFC 1583の規則(コストだけで比べる)できない

両者を混在させたドメインでIOS XE側だけ無効にすると、ルータによって選ぶASBRが食い違います。Appendix C.1が全台で揃えるよう求めているのは、この食い違いがループの原因になるためです。

実機での検証

検証環境

検証構成: R2(エリア0のASBR)とR3(エリア1のASBR)が同じ外部経路を出し、ABRのR1(IOS XE)とR4(IOS XR)が選ぶ

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には無い
1R2とR3で192.0.2.0/24を再配布既定ではR1もR4もコストの小さいR2を選ぶ
2R1でno compatible rfc1583R1はR3に切り替わり、R4はR2のまま
3R1のR3向けコストを100に上げるR1はR3のまま(種別がコストより先に効く)
4R1でcompatible rfc1583に戻すR1はR2に戻る
5すべて既定に戻す(最終状態)

設定できるかどうか(STEP 0)

R1(IOS XE)のrouter ospfの下でcompatible ?を打った結果です。

R1(IOS XE)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の時点で拒否されます。

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とそこまでの経路です。

STEP 1 R1 show ip ospf border-routers
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 5

R2(2.2.2.2)へはエリア0のエリア内経路でコスト10、R3(3.3.3.3)へはエリア1のエリア内経路でコスト30です。R1とR4の経路表は次のとおりです。

STEP 1 R1 show ip route 192.0.2.0
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 1
STEP 1 R4 show route 192.0.2.0/24
RP/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です。

STEP 2 R1 投入したコマンド
R1#show archive log config 71 99999 provisioning
router ospf 1
 no compatible rfc1583 
STEP 2 R1 show running-config | section router ospf
R1#show running-config | section router ospf
router ospf 1
 router-id 1.1.1.1
 no compatible rfc1583

R1の経路表です。

STEP 2 R1 show ip route 192.0.2.0
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 1

from 3.3.3.3(R3)に切り替わりましたforward metric 30で、コストの大きいほうです。R3へはエリア1のエリア内経路で届くため、Section 16.4.1でコストより先に選ばれます。

同じときのR4です。

STEP 2 R4 show route 192.0.2.0/24
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と同じ種別とコストを示しています。

STEP 2 R4 show ospf border-routers
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に上げました。

STEP 3 R1 投入したコマンド
R1#show archive log config 73 99999 provisioning
interface GigabitEthernet2 
 ip ospf cost 100
STEP 3 R1 show ip ospf border-routers
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 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 7
STEP 3 R1 show ip route 192.0.2.0
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 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 1

R3までのコストは100で、R2の10倍です。それでもR1はR3を選んだままです。種別の比較(c)がコストの比較(d)より前にあるためです。

RFC1583互換を有効に戻す(STEP 4)

R1でcompatible rfc1583を投入しました。コストは100のままです。

STEP 4 R1 投入したコマンド
R1#show archive log config 75 99999 provisioning
router ospf 1
 compatible rfc1583 
STEP 4 R1 show ip route 192.0.2.0
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 1

R2(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.txtR1(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 databaseexternal / 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/24show ospf系一式(border-routers / database externalを含む)
..._log.txtそのSTEPの範囲だけに絞ったshow logging。各STEPの開始時にマーカーを入れ、それ以降を取得したもの
..._run.txtそのSTEP時点のshow running-config(=そのSTEPの検証Config)
..._trace.txtR2〜R4のshow ospf trace spf | include Begin SPFshow ospf trace errors(IOS XRのみ)
..._ping.txtR1とR4から、R2(2.2.2.2)とR3(3.3.3.3)へのping(50発)と192.0.2.1へのtraceroute
..._cfg.txtR1(IOS XE)でそのSTEPに投入したコマンド(show archive log config <範囲> provisioning
..._commit.cfgR2・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出力syslogrunning-configtraceping設定
R1showlogrunping
R2showlogruntrace
R3showlogruntrace
R4showlogruntraceping

STEP 1:R2とR3で192.0.2.0/24を再配布

ルータshow出力syslogrunning-configtraceping設定
R1showlogrunping
R2showlogruntracecommit
R3showlogruntracecommit
R4showlogruntraceping

STEP 2:R1でno compatible rfc1583

ルータshow出力syslogrunning-configtraceping設定
R1showlogrunpingcfg
R2showlogruntrace
R3showlogruntrace
R4showlogruntraceping

STEP 3:R1のR3向けコストを100に上げる

ルータshow出力syslogrunning-configtraceping設定
R1showlogrunpingcfg
R2showlogruntrace
R3showlogruntrace
R4showlogruntraceping

STEP 4:R1でcompatible rfc1583に戻す

ルータshow出力syslogrunning-configtraceping設定
R1showlogrunpingcfg
R2showlogruntrace
R3showlogruntrace
R4showlogruntraceping

STEP 5:すべて既定に戻す(最終状態)

ルータshow出力syslogrunning-configtraceping設定
R1showlogrunpingcfg
R2showlogruntracecommit
R3showlogruntracecommit
R4showlogruntraceping

参考

出典参照した箇所
RFC 2328 OSPF Version 2Section 16.4(外部経路の計算)、Section 16.4.1(外部経路の優先規則)、Appendix C.1(RFC1583Compatibility)、Appendix G.2(RFC 2178からの変更)
RFC 1583 OSPF Version 2RFC 2328の前の版
実機Cisco IOS XE(cat8000v 17.18.02)、Cisco IOS XR(XRd 26.1.1)。設定の有無は設定モードのヘルプで確認

関連記事