Cisco IOS / IOS-XE でのOSPFv2の設定と確認手順をまとめる。ネイバー確立の流れからエリア分割、LSAの読み方、コストによる経路制御、スタブエリアと切り分けまでを一通り扱う。
前提/環境
以下の環境で確認した。
R1# show version | include Version
Cisco IOS XE Software, Version 17.03.04a
Cisco IOS Software [Amsterdam], Virtual XE Software (X86_64_LINUX_IOSD-UNIVERSALK9-M), Version 17.3.4a, RELEASE SOFTWARE (fc4)
検証構成は次のとおり。R2がArea 0とArea 1の境界(ABR)になる。
192.168.10.0/24 192.168.30.0/24
| |
[ R1 ] [ R2 ] [ R3 ]
Lo0 192.168.255.1 Lo0 192.168.255.2 Lo0 192.168.255.3
| | | |
+-- 10.0.12.0/24 --+ +--- 10.0.23.0/24 -----+
(Area 0) (Area 1)
インタフェースはすべてGigabitEthernet、OSPFのプロセスIDは3台とも1で揃える。R2のLo0はArea 0に置く。参照帯域は既定(100Mbps)のまま始め、後半で変更する。
OSPFの基本動作
ネイバーのステート遷移
OSPFはIPプロトコル番号89で直接動作するリンクステート型のIGP。ネイバーは次の順に遷移し、FULLになって初めてLSDB(リンクステートデータベース)が同期した状態になる。
Down Helloをまだ受け取っていない
Init 相手のHelloを受信したが、その中に自分のルータIDが無い
2-Way 双方向を確認。ここでDR/BDRを選出する
ExStart マスター/スレーブを決め、DDのシーケンス番号を合わせる
Exchange DD(データベース記述)パケットでLSDBの目次を交換
Loading 足りないLSAをLSRで要求し、LSUで受け取る
Full LSDBが完全に同期した状態
止まった位置で原因の見当がつく。INITなら片側だけHelloが届いていない、EXSTART/EXCHANGEで止まるならMTU不一致、2WAYのままなのはブロードキャストセグメントでお互いDRotherという正常な状態のことがある(いずれも後述)。
DR / BDRの選出
ブロードキャストネットワークでは、隣接関係の数を抑えるためDRとBDRを選ぶ。DRother同士は2-Wayで止まり、FULLになるのはDR / BDRとの間だけ。
優先度(ip ospf priority)が大きい方がDR。既定は 1
優先度が同じならルータIDが大きい方がDR
優先度 0 のルータは選出対象外(DRother固定)
先に確立した側を保持する(プリエンプションしない)
宛先マルチキャストは 224.0.0.5(全OSPFルータ)と 224.0.0.6(DR/BDR宛)を使う。ポイントツーポイントではDRを選出しない。
ネットワークタイプ
タイプ Hello/Dead DR選出 ネイバー
broadcast 10 / 40 あり 自動検出
point-to-point 10 / 40 なし 自動検出
non-broadcast (NBMA) 30 / 120 あり 手動指定
point-to-multipoint 30 / 120 なし 自動検出
Ethernet上の既定はbroadcast。両端でタイプが違うとHello/Deadの値も食い違うため、ネイバーが上がらない。
LSAタイプ
Type 1 Router LSA エリア内。各ルータが自分のリンクを広報
Type 2 Network LSA エリア内。DRがセグメント上のルータ一覧を広報
Type 3 Summary LSA ABRが他エリアの経路をエリア間に流す
Type 4 ASBR Summary ABRがASBRの位置を知らせる
Type 5 AS External ASBRが再配布した外部経路。エリアを越えて全域に流れる
Type 7 NSSA External NSSA内の外部経路。ABRでType 5に変換される
Type 1 / 2 はエリア内で閉じる。エリアを分ける狙いは、この2つのフラッディング範囲とSPF再計算の範囲を区切ることにある。
メトリック(コスト)
コストは 参照帯域 ÷ インタフェース帯域 で決まる。小数は切り上げ、最小値は1。参照帯域の既定は100Mbps。
10Mbps 100 / 10 = 10
100Mbps 100 / 100 = 1
1Gbps 100 / 1000 = 0.1 → 1
10Gbps 100 / 10000 = 0.01 → 1
既定のままだと100Mbps以上がすべてコスト1になり区別がつかない。参照帯域は全台で同じ値に変更するのが前提になる。
基本設定
設定手順は次の3ステップ。
- ルータIDを固定する
- OSPFを有効化するインタフェースとエリアを指定する
- 対向にOSPFルータがいないインタフェースをパッシブにする
ルータIDの固定
ルータIDは「手動設定 → 最も大きいループバックのIP → 最も大きい物理インタフェースのIP」の順で決まる。自動選出に任せるとインタフェースの増減で変わってしまうため、必ず固定する。
R1の設定。
R1(config)# router ospf 1
R1(config-router)# router-id 192.168.255.1
R1(config-router)# passive-interface default
R1(config-router)# no passive-interface GigabitEthernet1
R1(config-router)# network 10.0.12.1 0.0.0.0 area 0
R1(config-router)# network 192.168.255.1 0.0.0.0 area 0
R1(config-router)# network 192.168.10.0 0.0.0.255 area 0
network のマスクはワイルドカードマスク。0.0.0.0 にすると「このアドレスのインタフェース1本だけ」を指定できるので、意図しないインタフェースが有効化されるのを防げる。
R2の設定。Gi1をArea 0、Gi2をArea 1に置くことでABRになる。
R2(config)# router ospf 1
R2(config-router)# router-id 192.168.255.2
R2(config-router)# passive-interface default
R2(config-router)# no passive-interface GigabitEthernet1
R2(config-router)# no passive-interface GigabitEthernet2
R2(config-router)# network 10.0.12.2 0.0.0.0 area 0
R2(config-router)# network 192.168.255.2 0.0.0.0 area 0
R2(config-router)# network 10.0.23.2 0.0.0.0 area 1
R3の設定。
R3(config)# router ospf 1
R3(config-router)# router-id 192.168.255.3
R3(config-router)# passive-interface default
R3(config-router)# no passive-interface GigabitEthernet1
R3(config-router)# network 10.0.23.3 0.0.0.0 area 1
R3(config-router)# network 192.168.255.3 0.0.0.0 area 1
R3(config-router)# network 192.168.30.0 0.0.0.255 area 1
ネイバーが確立するとログが出る。
R1#
*Aug 26 11:04:52.331: %OSPF-5-ADJCHG: Process 1, Nbr 192.168.255.2 on GigabitEthernet1 from LOADING to FULL, Loading Done
インタフェース側で指定する書き方
network コマンドの代わりに、インタフェース配下で直接エリアを指定できる。どのインタフェースがどのエリアかがコンフィグ上で追いやすいため、新規構築ではこちらを使うことが多い。
R1(config)# interface GigabitEthernet1
R1(config-if)# ip ospf 1 area 0
両方の書き方を混在させると設定箇所が分散して見落とすため、機器内でどちらかに統一する。
パッシブインタフェース
パッシブにしたインタフェースはHelloを送出しなくなるが、そのサブネット自体はLSAで広報され続ける。LAN側やサーバ収容セグメントは必ずパッシブにする。passive-interface default で全体をパッシブにしてから、ルータ間のリンクだけ no passive-interface で戻すのが安全。
認証
インタフェース単位で設定する場合。両側で同じキーIDと文字列を使う。
R1(config)# interface GigabitEthernet1
R1(config-if)# ip ospf authentication message-digest
R1(config-if)# ip ospf message-digest-key 1 md5 <任意のパスワード>
エリア全体に効かせる場合はプロセス配下で指定し、鍵はインタフェースごとに設定する。
R1(config-router)# area 0 authentication message-digest
確認方法
ネイバーの状態
R1# show ip ospf neighbor
Neighbor ID Pri State Dead Time Address Interface
192.168.255.2 1 FULL/DR 00:00:35 10.0.12.2 GigabitEthernet1
Neighbor IDは相手のルータIDで、Addressの対向インタフェースアドレスとは別物。ここを混同すると切り分けがずれる。State欄はスラッシュの左がネイバーステート、右がそのセグメント上での相手の役割。
インタフェースの設定値
R1# show ip ospf interface brief
Interface PID Area IP Address/Mask Cost State Nbrs F/C
Lo0 1 0 192.168.255.1/32 1 LOOP 0/0
Gi2 1 0 192.168.10.1/24 1 DR 0/0
Gi1 1 0 10.0.12.1/24 1 BDR 1/1
パッシブにしたGi2はネイバーが0のままDRとして表示される。異常ではない。
ネイバーが上がらないときは、詳細表示で両側の値を突き合わせる。
R1# show ip ospf interface GigabitEthernet1
GigabitEthernet1 is up, line protocol is up
Internet Address 10.0.12.1/24, Area 0, Attached via Network Statement
Process ID 1, Router ID 192.168.255.1, Network Type BROADCAST, Cost: 1
Topology-MTID Cost Disabled Shutdown Topology Name
0 1 no no Base
Transmit Delay is 1 sec, State BDR, Priority 1
Designated Router (ID) 192.168.255.2, Interface address 10.0.12.2
Backup Designated router (ID) 192.168.255.1, Interface address 10.0.12.1
Timer intervals configured, Hello 10, Dead 40, Wait 40, Retransmit 5
oob-resync timeout 40
Hello due in 00:00:03
...
Neighbor Count is 1, Adjacent neighbor count is 1
Adjacent with neighbor 192.168.255.2 (Designated Router)
照合するのは Area / Network Type / Cost / Hello / Dead / 認証の6点。
LSDB
R1# show ip ospf database
OSPF Router with ID (192.168.255.1) (Process ID 1)
Router Link States (Area 0)
Link ID ADV Router Age Seq# Checksum Link count
192.168.255.1 192.168.255.1 287 0x80000005 0x00B3A1 3
192.168.255.2 192.168.255.2 284 0x80000004 0x0059C7 2
Net Link States (Area 0)
Link ID ADV Router Age Seq# Checksum
10.0.12.2 192.168.255.2 284 0x80000001 0x00A21B
Summary Net Link States (Area 0)
Link ID ADV Router Age Seq# Checksum
10.0.23.0 192.168.255.2 271 0x80000001 0x006D33
192.168.30.0 192.168.255.2 271 0x80000001 0x00C15E
192.168.255.3 192.168.255.2 271 0x80000001 0x001B87
Router Link StatesがType 1、Net Link StatesがType 2、Summary Net Link StatesがType 3。Area 1の経路(10.0.23.0 / 192.168.30.0 / 192.168.255.3)がABRのR2からType 3として流れてきているのが読み取れる。Area 1のType 1 / 2 はここには現れない。
AgeはLSAの経過秒数で、上限3600秒(MaxAge)。30分ごとにリフレッシュされてSeq#が1つ進む。Ageが常に小さい値にリセットされ続けるLSAがあれば、その広報元でフラッピングが起きている。
ルーティングテーブル
R1# show ip route ospf
...
Gateway of last resort is not set
10.0.0.0/8 is variably subnetted, 3 subnets, 2 masks
O IA 10.0.23.0/24 [110/2] via 10.0.12.2, 00:12:41, GigabitEthernet1
192.168.30.0/24 is subnetted, 1 subnets
O IA 192.168.30.0 [110/3] via 10.0.12.2, 00:12:41, GigabitEthernet1
192.168.255.0/32 is subnetted, 3 subnets
O 192.168.255.2 [110/2] via 10.0.12.2, 00:12:41, GigabitEthernet1
O IA 192.168.255.3 [110/3] via 10.0.12.2, 00:12:41, GigabitEthernet1
行頭のコードで経路の出どころが分かる。
O エリア内(intra-area)
O IA エリア間(inter-area)。ABR経由
O E1 外部(Type 5)。外部コスト + 途中のOSPFコスト
O E2 外部(Type 5)。外部コストのみ。再配布時の既定
O N1 NSSA内の外部(Type 7)。コストを加算する
O N2 NSSA内の外部(Type 7)。加算しない
AD値は110。[110/2] の2がコストの合計値。
プロセス全体
R1# show ip ospf
Routing Process "ospf 1" with ID 192.168.255.1
...
Initial SPF schedule delay 5000 msecs
Minimum hold time between two consecutive SPFs 10000 msecs
Maximum wait time between two consecutive SPFs 10000 msecs
...
Number of areas in this router is 1. 1 normal 0 stub 0 nssa
Area BACKBONE(0)
Number of interfaces in this area is 3 (1 loopback)
Area has no authentication
SPF algorithm last executed 00:12:44.128 ago
SPF algorithm executed 5 times
Area ranges are
Number of LSA 6. Checksum Sum 0x0342F1
SPF algorithm executed の回数は安定性の目安になる。短時間で増え続けているならどこかのリンクが不安定。
経路制御
コストの調整
個別に固定するならインタフェース配下で指定する。帯域の設定値に依存しなくなるため、確実に効かせたい経路はこちらを使う。
R1(config-if)# ip ospf cost 50
全体の分解能を上げるなら参照帯域を変更する。変更するとコストの計算基準が変わるため、必ず全台に同じ値を入れる。
R1(config-router)# auto-cost reference-bandwidth 10000
% OSPF: Reference bandwidth is changed.
Please ensure reference bandwidth is consistent across all routers.
変更後、1Gbpsのインタフェースがコスト10になる。
R1# show ip ospf interface brief
Interface PID Area IP Address/Mask Cost State Nbrs F/C
Lo0 1 0 192.168.255.1/32 1 LOOP 0/0
Gi2 1 0 192.168.10.1/24 10 DR 0/0
Gi1 1 0 10.0.12.1/24 10 BDR 1/1
エリア間の経路集約
集約できるのはABRだけで、対象は自分が接しているエリアの経路。R3側に 192.168.31.0/24 も存在する構成として、R2でまとめる。
R2(config)# router ospf 1
R2(config-router)# area 1 range 192.168.30.0 255.255.254.0
R1側では1本にまとまる。
R1# show ip route ospf | include 192.168.3
O IA 192.168.30.0/23 [110/3] via 10.0.12.2, 00:00:21, GigabitEthernet1
集約したABRには、ループ防止のための破棄経路がNull0向けに自動生成される。
R2# show ip route ospf | include Null0
O 192.168.30.0/23 is a summary, 00:00:21, Null0
集約範囲内の経路が1本でも生きていれば集約経路は広報され続ける。範囲の中に存在しないサブネットを含めると、そこ宛のトラフィックをABRまで引き込んで捨てることになるので、範囲は実在するアドレス計画に合わせて決める。
外部経路の再配布
R3でスタティックルートを再配布し、ASBRにする。
R3(config)# ip route 172.16.0.0 255.255.0.0 Null0
R3(config)# router ospf 1
R3(config-router)# redistribute static subnets
subnets を省くとクラスフル境界に一致する経路しか再配布されない。新しめのIOS-XEでは自動で付与されるが、明示しておくと確実。
R1から見ると外部経路として入る。
R1# show ip route ospf | include 172.16
O E2 172.16.0.0/16 [110/20] via 10.0.12.2, 00:01:03, GigabitEthernet1
既定はメトリック20のE2。E2は途中のOSPFコストを加算しないため、出口が複数あってもメトリックで区別できない。出口が複数ある構成では、近い方を選ばせるためにE1にする。
R3(config-router)# redistribute static subnets metric 100 metric-type 1
デフォルトルートの配布
上流を持つルータでOSPFにデフォルトルートを流す。
R1(config-router)# default-information originate
既定では自分のルーティングテーブルにデフォルトルートが無いと広報されない。always を付けると自分に無くても広報するが、上流が落ちてもエリア全体がR1に吸い寄せられてブラックホールになるため、使う場合はトラッキングとセットで考える。
R1(config-router)# default-information originate always metric 10 metric-type 1
受け取り側では先頭に *(候補デフォルトルート)が付く。
R2# show ip route ospf | include 0.0.0.0
O*E2 0.0.0.0/0 [110/1] via 10.0.12.1, 00:00:14, GigabitEthernet1
スタブエリア
末端のエリアに外部経路(Type 5)を持ち込まないことで、LSDBとルーティングテーブルを小さくする。
エリア種別 Type 3 Type 5 Type 7 デフォルトルート
normal ○ ○ × ―
stub ○ × × ABRが自動注入
totally stubby × × × ABRが自動注入
NSSA ○ × ○ 既定では注入しない
totally NSSA × × ○ ABRが自動注入
設定はエリア内の全ルータで一致させる。HelloのE / Nビットが食い違うとネイバーが上がらない。
R2(config-router)# area 1 stub
R3(config-router)# area 1 stub
totally stubbyにする場合、no-summary を付けるのはABR側だけでよい。
R2(config-router)# area 1 stub no-summary
ただしこの構成はR3が再配布しているASBRなので、Area 1はstubにできない。その場合はNSSAを使う。
R2(config-router)# area 1 nssa
R3(config-router)# area 1 nssa
NSSA内ではType 7として見える。
R2# show ip route ospf | include 172.16
O N2 172.16.0.0/16 [110/20] via 10.0.23.3, 00:00:31, GigabitEthernet2
ABRでType 5に変換されるため、Area 0側のR1からは O E2 のまま見える。NSSAは既定でデフォルトルートを注入しないので、必要なら明示する。
R2(config-router)# area 1 nssa default-information-originate
ハマりどころ
ネイバーが上がらない
Helloに含まれる次の値が一致していないとネイバーにならない。両側で show ip ospf interface を出して突き合わせる。
エリア番号
Hello / Dead インターバル
サブネットマスク(同じセグメントとして見えているか)
認証方式と鍵
スタブフラグ(E / Nビット)
MTU(DDパケットで比較。EXSTART / EXCHANGEで止まる)
デバッグは対象を絞って打つ。本番機で debug ip ospf packet のような広い対象は避ける。
R1# debug ip ospf adj
R1# debug ip ospf hello
EXSTART / EXCHANGEから進まない
MTU不一致が定番。DDパケットにMTU値が入っており、一致しないとここで止まる。
R1# show ip ospf neighbor
Neighbor ID Pri State Dead Time Address Interface
192.168.255.2 1 EXSTART/DR 00:00:33 10.0.12.2 GigabitEthernet1
正しい対処は両側のMTUを揃えること。ベンダ混在などで揃えられない場合のみ、比較を無効化する。
R1(config-if)# ip ospf mtu-ignore
ループバックが /32 で広報される
ループバックのOSPFネットワークタイプはLOOPBACKになり、設定したマスクに関係なくホストルートとして広報される。実際のマスクで流したい場合はタイプを変更する。
R1(config)# interface Loopback0
R1(config-if)# ip ospf network point-to-point
2-Wayのままなのが正常な場合がある
ブロードキャストセグメントに3台以上いる場合、DRother同士は2-Wayで止まる。仕様どおりの動作で、DR / BDRとの間がFULLなら問題ない。
R1# show ip ospf neighbor
Neighbor ID Pri State Dead Time Address Interface
192.168.255.2 1 FULL/DR 00:00:34 10.0.12.2 GigabitEthernet1
192.168.255.4 1 FULL/BDR 00:00:31 10.0.12.4 GigabitEthernet1
192.168.255.5 0 2WAY/DROTHER 00:00:36 10.0.12.5 GigabitEthernet1
DRを固定したいルータ以外は優先度0にしておくと、意図しない機器がDRになるのを防げる。
Area 0が分断されている
非バックボーンエリアはすべてArea 0に接している必要がある。物理的に用意できない場合はバーチャルリンクで論理的につなぐ。両端のABRで、経由する中継エリアと相手のルータIDを指定する。
R2(config-router)# area 1 virtual-link 192.168.255.3
R3(config-router)# area 1 virtual-link 192.168.255.2
指定するのはインタフェースのアドレスではなくルータID。中継エリアはスタブにできない。障害切り分けが難しくなるため、恒久構成ではなく移行期間の暫定手段にとどめる。
参照帯域が揃っていない
1台だけ auto-cost reference-bandwidth を変えると、その機器から見たコストだけが大きくなり、行きと帰りで経路が変わる。設計時に値を決めて全台に入れる。確認は show ip ospf interface のCost欄。
SPFが頻繁に走る
フラッピングしているリンクがあると、そのたびにエリア全体でSPFが再計算される。
R1# show ip ospf | include SPF algorithm executed
SPF algorithm executed 47 times
短時間で増えている場合、Dead間隔を延ばして誤魔化すのではなく物理側を先に疑う。あわせて、対向にOSPFルータがいないインタフェースがパッシブになっているかを確認する。パッシブ漏れは不要な隣接とHelloを生み、影響範囲を無駄に広げる。