ネットワーク

Cisco IOS OSPF 設定とエリア設計のまとめ

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ステップ。

  1. ルータIDを固定する
  2. OSPFを有効化するインタフェースとエリアを指定する
  3. 対向に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を生み、影響範囲を無駄に広げる。

-ネットワーク
-, , ,