OSPF(Open Shortest Path First)

# 概要
OSPFはIGPに分類され、RIPで問題になっていた部分が改良され作成された

+ **様々なメーカーのルータを使用できる**
RFC(Request for Comments)で標準仕様が規定されているため、Cisco独自のダイナミックルーティングプロトコルと違い、様々なメーカーのルータで使用可能

+ **リンクステート型のプロトコル**
各ルータのIPアドレスなどのインターフェイスの情報(リンクステート)を交換する。この情報を**LSA（Link State Advertisement**）といい、ネットワーク内のOSPFが動作している他のルータに通知する。**LSDB(Link State DataBase**)と呼ばれる各ルータがネットワークのトポロジを記録したデータベースを持っており、各ルータから収集したLSAはこのデータベースに格納され、各ルータで同一の内容となる。


+ **ルーティングプロトコルのトラフィック量を削減できる**
隣接ルータ（ネイバー）の検出と生存確認のために小さな**Helloパケット**だけを送信する。ネットワークに変更があった場合、全ての情報ではなく差分情報のみをアップデートするため、トラフィック量の削減になる。

+ **コンバージェンスが速い**
ネットワークに変更があると変更内容をすぐに送信し他のルータに伝える。


+ **VLSM(Variable Lngth subnet Mask)に対応している**
異なるサブネットマスクのネットワークが存在している環境でも、問題なく対応できる。


+ **ネットワークを階層化できる**
+ メトリックとしてコストを使用する
+ ルーティング認証をサポートしている

#### デメリット
RIPと比べて機能が多い分動作が複雑になる。また、各ルータがデータベースを持ちそこから計算を行うため、メモリやCPUへの負荷が大きくなる。


# 基本動作
ルータ間で次のようにやり取りした後、コンバージェンスになる。

### 1.Helloパケットを交換してネイバーを検出する
OSPFを動作させたルータは、まずHelloパケットを**全OSPFルータ宛を意味するマルチキャストアドレスの`224.0.0.5`宛**に送信する。Helloパケットには隣接ルータの発見と生存確認が役割としてあり、Helloパケットを受け取り、隣として認識したルータを**ネイバー**という。


### 2.ネイバーテーブルにネイバーを登録する
Helloパケットを受け取ったルータは、ネイバー一覧を保持する**ネイバーテーブル**に送信元のルータを登録し、そのルータの状態を**Initステート**に設定する。
ネイバーとして関係を確立するためには、以下の情報を一致させる必要がある。

:::note info
+ **Helloインターバル**(Helloパケットを送信する間隔)
+ **Deadインターバル**(Helloパケットを受信しなくなりダウンしたとみなすまでの時間)
+ **スタブエリアフラグ**(外部経路をデフォルトルートに変換する)
+ **サブネットマスク**
+ **認証情報**
+ **エリアID**
+ **MTU(Maximum Transmission Unit)サイズ**(1回の通信で送信することができる最大パケットのサイズ)
:::


### 3. 相互を認識し、LSDBの交換の準備をする
相手から受け取ったHelloパケットのネイバー一覧に自身が記録されている場合、**2-Wayステート**という状態になる。お互いを認識し、LSDBを同期させるための準備が出来ている状態。


### 4.ルータ間でDBDパケットを交換する
相互に2-Wayステートになった後、**DBD(DateBase Description)パケット**を使用して各ルータが持つLSDBの要約情報を交換する。DBDパケットを交換するとき、2つのルータ間でマスターとスレーブの関係を築く。
マスターとスレーブの役割の決定を行っている状態を**Exstartステート**をいい、2つのルータの関係は**Exchangeステート**に移行する。


### 5.詳細なLSA情報を交換する
ルータは、Exchangeステートの時に相手から受け取ったDBDパケットに新しいLSAの情報が見つかった場合、ネイバーに対して**LSR(Link State Request)パケット**を送信して詳細情報を要求する。LSRパケットを受け取ったネイバーは、インターフェイスの情報などを格納したLSAの集合体である更新用の**LSU(Link State Update)パケット**を送信する。
お互いに最新の状態を取得し最終的にLSDBの同期が完了すると、**アジャセンシ―（完全な隣接関係**）になり、この状態を**Fullステート**という。




## マルチアクセスの場合の動作
スイッチに複数のルータが接続されている状況の場合、複数のルータのどの部分を完全な隣接関係にするかを決定する必要があり、以下のものをそれぞれ選ぶ

+ **DR(Designated Router):代表ルータ**
+ **BDR(Backup Designated Router):バックアップ代表ルータ**

DRおよびBDRとだけ完全な隣接関係を結ぶ。DRとBDRに選出されなかったルータを**DROther**という。

:::note info
DRother同士はネイバーとなるが、直接LSAの交換は行わないため、アジャセンシ―とはならず2-Wayステートで留まる。
:::

![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/a0018a22-886c-7e67-3ee6-1bb34b79ee98.png)

DRとBDRの選択基準として、ルータプライオリティとルータIDを規定している。

### ルータプライオリティ
ルータのインターフェイスごとに決定できる値のこと。Helloパケットに含まれるため、送受信することでお互いのルータプライオリティを知ることができる。**デフォルト値は1で、0に設定すると選出されない**。
マルチアクセス環境の場合、ルータプライオリティの値が大きいルータがDR、2番目に大きいルータがBDRに選ばれる。DRに障害が発生した場合は、BDRがDRに昇格しDROTHERからBDRが選ばれる。

:::note warn
旧DRが復帰してもDRには戻らない。
:::


