OSPFとは

OSPF(Open Shortest Path First)は、業界標準(RFCで規定)のリンクステート型の動的ルーティングプロトコルです。各ルータが、自分に直接つながっているリンクの情報を近隣のルータへ広告し合い、単一エリア構成では最終的にそのエリア内のトポロジ情報(リンクステートデータベース)を全ルータが共有したうえで、最短経路を各自が計算します。CCNA 200-301では、IPv4向けのOSPFv2を、単一エリアの構成で扱います。単一エリア構成で使用するエリアは必ずしもエリア0ではありませんが、本記事ではエリア0を使用します。

OSPFv2の基本設定

Router(config)# router ospf 1
Router(config-router)# network 192.168.1.0 0.0.0.255 area 0
Router(config-router)# network 192.168.2.0 0.0.0.255 area 0

router ospf 1の「1」はプロセスIDで、ルータ内部でOSPFの設定インスタンスを識別するためのローカルな番号です(他のルータと一致させる必要はありません)。networkコマンドでは、OSPFを有効にしたいインターフェイスのIPアドレスに一致する範囲を、ワイルドカードマスク(通常はサブネットマスクを反転させた形式)で指定し、所属させるエリア番号を指定します。

ルータID(Router ID)

OSPFでは、ネットワーク内の各ルータを一意に識別するために、32ビットのルータIDが使われます。ルータIDはOSPFドメイン内で一意でなければならず、重複すると隣接関係の確立・維持に問題が生じます。ルータIDは、次の優先順位で自動的に決定されます。

  1. router-idコマンドで明示的に設定された値
  2. アップ状態のループバックインターフェイスの中で、最も大きいIPアドレス
  3. アップ状態の非ループバックインターフェイスの中で、最も大きいIPアドレス
Router(config-router)# router-id 1.1.1.1

OSPFプロセスがすでに動作してルータIDが決定済みの場合、router-idコマンドで変更した値を反映するには、clear ip ospf processでOSPFプロセスを再起動するか、ルータを再起動する必要があります。

ループバックインターフェイスは、物理的なリンク状態に左右されず常にアップ状態を維持できるため、意図せずルータIDが変わってしまう事態を避けるために、明示的なrouter-idコマンドの設定や、ループバックインターフェイスの利用が推奨されます。

ネイバーとの隣接関係の確立

OSPFが動作するルータどうしは、まずネイバー関係を確立します。ネットワークタイプに応じて必要な相手とは、さらにFull状態の隣接関係を確立します。一般的なブロードキャストネットワークおよびポイントツーポイントネットワークでは、次の7つの状態を遷移します。

  1. Down:まだHelloパケットを受信していない状態です。
  2. Init:Helloパケットを受信したが、その中に自分自身のルータIDがまだ含まれていない状態です。
  3. 2-Way:双方向の通信が確認できた状態です。お互いのHelloパケットに、相手のルータIDが含まれています。ブロードキャストネットワークでのDR/BDRの選出は、この段階で行われます。
  4. ExStart:データベース記述(DBD)パケットをやり取りするための、主・従の関係とシーケンス番号を決定します。
  5. Exchange:LSA(リンクステートアドバタイズメント)のヘッダー情報を含むDBDパケットを交換します。
  6. Loading:不足しているLSAの詳細情報を要求・受信します。
  7. Full:双方のリンクステートデータベースが完全に同期した状態です。

ブロードキャストネットワークでのDR/BDR選出

イーサネットのようなブロードキャストネットワーク(複数のルータが同一セグメントに接続される環境)では、すべてのルータどうしが個別にFull状態まで隣接関係を確立すると、やり取りされる情報量が急増してしまいます。これを避けるため、OSPFはセグメントごとにDR(Designated Router、指定ルータ)とBDR(Backup Designated Router、バックアップ指定ルータ)を1台ずつ選出します。

  • DR・BDR以外のルータ(DROTHER)は、DR・BDRとの間だけFull状態まで隣接関係を確立し、DROTHERどうしの間は2-Wayの状態にとどまります。
  • DR・BDRの選出は、OSPFプライオリティ(設定可能な値は0〜255、既定値1、値が大きいほど優先)が最も高いルータがDRに、次に高いルータがBDRになります。プライオリティが同じ場合は、ルータIDが最も大きいルータが優先されます。プライオリティを0に設定すると、そのルータはDR・BDRに選出されなくなります。

OSPFプライオリティは、インターフェイスコンフィギュレーションモードで、インターフェイスごとに変更できます。

Router(config)# interface GigabitEthernet0/0
Router(config-if)# ip ospf priority 100

このインターフェイスのOSPFプライオリティを100に設定しており、既定値(1)より高いため、次回のDR/BDR選出時には同じセグメント上の他のルータより優先してDRに選出されやすくなります。逆にip ospf priority 0と設定すれば、そのインターフェイスはDR・BDRのいずれにも選出されなくなります。

DR/BDRの選出は通常非プリエンプティブであり、すでにDR/BDRが選出されている場合、後からより高いプライオリティを持つルータが参加しても役割は自動的に変わりません。プライオリティ変更後に再選出するには、既存のDR/BDRを含めて対象セグメントのOSPF隣接関係をリセットし、再選出を発生させる必要があります。

一方、ルータ間を1対1で直接接続するポイントツーポイントネットワーク(シリアルリンク等)では、接続相手は常に1台だけであるため、DR/BDRの選出自体が行われず、双方がそのままFull状態まで隣接関係を確立します。

設定の確認

ネイバーの確認

Router# show ip ospf neighbor

Neighbor ID     Pri   State           Dead Time   Address         Interface
192.168.2.2     1     FULL/DR         00:00:36    192.168.1.2     GigabitEthernet0/0
192.168.3.3     1     FULL/DROTHER    00:00:32    192.168.1.3     GigabitEthernet0/0

State列のFULL/DRは、そのネイバーがDRであり、隣接関係がFullまで確立していることを示します。FULL/DROTHERは、そのネイバーがDR・BDRのどちらでもなく(DROTHER)、自ルータがBDRであるため隣接関係がFullまで確立していることを示します。DROTHERどうしでは2WAY/DROTHERとなり、ブロードキャストネットワークでは正常な状態です。

インターフェイスごとの状態の確認

show ip ospf neighborがネイバーごとの状態を示すのに対して、show ip ospf interface briefは、自ルータ上でOSPFが有効になっているインターフェイスごとの状態を、1行にまとめて確認できます。

Router# show ip ospf interface brief

Interface    PID   Area            IP Address/Mask    Cost  State Nbrs F/C
Gi0/0        1     0               192.168.1.1/24     1     BDR   2/2
Gi0/1        1     0               192.168.2.1/24     1     P2P   1/1

各行で、所属エリア・OSPFコスト・インターフェイスの状態(DR/BDR/DROTHER/P2P等)・ネイバー数(Nbrs F/C=Full状態の数/合計数)を一目で確認できます。どのインターフェイスでOSPFが有効になっているか、それぞれがどの役割(DR/BDR/DROTHER/P2P)になっているかを素早く把握したいときに便利なコマンドです。

OSPFプロセス全体の確認

Router# show ip protocols

Routing Protocol is "ospf 1"
  Router ID 1.1.1.1
  ...

show ip protocolsでは、ルータID、有効になっているOSPFプロセス、ネットワークステートメントなど、OSPFの設定全体の概要を確認できます。