CCNA合格に向けてOSPFの学習内容を簡単にまとめました。
OSPFの基本概念
OSPF(Open Shortest Path First)は、ダイナミックルーティングの一つで、IGP(Interior Gateway Protocol)に分類されるリンクステート型ルーティングプロトコルです。
リンクステート型では、ルータ同士がLSA(Link-State Advertisement)を交換し、その情報をもとにLSDB(Link-State Database)を作成する。
各ルータはLSDBをもとにSPFアルゴリズムを用いて最短経路を計算し、ルーティングテーブルを生成する。
OSPFのメトリックにはコストを用いる。
$$
Cost = \frac {100M [bps]}{帯域幅[bps]}
$$
RIPのように定期的にルーティングテーブル全体を交換する方式と比べると、OSPFはHelloパケットによる生存確認と、トポロジ変更時の更新が中心となるため、トラフィックを抑えやすく、コンバージェンスも速い。
また、エリアによってネットワークを階層化できるため、大規模ネットワークに適している。一方で、SPF計算を行うため、ルータ負荷は比較的高くなる。
OSPFの動作
Hello で Neighbor 関係と DR/BDR(役割)を決定し、DR/BDR とだけ Adjacency を形成する。
その Adjacency 間で LSDB を同期し、最終的に全ルータが同じトポロジを持ってルーティングを確定する。
OSPF動作順序
OSPFは次の流れで動作する。
- Helloパケットで隣接ルータを発見する
- ネイバー関係を形成する(DR、BDRの選出)
- 必要に応じてアジャセンシーを確立する
- DBDパケットでLSDBの概要を交換する
- LSRで不足しているLSAを要求する
- LSUでLSAを送信する
- LSAckで受信確認を返す
- LSDBを同期する
- SPF計算を行う
- ルーティングテーブルを生成する
OSPFパケット
OSPFのパケットはIPヘッダでカプセル化された情報であるため、それ以上のトランスポート層でカプセル化を行っていない
| タイプ | パケット名 | 各パケットの説明 |
|---|---|---|
| 1 | Hello | Helloパケットは、定期的に送信されるネイバーを発見と維持に使用される。DR、BDRの選出に使われる。Hello / Deadインターバルの一致が必要で、マルチキャスト ( 224.0.0.5 ) として送信される。 |
| 2 | DBD(Database Description) | アジャセンシを形成するネイバーに自身のLSDBに含まれるLSAの概要を通知する。 |
| 3 | LSR(Link State Request) | 不足しているLSAを要求する。 |
| 4 | LSU(Link State Update) | 要求されたLSAを送信する。 |
| 5 | LSAck(Link State Acknowledgement) | LSUを受信したことを通知するための確認応答として送信。 |
OSPFの構成要素
ルータID
OSPFルータを一意に識別するIDで、IPv4形式で表現される。
一般にループバックインターフェースのIPアドレスが使われる。
ネイバーとアジャセンシー
- ネイバー:Helloを交換した状態
- アジャセンシー:LSDB同期まで行う、論理的な隣接関係
OSPFデータベース
| テーブル名 | 説明 |
|---|---|
| ネイバーテーブル | Helloパケットを受け取ったルータ情報(隣のルーター)を格納したデータベース |
| LSDB(トポロジテーブル) | LSAを格納したOSPFネットワークのトポロジ情報を保持するデータベース |
| ルーティングテーブル | SPF計算の結果として作成される経路情報。 |
メトリック
- OSPFではコストで経路選択を行う
- 基本的には帯域幅をもとに決まる
- コストの小さい経路が優先される
SPFアルゴリズム
- Dijkstraアルゴリズムを利用する
- LSDBから最短経路木を作成する
- その結果をルーティングテーブルへ反映する
DR / BDR
ブロードキャストネットワークでは、全ルータ同士が完全に隣接すると非効率になるため、代表ルータを選出する。DR、BDRは全ルーターとアジャセンシを形成する。
- DR:Designated Router
- BDR:Backup Designated Router
DR / BDR は、Helloパケットの交換時に選出される。
選出はOSPFプライオリティが高い方が優先され、同じ場合はRouter IDが大きい方が優先される。
ポイントツーポイント回線(ルーターの一対一接続)では通常不要であり、Ethernetのようなマルチアクセス環境で重要となる。
補足:OSPFの状態遷移
OSPFネイバーは、次のような状態を経て確立される。
Down → Init → 2-Way → ExStart → Exchange → Loading → Full
- 2-Way:Helloのやり取りが成立した状態
- Full:LSDB同期が完了した状態
補足:ネイバー成立条件
OSPFでネイバー関係を形成するには、主に次の条件が一致している必要がある。
| 条件 | 説明 |
|---|---|
| エリア番号 | 同じエリアに属している必要がある。 |
| Helloインターバル | Helloパケットの送信間隔が一致している必要がある。 |
| Deadインターバル | ネイバーをダウンと判断するまでの時間が一致している必要がある。 |
| サブネット | 同一セグメントとして通信できる必要がある。 |
| MTUサイズ | DBD交換時などで不一致があるとアジャセンシー確立に失敗することがある。show interface で確認できる。 |
OSPFの設計
エリア
OSPFは階層設計が可能であり、大規模ネットワークではLSDB肥大化やSPF計算負荷を抑えるためにエリア分割を行う。トポロジーを分割する
Backbone Area(Area 0)
- Area 0 がバックボーンエリア
- 他エリアは原則としてArea 0 に接続する
ルータの役割
-
内部ルータ
すべてのインターフェースが同一エリア内にあるルータ -
ABR
複数エリアを接続するルータ。Area 0 と他エリアの境界に存在する -
ASBR
外部経路を再配布するルータ -
Backbone Router
Area 0 に接続しているルータ
OSPFの実装
基本設定
1. OSPFの有効化
プロセスIDは1から65,535の値で指定可能
Router(config)# router ospf <プロセスID>
2. Router IDの設定
DR, BDRを選出するための設定
Router(config)# router ospf <プロセスID>
Router(config-router)# router-id <ルーターID>
## ループバックインターフェースを作成し、そのIPアドレスをRouter IDとして利用することもある。
Router(config)# interface loopback 0
Router(config-if)# ip address <IPアドレス> 255.255.255.255
3. インターフェースの指定
指定ネットワークに一致する現在設定しているルーターのインターフェースをOSPFに参加させるための条件指定であり、相手機器を直接指定するものではない。
Hellowパケットの送受信をする
Router(config)# router ospf <プロセスID>
Router(config-router)# network <ネットワーク> <ワイルドカードマスク> area <エリアID>
## インターフェース設定モードで直接指定することもできる
Router(config)# interface <インターフェース>
Router(config-if)# ip ospf <プロセスID> area <エリアID>
補助設定
- passive-interface
- デフォルトルートの配布
- ネットワークタイプの変更
- ルータプライオリティの変更
- コストの変更
- 帯域幅の変更
- Hello / Deadインターバルの変更
- MTUミスマッチ検出の無効化
## passive-interface:Helloパケットを送信せず、ネイバーを形成しない
Router(config)# router ospf <プロセスID>
Router(config-router)# passive-interface <インターフェース>
## デフォルトルートの配布:OSPFでデフォルトルートを広報する
Router(config-router)# default-information originate [always]
## ネットワークタイプの変更:OSPFが回線をどう扱うかを変更する
Router(config-if)# ip ospf network <broadcast | non-broadcast | point-to-multipoint | point-to-point>
## ルータプライオリティの変更:DR / BDR選出時の優先度を変更する
Router(config-if)# ip ospf priority <ルータープライオリティ>
## コストの変更:OSPFのメトリックを手動で変更する
Router(config-if)# ip ospf cost <コスト>
## 帯域幅の変更:コスト計算に影響する帯域値を変更する
Router(config-if)# bandwidth <帯域幅>
## Hello / Deadインターバルの変更:ネイバー監視に使うタイマーを変更する
Router(config-if)# ip ospf hello-interval <秒数>
Router(config-if)# ip ospf dead-interval <秒数>
## MTUミスマッチ検出の無効化:MTU不一致による隣接失敗を回避する場合に使う
Router(config-if)# ip ospf mtu-ignore
確認コマンド
## ネイバーの確認
Router# show ip ospf neighbor
## LSDBの要約情報の確認
Router# show ip ospf database
## OSPFのプロトコルの確認
Router# show ip protocols
## インターフェースの確認
Router# show ip ospf interface [インターフェース]
設定例
設定コマンド
--------------router1のconfig--------------
!
!
interface Loopback0
ip address 10.10.10.1 255.255.255.255
!
interface FastEthernet0/0
ip address 172.16.10.1 255.255.255.0
ip ospf 1 area 0
duplex auto
speed auto
!
interface FastEthernet0/1
ip address 192.168.100.1 255.255.255.0
ip ospf 1 area 0
duplex auto
speed auto
!
!
router ospf 1
log-adjacency-changes
network 172.16.10.0 0.0.0.255 area 0
network 192.168.100.0 0.0.0.255 area 0
!
--------------router2のconfig--------------
!
interface Loopback0
ip address 10.10.10.2 255.255.255.255
!
interface FastEthernet0/0
ip address 192.168.100.2 255.255.255.0
ip ospf 1 area 0
duplex auto
speed auto
!
interface FastEthernet0/1
ip address 192.168.150.1 255.255.255.0
ip ospf 1 area 1
duplex auto
speed auto
!
interface Vlan1
no ip address
shutdown
!
router ospf 1
log-adjacency-changes
network 192.168.100.0 0.0.0.255 area 0
network 192.168.150.0 0.0.0.255 area 1
!
--------------router3のconfig--------------
!
interface Loopback0
ip address 10.10.10.3 255.255.255.255
!
interface FastEthernet0/0
ip address 192.168.150.2 255.255.255.0
ip ospf 1 area 1
duplex auto
speed auto
!
interface FastEthernet0/1
ip address 172.16.30.1 255.255.255.0
ip ospf 1 area 1
duplex auto
speed auto
!
interface Vlan1
no ip address
shutdown
!
router ospf 1
log-adjacency-changes
network 192.168.150.0 0.0.0.255 area 1
network 172.16.30.0 0.0.0.255 area 1
!