### ルータID
各ルータを識別する一意の値でIPアドレスと同じ書式となる。ルータIDの値が**最も大きいルータがDR、2番目に大きいルータがBDR**に選ばれる。次の基準で決定される。

1. `router-id`コマンドによって手動で設定された値
2. ルータの有効なループバックインターフェイスのIPアドレスの中で最も大きなIPアドレス
3. 有効な物理インターフェイスのIPアドレスの中で最も大きなIPアドレス

::: note info
**ループバックインターフェイスとは？？**
管理者が任意で作成できる仮想的なインターフェイスで、意図的にシャットダウンしない限りダウンしない。物理インターフェイスより優先される
:::

![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/60b3a30e-f80c-8a9a-21a3-dcd906274093.png)

:::note warn
同じルータIDを持つルータ同士ではネイバー関係を構築することが出来ない
:::



# ルートの選択

### コストの計算
最適な経路を判断する際の判断基準となる。コストは次の計算式で計算され、合計が最小値になるルートが最適なルートとなる。

**コスト＝10の8乗 ÷ 帯域幅(bps)**

### 等コストロードバランシング
トラフィックを分散し異なるルートを通るようになる機能のこと。同じコストのルートが複数存在する場合、そのルートをルーティングテーブルに登録する。Cisco製品ではデフォルトで4つまで登録される。

EIGRP/OSPF/RIPといったルーティングプロトコルではデフォルトで有効になっており、自動的にロードバランシングの対象となる。


:::note info
**そもそもロードバランシングとは？？**
負荷分散の事で、ルーティングプロトコルが、同一の宛先へのメトリックが同じ経路を複数学習した場合、この複数の経路を使用してパケットを配分してルーティングを行うこと
:::

:::note info
スタティックルーティングでも、異なるネクストホップを持つ同じ宛先への経路を手動で複数登録することでロードバランシングを実現することは可能
:::



### ルートの変更
1Gbpsでも100Mbpsでも同じコストになるため、1Gbpsの方を最適なルートとして選択したくても出来ない。そこで、コスト値を調整することで経路変更を行うことができる。

+ インターフェイスのコスト値を直接設定する
+ インターフェイスの帯域幅を変えてコストの計算結果を変える
+ コストの計算式の分子「10の8乗」の値を変更する


## ネットワークのタイプ

| タイプ | DRとBDRの選出 | Helloパケットによるネイバーの自動検出 | Hello/Deadインターバル |
|:-:|:-:|:-:|:-:|
| ブロードキャスト  | 〇  | 〇  | 10秒/40秒  |
| NBMA(Non-Broadcast Multiple Access)  | 〇  | ×  | 30秒/120秒  |
| ポイントツーマルチポイント  | ×  | 〇  | 30秒/120秒  |
| ポイントツーマルチポイント(ノンブロードキャスト)  | ×  | ×  | 30秒/120秒  |
| ポイントツーポイント  | ×  | 〇  | 10秒/40秒  |

### ブロードキャスト
複数のルータと接続していて、ブロードキャストをサポートしているネットワーク。マルチキャストで送信されるHelloパケットにより、ネイバーを自動で研修することができる。イーサネットはデフォルトでこのネットワークタイプになる。

### NBMA(Non-Broadcast Multiple Access)
複数のルータと接続しているが、ブロードキャストやマルチキャストをサポートしていないネットワークのこと。マルチキャストによるHelloパケットの送信ができないため、あらかじめ**ルータにネイバーのIPアドレスを手動で登録しておく必要がある**。

### ポイントツーマルチポイント
1対多で接続しているネットワークのこと。ブロードキャストをサポートする場合とサポートしない場合でタイプがわかれる。


## パッシブインターフェイス
OSPFを有効にしつつもHelloパケットを送信しないようにすること。Helloパケットを送信しなくなり、受信したHelloパケットは無視するようになる。結果、ネイバーとして認識されなくなる。

# マルチエリアOSPF
ネットワークを**エリア**という単位で分割することができるため、エリア内は各ルータの詳細な情報を把握し、エリア間はルートの情報だけにしておくことで保持しなければならない情報量を減らす。バックボーンエリアとその他のエリアに分けてネットワークを階層化し管理する。

![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/11d10102-673a-ece3-f1e6-bf660f785dd7.png)

1つのエリアだけでOSPFを動作させることを**シングルエリアOSPF**、複数のエリアを作成してOSPFを動作させることを**マルチエリアOSPF**という。

エリアを作成することでルート制御用のトラフィックを抑えられるようになるが、エリアを作成するには次の点に注意する必要がある。

+ **バックボーンエリアを作成する**
バックボーンエリア(中心となるエリア)を作成する必要がある。**エリア番号0**で表される。1つしか作成することができない。

+ **他のエリアをバックボーンエリアに接する様に作成する**
標準エリアとも呼ばれ、エリア間で通信する場合必ずバックボーンエリアを通過しなければならない。標準エリア同士での通信は不可。そのため、エリアを分割する際には他のエリアをバックボーンエリアに接する様に作成しなければならない。

+ **ルータをエリアの境界に配置する**

## ルータの役割
ルータはエリアのどの部分に位置するかによって役割が異なる。

| ルータの役割 | 説明 |
|:-:|:-:|
| 内部ルータ  | 全てのインターフェイスが同じエリアに所属しており、その他のエリアには一切接していないルータ  |
| バックボーンルータ  | バックボーンエリアに所属するインターフェイスを持つルータ。インターフェイスがどれか1つでもバックボーンエリアに入っていれば、バックボーンルータとみなされる。  |
| ABR(Area Border Router)  | インターフェイスが2つ以上のエリアに所属しているルータ。すなわち、エリアとエリアの境界に位置し、複数のエリアと接しているルータ  |
| ASBR(Autonomous System Boundary Router)  | インターフェイスが異なるASに所属しているルータ。ASとは、OSPF以外のルーティングプロトコルが動作しているネットワークを指す。  |

![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/8ca62ab6-e31f-259e-4479-2e25b5d34fc9.png)

+ 内部ルータ：A,C,E,G
+ バックボーンルータ：A,B,D,F,H
+ ABR:B,D,F
+ ASBR:H

## LSAのタイプ
OSPFではLSDBを構成する情報をLSAで伝えており、Ciscoのルータでは以下の6種類のタイプがある。また、経路情報は、学習するLSA Typeにより優先順位が存在し**タイプの小さい方が優先**される。

### ルータLSA(LSA Type1)
全OSPFルータがエリアごとに生成し、**同一エリア内の他のルータに自身のインターフェイスの情報を伝える際に使用される最も基本的なLSA**。ルータIDやインターフェイスの情報などの詳細な内容が含まれる。

![キャプチャ07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/d69d5dc7-71ea-452f-b41b-e2040fda4972.png)

### ネットワークLSA(LSA Type2)
DRとなっているルータが生成し、**DRのルータIDやDRとなっているネットワークでのIPアドレスなどの情報を、同一エリア内の他のルータに伝える**際に使用されるLSA。

![キャプチャ08.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/84db3cf3-9c1d-235a-1ba0-4b0cb401afc1.png)

### サマリーLSA(LSA Tyepe3)
ABRとなっているルータが生成し、**エリア内のネットワークの情報を他のエリアに伝える際に使用されるLSA**。エリア内に存在しているネットワークやサブネットマスク、コストなどの情報が含まれている。

:::note info
他のエリアの個々のルータの詳細は通知せず、要約されたネットワーク情報だけを通知することで、LSDBに保持しておかなければならない情報を少なくしている。
デフォルトでは、エリア内の全てのネットワーク情報を要約して他のエリアへ送信する。
:::

![キャプチャ09.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/74fc08ce-baa0-6bbb-9e6d-3724150f1286.png)


### ASBRサマリーLSA(LSA Type4)
ABRとなっているルータが生成し、**他のエリアにASBRの情報を伝える際に使用するLSA**。ASBRのルータIDやコストなどの情報が含まれている。

![キャプチャ10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/18b8e5d4-0e81-81f0-344e-5c7db40385d6.png)

### AS外部LSA(LSA Type5)
ASBRとなっているルータが生成し、**OSPFドメイン外の経路情報をOSPFドメイン内に伝える**際に使用されるLSA。外部ネットワークのネットワークアドレス、サブネットマスクの情報、メトリックなどが含まれる。

デフォルトでは、全ての外部ネットワークの情報をOSPF内へ送信する。このように、あるルーティングプロトコルで得た経路情報を他のルーティングプロトコルに変換して流すことを**再配送**という。

:::note info
**OSPFドメインとは？？**
同一の運用方法で動作させているOSPFルータで構成されているネットワークのこと。OSPFドメイン外の経路情報とは、OSPF以外のルーティングプロトコルやスタティックルートなどで登録されたネットワークの情報ということになる。
:::

![キャプチャ11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/92114853-82b3-0484-1978-39440e902517.png)

### NSSA外部LSA(LSA Type7)
NSSAというエリア内でASBRとなっているルータが生成し、OSPFドメイン外の経路情報をOSPFドメイン内に伝える際に使用されるLSA。含まれる内容はLSA Type5と似た情報で、外部のネットワークのネットワークアドレス、サブネットマスクの情報、メトリックなどが含まれる。

![キャプチャ12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/f02fac5f-970f-d75c-bbac-adaf655bb999.png)


## LSAの違いによる経路の取り扱い
LSAのタイプにより通知される情報が異なるため、大きく3つの経路に分けられる。

### intra-areaルート
**ルーティングテーブル上の表記：O**
同一エリア内のルート情報のこと。LSA Type1とLSA Type2で通知される情報を基に計算されるものとなる。

### inter-areaルート
**ルーティングテーブル上の表記：O IA**
エリア間で通知されるルートの情報のこと。LSA Type3で通知される情報から取得される。

### externalルート
OSPFドメイン外の再配送された外部ルート情報のことで、さらに4つに分類される。メトリックタイプの違いで外部ルートに対するメトリックの計算方法が異なる。
OSPFドメイン外のルートがASBRによってLSA Type5でOSPFドメイン内に送信される場合、そのネットワークはデフォルトでコスト値が**20**、メトリックタイプ2で再配送される。

| ルーティングテーブル上の表記 | 内容 |
|:-:|:-:|
| O E1  | LSA Type5でメトリックタイプ1  |
| O E2  | LSA Type5でメトリックタイプ2  |
| O N1  | LSA Type7でメトリックタイプ1  |
| O N2  | LSA Type7でメトリックタイプ2  |

#### メトリックタイプ1
OSPFドメイン内のルータを経由するたびに、再配送時に設定された基準のコストに各インターフェイスのコストを加算していく。

![キャプチャ13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/2321fc31-cc32-1211-513f-b76afdd8ddcf.png)

:::note info
外部ネットワークへ向かうためのASBRが複数ある際に、近いのASBRを経由させたいときに使用する。
:::


#### メトリックタイプ2
メトリックタイプ1と違い加算されない。どれだけASBRから離れていても、コストは再配送時に設定された基準のコスト値である20のまま一定となる。

![キャプチャ14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/8d56dabb-2e1b-d49f-dcaa-f2750568d0ca.png)

:::note info
外部ネットワークへ向かうためのASBRが複数ある際に、特定のASBRを経由させたいときに使用する。
:::

## エリアの種類
OSPFにはネットワークにかかる負荷を減らすために役割が異なる複数の種類のエリアが存在する。Ciscoルータで使用可能なエリアは以下の6つとなる。

### バックボーンエリア
OSPFのネットワークの中心となるエリアのこと。エリアIDが0となり、他のエリアの経路情報はバックボーンエリアを介して行われる。エリア内ではLSA Type1～5が流れる。

### 標準エリア
バックボーンエリア以外の通常のエリアのこと。標準エリア内では、LSA Type1～5が流れる。標準エリア内のルータではエリア間のルート情報であるinter-areaルートと、外部ルート情報であるexternalルートの両方が集約されることなく全てルーティングテーブルに登録される。


![キャプチャ15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/fe89ebb9-bd15-0630-5ffe-9ab6d15b5a6a.png)

### スタブエリア
LSA Type5を通すことのできないエリアのことで、LSA Type1～3が流れる。スタブエリアではLSA Type5によって通知されたネットワーがABRによってデフォルトルートに集約され、LSA Type3でスタブエリア内のルータに伝わる。
エリア間のルート情報であるinter-areaルートは個別に通知され、外部ルート情報であるexternalルートは1つのデフォルトルートに集約され通知される。

![キャプチャ16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/aa10edfa-44a2-0091-fa46-2d2270efb093.png)

:::note warn
**スタブエリアにする際の注意点**
+ バックボーンエリアをスタブエリアにすることはできない
+ ASBRを設置することは出来ない
:::


### トータリースタブエリア(完全スタブエリア)
他のエリアのネットワークを通知するためのLSA Type3も、全てABRによってデフォルトルートに置き換えられる。LSA Type1，2とデフォルトルートを通知するLSA Type3が流れる。
トータリースタブエリア内では、外部ルートだけではなくエリア間のルートも1つのデフォルトルートに集約されルーティングテーブルに登録されるため、スタブエリアよりもさらにLSDBのサイズが減らせるエリアとなっている。

![キャプチャ17.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/ef169a64-c450-c742-262e-48b515594035.png)

### NSSA(Not-So-Stubby Area)
スタブエリアにASBRを設置できるようにしたエリアのこと。LSA Type5が使用できないため、NSSA内のASBRはType5の代わりにLSA Type7を生成する。NSSA内では、LSA Type1、2，3，7が流れる。
NSSA内では、エリア間のルート情報とNSSA側の外部ルートの情報は個別に通知され、他のエリアのASBRから通知される外部ルートは1つのデフォルトルートに集約されルーティングテーブルに登録される特徴を持つ。

![キャプチャ18.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/e7cc1417-4d2b-45b6-6d65-b5b4f900edd9.png)


### トータリーNSSA(完全NSSA)
トータリースタブエリアにASBRを設置できるようにしたエリアのこと。LSA Type1、2、7とデフォルトルートを通知するLSA Type3が流れる。
トータリーNSSA側の外部ルートの情報は個別に通知され、エリア間のルート情報と他のエリアのASBRうから通知される外部ルートは1つのデフォルトルートに集約されルーティングテーブルに登録される。

![キャプチャ19.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/da208441-826b-d212-7ab4-f4d6e7938abc.png)

## バーチャルリンク
直接バックボーンエリアに接続していないエリアを仮想的にバックボーンエリアと接続しているように見せること。ネットワークを統合する以外にも、1つのバックボーンエリアだったものが障害により分断されてしまった場合に対処することが可能。

![キャプチャ20.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/c57d1039-d9bd-0c14-29cb-a253fb3c5476.png)

:::note warn
次の場合はバーチャルリンクを設定することは出来ない。
+ 2つのエリアを飛び越えたバーチャルリンクの設定は不可
+ バーチャルリンクはスタブエリアを通すことが出来ない
+ どちらかのルータがバックボーンエリアに接していないとバーチャルリンクは使用できない
:::



# OSPFの設定

### ワイルドカードマスク
OSPFを有効にするインターフェイスを指定する際に使用する。IPアドレスとセットで使用され、直前に指定されたセットとなっているIPアドレスのどこまでを比較の対象とするのかを指定するために使用する。
32ビットの値で、IPv4と同じ表記。

+ 例① 192.168.1.0/24を有効にする場合
ワイルドカードマスクでは、IPアドレスのうち、**条件とする部分を0、任意の相対でよい部分を1とする**ため、0.0.0.255となる。
よって、IPアドレスとワイルドカードマスクは192.168.1.0.0.0.0.255と指定する。

+ 例② 172.16.1.0/26を有効にする場合
条件となるのは最初の26ビットなので、26ビットを0にし残りを1にする。
よって、ワイルドカードマスクは0.0.0.63となる。

![キャプチャ5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/a36cdd1d-f940-1751-cf6f-f7c878dd7f10.png)


### router ospfコマンド
**書式：router ospf [プロセスID]**
OSPFを有効にするコマンドで、グローバルコンフィギュレーションモードで行う必要がある。
OSPFは1つのルータで複数のプロセス(処理)を動作可能のため、他のプロセスと区別するためにプロセスIDを指定する必要がある。プロセスIDは1～65535の値を指定することが可能。

### networkコマンド
**書式：network [IPアドレス] [ワイルドカードマスク] area [エリアID]**
OSPFを有効にするインターフェイスを指定するコマンド。**ルータコンフィギュレーションモード**で行う必要がある。有効にしたいインターフェイスのIPアドレスを指定する。インターフェイスに設定されているIPアドレスを確認し、指定したアドレスとそのまま利用する部分が一致していた場合、OSPFは有効になる。

#### ip ospf areaコマンド
**書式：ip ospf [プロセスID] area [エリアID]**
OSPFを有効にするインターフェイスを指定するコマンド。インターフェイスコンフィギュレーションモードで行う必要がある。

:::note warn
networkコマンドと重複して設定された場合、networkコマンドよりも優先される
:::


### passive-interfaceコマンド
**書式：passive-interface <インターフェイス | default>**
パッシブインターフェイスを設定するコマンド。ルータコンフィギュレーションモードで行う必要がある。
パッシブインターフェイスの設定をすることで、OSPFを動作させる必要があるもののHelloパケットを送信する必要がないインターフェイスから、Helloパケットが送信されなくなる。また、受信したHelloパケットを無視する。
defaultを指定すると、全インターフェイスで有効となる。

### router-idコマンド
**書式：router-id [ルータID]**
各ルータを識別するためのルータIDを設定するコマンド。ルータコンフィギュレーションモードで行う必要がある。IPアドレスが設定されていれば自動で決定されるが、手動で設定したい場合に使用する。
ID設定時は、**他のルータと重複しない値を設定する必要**があり、重複した場合ネイバーとして認識されないなどの障害の原因となる。

:::note warn
ルータIDが決まった後にルータIDとして優先的に採用される別の値が設定されてもルータIDは変更されない。ルータIDを変更したい場合はOSPFプロセスを再起動する(`clear ip ospf process`コマンド)必要がある。
:::


### interface Loopbackコマンド
**書式：interface Loopback [番号]**
ループバックインターフェイスの作成を行うコマンド。グローバルコンフィギュレーションモードで行う必要がある。番号には0~2,147,483,647の値を指定できる。
コマンド実行後、ループバックインターフェイスのインターフェイスコンフィギュレーションモードに移行するので、通常のインターフェイスと同様にIPアドレスの設定を行う。

### OSPFの設定例

<details><summary>OSPFの設定例</summary>

![キャプチャ12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/98301001-bf90-cd7a-fa6c-536df913a63c.png)

各ルータを設置し、クロスオーバーケーブルでつなぎ各ルータは以下のように設定していく。

``` markdown:RT01初期設定
Router>enable
Router#configure terminal
Router(config)#hostname RT01
RT01(config)#interface FastEthernet 0/0
RT01(config-if)#ip address 192.168.12.1 255.255.255.0
RT01(config-if)#no shutdown
RT01(config-if)#exit
RT01(config)#interface FastEthernet 0/1
RT01(config-if)#ip address 192.168.18.2 255.255.255.0
RT01(config-if)#no shutdown 
```

``` markdown:RT02初期設定
Router>enable
Router#configure terminal
Router(config)#hostname RT02
RT02(config)#interface FastEthernet 0/0
RT02(config-if)#ip address 192.168.14.1 255.255.255.0
RT02(config-if)#no shutdown 

RT02(config-if)#
%LINK-5-CHANGED: Interface FastEthernet0/0, changed state to up

RT02(config-if)#exit
RT02(config)#interface FastEthernet 0/1
RT02(config-if)#ip address 192.168.12.2 255.255.255.0
RT02(config-if)#no shutdown 
```

``` markdown:RT03初期設定
Router>enable
Router#configure terminal
Router(config)#hostname RT03
RT03(config)#interface FastEthernet 0/0
RT03(config-if)#ip address 192.168.18.1 255.255.255.0
RT03(config-if)#no shutdown 

RT03(config-if)#
%LINK-5-CHANGED: Interface FastEthernet0/0, changed state to up

RT03(config-if)#exit
RT03(config)#interface FastEthernet 0/1
RT03(config-if)#ip address 192.168.16.2 255.255.255.0
RT03(config-if)#no shutdown 
```

``` markdown:RT04初期設定
Router>enable
Router#configure terminal
Router(config)#hostname RT04
RT04(config)#interface FastEthernet 0/0
RT04(config-if)#ip address 192.168.16.1 255.255.255.0
RT04(config-if)#no shutdown 

RT04(config-if)#
%LINK-5-CHANGED: Interface FastEthernet0/0, changed state to up

RT04(config-if)#exit
RT04(config)#interface FastEthernet 0/1
RT04(config-if)#ip address 192.168.14.2 255.255.255.0
RT04(config-if)#no shutdown 
```

![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/51904f4a-615e-56bd-948a-05891bf486da.png)

ここから各ルータにOSPFの設定を行っていく。

``` markdown:RT01 OSPF設定
RT01#configure terminal
Enter configuration commands, one per line.  End with CNTL/Z.
RT01(config)#router ospf 1
RT01(config-router)#network 192.168.12.0 0.0.0.255 area 0
RT01(config-router)#network 192.168.18.0 0.0.0.255 area 0
RT01(config-router)#end
```
``` markdown:RT02 OSPF設定
RT02(config)#router ospf 1
RT02(config-router)#netwo
RT02(config-router)#network 192.168.12.0 0.0.0.255 area 0
RT02(config-router)#network 192.168.14.0 0.0.0.255 area 0
RT02(config-router)#end
```

``` markdown:RT03 OSPF設定
RT03(config)#router ospf 1
RT03(config-router)#network 192.168.18.0 0.0.0.255 area 0
RT03(config-router)#network 192.168.16.0 0.0.0.255 area 0
RT03(config-router)#end
```

``` markdown:RT04 OSPF設定
RT04(config)#router ospf 1
RT04(config-router)#network 192.168.14.0 0.0.0.255 area 0
RT04(config-router)#network 192.168.16.0 0.0.0.255 area 0
RT04(config-router)#end
```

これでpingコマンド実行すると疎通確認できるようになる。

``` markdown:RT1ルーティングテーブル
RT01#show ip route
Codes: C - connected, S - static, I - IGRP, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2, E - EGP
       i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area
       * - candidate default, U - per-user static route, o - ODR
       P - periodic downloaded static route

Gateway of last resort is not set

C    192.168.12.0/24 is directly connected, FastEthernet0/0
O    192.168.14.0/24 [110/2] via 192.168.12.2, 00:07:22, FastEthernet0/0
O    192.168.16.0/24 [110/2] via 192.168.18.1, 00:02:52, FastEthernet0/1
C    192.168.18.0/24 is directly connected, FastEthernet0/1
```

``` markdown:RT1ネイバーテーブル
RT01#show ip ospf neighbor 

Neighbor ID     Pri   State           Dead Time   Address         Interface
192.168.14.1      1   FULL/BDR        00:00:33    192.168.12.2    FastEthernet0/0
192.168.18.1      1   FULL/BDR        00:00:31    192.168.18.1    FastEthernet0/1
```


</details>


## OSPFの設定の確認

### show ip ospf neighborコマンド
ネイバーテーブルを確認するためのコマンド。特権EXECモードで行う必要がある。

| 項目 | 内容 |
|:-:|:-:|
| Neighbor ID  | 認識しているネイバーのルータID  |
| Pri  | ネイバーのルータプライオリティ。デフォルトは1  |
| State  | 隣接関係を表す。FULLまたは2WAY(マルチアクセス環境においてDRotherとなっているルータ同士の場合)であれば問題ない。/の後ろは、DR,BDR,DROTHER,それ以外は(-)が表示される  |
| Dead Time  | あと何秒間Helloパケットが届かなかったらダウンしたとみなすかを表す  |
| Address  | ネイバーのIPアドレス  |
| Interface  | 隣接関係を結んだインターフェイス  |

```markdown:show ip ospf neighborコマンド
RT1#show ip ospf neighbor


Neighbor ID     Pri   State           Dead Time   Address         Interface
172.16.2.10       1   FULL/BDR        00:00:31    172.16.2.10     FastEthernet1/0
192.168.1.110     1   FULL/DR         00:00:31    172.16.1.110    FastEthernet0/1
192.168.1.110     1   FULL/BDR        00:00:31    192.168.1.110   FastEthernet0/0
192.168.1.254     1   FULL/DR         00:00:33    192.168.1.254   FastEthernet0/0
```


#### ネイバーステートの流れ
OSPFを起動したルータが隣接関係を確立して、コンバージェンスするまでのステートの流れは以下の表になる。

|状態 | 内容 |
|:-:|:-:|
| DOWN  | Helloを受け取っていない最初の状態、他のOSPFルータの存在を認識していない状態  |
| INIT  | Helloパケットを受信し相手を認識。Helloパケットの中に自分はいない状態  |
| 2WAY  | お互いを認識した状態。この状態をネイバーの確立と呼ぶ  |
| EXSTART  | DR,BDR決定（選出）済み  |
| EXCHANGE  | ルータ情報をDBDで交換している状態。MTUが一致していないと処理が進まなくなる  |
| LOADING  | 詳細情報確認  |
| FULL  | コンバージェンス（最適経路の計算が完了した状態）  |

### show ip ospfコマンド
OSPFプロセスの情報を確認するコマンド。特権EXECモードで行う必要がある。ルータが所属しているエリアとそのエリアに属しているインターフェイスの数、エリア認証の有無やSPFアルゴリズムの実行回数などが確認できる。

```markdown:show ip ospfコマンド
R21#show ip ospf 
 Routing Process "ospf 65000" with ID 10.0.0.21
 Supports only single TOS(TOS0) routes
 Supports opaque LSA
 SPF schedule delay 5 secs, Hold time between two SPFs 10 secs
 Minimum LSA interval 5 secs. Minimum LSA arrival 1 secs
 Number of external LSA 0. Checksum Sum 0x000000
 Number of opaque AS LSA 0. Checksum Sum 0x000000
 Number of DCbitless external and opaque AS LSA 0
 Number of DoNotAge external and opaque AS LSA 0
 Number of areas in this router is 1. 0 normal 1 stub 0 nssa
 External flood list length 0

 Routing Process "ospf 6500" with ID 192.168.200.21
 Supports only single TOS(TOS0) routes
 Supports opaque LSA
 SPF schedule delay 5 secs, Hold time between two SPFs 10 secs
 Minimum LSA interval 5 secs. Minimum LSA arrival 1 secs
 Number of external LSA 0. Checksum Sum 0x000000
 Number of opaque AS LSA 0. Checksum Sum 0x000000
 Number of DCbitless external and opaque AS LSA 0
 Number of DoNotAge external and opaque AS LSA 0
 Number of areas in this router is 0. 0 normal 0 stub 0 nssa
 External flood list length 0

```


### show ip ospf databaseコマンド
**書式：show ip ospf database [asbr-summary | external | network | nssa-external | router | summary]**
LSDBの要約情報(LSAのリスト)であるトポロジテーブルを確認するコマンド。特権EXECモードで行う必要がある。オプションを省略した場合は、全LSA Typeの要約情報一覧が表示される。

| オプション | 対応LSA Type |
|:-:|:-:|
| router  | ルータLSA（LSA Type1）  |
| network  | ネットワークLSA（LSA Type2）  |
| summary   | サマリーLSA（LSA Type3）  |
| asbr-summmary  | ASBRサマリーLSA（LSA Type4）  |
| external  | AS外部LSA（LSA Type5）  |
| nssa-external  | NSSA外部LSA（LSA Type7）  |

### show ip protocolsコマンド
OSPFのプロトコルの情報を確認するためのコマンド。特権EXECモードで行う必要がある。このコマンドは、OSPFに限らず、動作しているルーティングプロトコルを一覧で確認することができる。

| 項目 | 説明 |
|:-:|:-:|
| Router ID  | ルータID  |
| Maximum path  | 等コストロードバランシングの数  |
| Routeing for Networks  | networkコマンドで設定した内容  |
| Routing Information Sources  | LSAをアドバタイズしているルータの情報  |
| Passive Interface(s)  | パッシブインターフェイスの情報  |
| Distance  | アドミニストレーティブディスタンスの値  |

```markdown:show ip protocolsコマンド
R2#show ip protocols 

Routing Protocol is "ospf 65000"
  Outgoing update filter list for all interfaces is not set 
  Incoming update filter list for all interfaces is not set 
  Router ID 10.0.0.2
  Number of areas in this router is 1. 1 normal 0 stub 0 nssa
  Maximum path: 4
  Routing for Networks:
  Routing Information Sources:  
    Gateway         Distance      Last Update 
    10.0.0.2             110      00:01:03
    10.0.0.3             110      00:01:03
  Distance: (default is 110)
```


### show ip ospf interfaceコマンド
**書式：show ip ospf interface [インターフェイス]**
OSPFが動作しているインターフェイスの情報を確認するためのコマンド。特権EXECモードで行う必要がある。省略すると、全てのインターフェイスが表示される。

![キャプチャ6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/b394876e-fc4b-7130-0bdb-e78cedbbecbf.png)

+ ①IPアドレスと所属するエリア
+ ②プロセスIDとルータID、ネットワークタイプ、コスト
+ ③リンクの状態とプライオリティ
+ ④DRとBDRのルータIDとIPアドレス
+ ⑤HelloインターバルとDeadインターバル

``` markdown:show ip ospf interfaceコマンド
RT01#show ip ospf interface FastEthernet 0/1

FastEthernet0/1 is up, line protocol is up
  Internet address is 192.168.18.2/24, Area 0
  Process ID 1, Router ID 192.168.18.2, Network Type BROADCAST, Cost: 1
  Transmit Delay is 1 sec, State DR, Priority 1
  Designated Router (ID) 192.168.18.2, Interface address 192.168.18.2
  Backup Designated Router (ID) 192.168.18.1, Interface address 192.168.18.1
  Timer intervals configured, Hello 10, Dead 40, Wait 40, Retransmit 5
    Hello due in 00:00:08
  Index 2/2, flood queue length 0
  Next 0x0(0)/0x0(0)
  Last flood scan length is 1, maximum is 1
  Last flood scan time is 0 msec, maximum is 0 msec
  Neighbor Count is 1, Adjacent neighbor count is 1
    Adjacent with neighbor 192.168.18.1  (Backup Designated Router)
  Suppress hello for 0 neighbor(s)
  ```

  ### debug ip ospf helloコマンド
  Helloパケットのやり取りを確認するコマンド。特権EXECモードで行う必要がある。


## OSPF関連のパラメータの調整

### ip ospf priorityコマンド
**書式；ip ospf priority [ルータプライオリティ値]**
ルータプライオリティを設定するコマンド。インターフェイスコンフィギュレーションモードで行う必要がある。インターフェイスごとに個別の値を持つため、インターフェイスごとに設定する必要がある。
デフォルト値は1で、変更したい場合は0～255までの値を指定する。0に設定すると、DRおよびBDRに選出されずDRotherとなる。


::: note info
プロセスを再起動することで、隣接ルータとのネイバー関係を一度解消し、OSPFの動作を最初からやり直すことができる。
再起動するには、`clear ip ospf process`コマンドを特権EXECモードで行う必要がある。
:::

### ip ospf costコマンド
**書式：ip ospf cost <コスト値>**
インターフェイスのコスト値を変更するコマンド。インターフェイスコンフィギュレーションモードで行う必要がある。

### auto-cost reference-bandwidthコマンド
**書式:auto-cost reference-bandwidth <基準帯域幅(Mbps)>**
基準帯域幅(10の8乗部分)を変更するコマンド。ルータコンフィギュレーションモードで行う必要がある。デフォルトは100Mbpsで、1～4294967の中から指定することができる。

:::note warn
変更する際は、ネットワーク内の全ルータで同一の設定を行う必要がある。設定すると、以下のような警告文が表示される。

![キャプチャ21.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/276d503c-de85-2118-df72-ebdf0f664025.png)
:::

### bandwidthコマンド
**書式：bandwidth [帯域幅]**
インターフェイスの帯域幅を変更するコマンド。インターフェイスコンフィギュレーションモードで行う必要がある。帯域幅はKbps単位で指定する。
帯域幅の値を変更してもインターフェイスの実際の転送速度が遅くなることはない。

::: note warn
コスト値の変更と帯域幅の変更を同時に行った場合、コスト値の変更で設定した値が優先される。
:::



### ip ospf networkコマンド
**書式:ip ospf network < broadcast | non-broadcast | point-to multipoint [non broadcast] | point-to-point>**
OSPFのネットワークタイプを変更するコマンド。インターフェイスコンフィギュレーションモードで行う必要がある。ネットワークタイプは、接続に使用しているインターフェースやカプセル化タイプによって自動的に決定される。

| インターフェイス | 内容 |
|:-:|:-:|
| broadcast  | ネットワークタイプを「ブロードキャストマルチアクセス」にし、DR/BDRが選出されるようになる |
| point-to-point  | ネットワークタイプを「ポイントツーポイント」にし、DR/BDRが選出されなくなる  |

:::note warn
指定するネットワークモードにより、HelloインターバルとDeadインターバルの秒数が変わるので、隣接ルータとの秒数ずれが発生する可能性がある。そのため、**パラメータの不一致により、ネイバーとならなくなる可能性がある**ので注意する。
:::



### ip ospf hello-intervalコマンド
**書式：ip ospf hello-interval [秒数]**
Helloインターバルを変更するコマンド。インターフェイスコンフィギュレーションモードで行う必要がある。Helloパケットを送信する間隔を指定する。秒数は1～65535から指定する。デフォルトは10秒。Helloインターバルを変更すると、Deadインターバルは自動でその4倍の時間に設定される。


### ip ospf dead-intervalコマンド
**書式：ip ospf dead-interval [秒数]**
Deadインターバルのみを変更するコマンド。インターフェイスコンフィギュレーションモードで行う必要がある。

::: note warn
隣接ルータとHelloインターバル、Deadインターバルが一致していないとネイバーとして認識されないため、実行する際は注意する
:::

### mtuコマンド
**書式：mtu < MTUサイズ>**
インターフェイスのMTUを変更するコマンド。インターフェイスコンフィギュレーションモードで行う必要がある。

### ip ospf mtu-ignoreコマンド
MTUの不一致を検出する機能を無効にするコマンド。インターフェイスコンフィギュレーションモードで行う必要がある。設定されたMTUサイズが**小さい方**のルータで実行する。


### default-information originateコマンド
**書式：default-information originate [always] [metric <メトリック>] [metric-type <メトリックタイプ>]**
デフォルトルートを他のルータに伝えるコマンド。ルータコンフィギュレーションモードで行う必要がある。[always]オプションを付けない場合、ルーティングテーブルに登録されているデフォルトルートが伝播される。逆にオプションを付けると、ルータにデフォルトルートの設定がされていなくても、デフォルトルートを他のルータに配布することができる。
externalルート扱いのため、自動生成されたデフォルトルートは`O*E2`のコードが付けられる。

### neighborコマンド
**書式：neighbor < IPアドレス>**
ネイバーを手動で登録するコマンド。ルータコンフィギュレーションモードで行う必要がある。< IPアドレス>にネイバーのIPアドレスを指定する。

### maximum-pathsコマンド
**書式：maximum-paths <等コストパスの数>**
等コストパスロードバランシングの数を指定するコマンド。ルータコンフィギュレーションモードで行う必要がある。デフォルトでは、4つのパスが設定されている。設定可能な最大パスは16。


## マルチエリアOSPFの設定
シングルエリア構成と異なる点は、networkコマンドもしくはip ospfコマンドで指定するエリアIDのみ。エリアの指定を分けることでマルチエリア構成とすることができる。

### area stubコマンド
**書式：are <エリアID> stub [no-summary]**
スタブエリアにするコマンド。ルータコンフィギュレーションモードで行う必要がある。<エリアID>でスタブエリアにするエリアのIDを指定する。[no-summary]を付けるトータリースタブエリアになる。
スタブエリアの設定は、スタブエリアとなるエリアに属している全てのルータで行う必要がある。

:::note warn
トータリースタブエリアにする場合はABRでのみ、[no-summary]を付ける。
:::

### area nssaコマンド
**書式：are <エリアID> nssa [no-summary]**
NSSAのエリアにするコマンド。ルータコンフィギュレーションモードで行う必要がある。[no-summary]を付けるとトータリーNSSAになる。トータリーNSSAにする場合は、ABRでのみ[no-summary]を付ける。
スタブエリアと同様に、NSSAの設定はNSSAとなるエリアに属している全てのルータで行う必要がある。


### area nssa default-information-originateコマンド
**書式：area <エリアID> nssa default-information-originate**
NSSAで他のエリアからくるLSA Type5をデフォルトルートとして伝播するコマンド。ルータコンフィギュレーションモードで行う必要がある。このコマンドは**ABR**で実行する。


## バーチャルリンクの設定

### area virtual-linkコマンド
**書式：area <エリアID> virtual-link <ルータID>**
バーチャルリンクの設定を行うコマンド。ルータコンフィギュレーションモードで行う必要がある。<エリアID>でバーチャルリンクを通過させるエリアを指定する。<ルータID>にはバーチャルリンクを確立する相手となるルータのルータIDを指定する。

:::note warn
この設定はバーチャルリンクを確立する双方のルータで設定する必要がある。
:::


### show ip ospf virtual-linksコマンド
バーチャルリンクを確認するコマンド。特権EXECモードで行う必要がある。

## 手動経路集約の設定

### area rangeコマンド
**書式：area <エリアID> range <ネットワーク> <サブネットマスク>**
エリア間ルートの集約を行うコマンド。ルータコンフィギュレーションモードで行う必要がある。<エリアID>は集約したいネットワークの情報が存在するエリアを指定する。<ネットワーク>と<サブネットマスク>で集約してアドバタイズしたいネットワークを指定する。

:::note warn
経路集約でアドバタイズすることが出来る情報は、自身のルーティングテーブル上に登録されているネットワークのみとなる。
:::

### summary-addressコマンド
**書式：summary-address <ネットワーク> <サブネットマスク>**
外部ルートの集約を行うコマンド。ルータコンフィギュレーションモードで行う必要がある。