OSPF ルータ

OSPFルータの動作について説明します。

■ルータの種類

OSPFの目的はルーティングテーブルを作成することです。すべてのルータは正確なルート情報を得るためにOSPFソフトウェアを実行しエリアの作成やインターフェースの認識、ネイバーの検出など様々な情報を収集しルータの置かれた状況を把握していきます。そしてリンク情報を作成して隣接するルータと情報交換します。OSPFは集まった情報を元に計算を行いルート情報をルーティングテーブルに登録します。

この一連の動作は各ルータがそれぞれおこなうものですが、ルータの置かれた状況や、構成・設定の違いによって作成されるルート情報はそのルータ固有のものとなります。またOSPFの多数の機能はエリア毎に行うため接続しているエリアが複数の場合はエリアを跨ぐための特別な機能が必要となります。エリア間と同様に他のASやプロトコルとの境界にいるルータもネットワークを跨ぐための特別な機能が必要となります。これらの違いによってOSPFでは以下に示すようなルータの種類が存在します。

Internal router(内部ルータ)

内部ルータはすべてのインターフェースが同じエリアに接続するルータです。最も基本的な動作を行います。上図ではR1、R2、R4、R5、R7、R9が対象です。

Area border router(ABR)

ABRはインターフェースによって接続するエリアが異なり2つ以上のエリアに接続するルータです。このルータはエリア間をつなぐ役割を持ちます。上図ではR3、R6、R8が対象です。

AS boundary router(ASBR)

ASBRはOSPF外のプロトコルなどからOSPF内に外部ルートを配布するルータです。このルータはOSPFとそれ以外の外部ネットワークをつなぐ役割を持ちます。上図ではR1、R5が対象です。

Backbone router(バックボーンルータ)

バックボーンルータは少なくとも1つのインターフェースがバックボーンエリアに接続しているルータです。バックボーンエリアに接続していることを表す呼称であり、バックボーンエリアに接続している以外に特別な役割はありません。内部ルータ、ABR、ASBRもバックボーンエリアに接続しているとバックボーンルータです。上図ではR1、R2、R3、R6、R8が対象です。

■ルータの動作

ここからはルータ内で動作するOSPFプロトコルについて説明していきます。上で説明したように各ルータの動作は種類によって異なりますが、ここでは初めにすべてのルータで共通の動作について説明した後にABR、ASBRに固有の動作を説明します。

ルータの共通動作

すべてのOSPFルータは下図のような動作を行います。初めにも説明しているようにOSPFの目的はルーティングテーブルを作成することです。そのためにルータはOSPFソフトウェアを実行します。起動したOSPFは様々なルータの状態を認識していき、最終的にルーティングテーブルを作成します。この状況の認識からルート情報の作成までの動作はルータ、インターフェース、ネイバーなどの状態の変化に合わせて繰り返し行い、ルーティングテーブルが常に最新の正確なルート情報を保つようにします。

1)OSPFの起動

ルータが初めに行うのがOSPFの起動です。起動したOSPFは後に続く各機能を実行すると同時にOSPFで必要となる情報(データ構造)を参照・作成します。OSPFで必要となるデータ構造は上図に示した4種類ですが、ここではOSPF全体に係る「OSPFデータ構造」について説明します。他のデータ構造は最も関連の深い各機能で説明します。OSPFデータ構造で必要となるのは次の情報です。プロトコルデータ構造の正確な名称は補足を参照してください。

ルータID

ルータの識別のための32ビットの番号で、すべてのルータで異なる値を設定する必要があります。通常はルータに属する最小のIPアドレスを使用します。ただし、ルータIDが変更されるとOSPFを再起動する必要があることから、実際にはループバックインターフェースに設定を行うなどの運用による工夫が必要になります。一般の実装では手動で指定することが可能となっています。ルータIDの表現は32ビット範囲の整数を使用するか、もしくはIPアドレスと同じ1.1.1.1のようなドット区切りの表現を使用します。

エリア構造

このルータで必要なエリアの情報です。シングルエリア構成の場合は1つだけ、マルチエリアの構成の場合はユーザにより指定された1つのバックボーンエリアといくつかの非バックボーンエリアが必要となります。この情報は次で説明する「エリアの作成」に繋がります。

バーチャルリンク情報

バーチャルリンクの設定情報です。バーチャルリンクは自分のルータIDと相手のルータIDによって紐付けされ、トランジットエリアを経由して到達するため、少なくとも相手のルータIDと通過エリアのエリアIDの情報が必要です。

他のASに対するルート情報

BGPなどの別のプロトコルから連携されたルート情報です。次のAS-external-LSAに繋がります。

AS-external-LSA

OSPF外のリンク情報です。上の「他のASに対するルート情報」から作成したAS-external-LSAや他のルータから受け取ったAS-external-LSAの集合です。スタブエリアとバーチャルリンク以外のエリアに配布されることになります。AS-external-LSA はエリアに関係なく各ルータで1セットのみ保持するためOSPFデータ構造に含まれます。

ルーティングテーブル

OSPFで作成したルート情報を格納するためのテーブルです。OSPFであつかうルーティングテーブルはOSPFのためだけに考えられているため、他のルーティングプロトコルとの関係については実装において工夫が必要となります。ルーティングテーブルそのものと登録の動作に関しては後で説明しています。

2)エリアの作成

OSPFの起動時に作成することになった各エリア内ではエリアの構成に必要な情報(エリアデータ構造)を作成・収集していきます。エリアに分類される情報は下図に示した通り(一部)ですが、主なものとしてはインターフェース、各LSA、shortest-path treeなどがあります。エリアに関する詳細は「OSPFのエリア」のページを参照してください

3)回線の認識

回線はルータ同士をつないで直接到達できる通信路のことですが、ルータは回線の種類や特性をインターフェースを通じて認識します。OSPFが扱う各インターフェースはOSPFとして必要な情報(インターフェースデータ構造)を作成・収集していきます。インターフェースが持つ情報は下図に示した通りですが、主なものとしては属するエリア、各種アドレス、認証情報、タイマーなどがあります。これらの情報はこれ以降の機能に大きく影響します。回線が成立しなければパケットの作成もネイバーの認識も行えないためです。インターフェースの状態はInterface state machineによって制御されていて下位のプロトコル(レイヤー1, 2)やパケットで受け取るネイバーからの情報によって変化します。インターフェースに関する詳細は「OSPFのインターフェース」のページを参照してください

4)パケットの作成

OSPFはネイバーの認識や情報交換のために5つのパケットを使用します。まずネイバーの認識のためにHelloパケットを使用し、OSPF・エリア・インターフェースの各データ構造の情報が揃い次第ルータが能動的に作成し定期的に送信します。他の4つのパケットは情報交換のために使用しますが、交換する情報(LSA)が揃った時点で必要に応じて作成します。OSPFパケットの詳細は「OSPFのパケットの作成と送受信」のページを参照してください。

5)ネイバーの認識

Helloパケットを受信するとネイバーの存在を認識します。OSPFは認識する各ネイバーに対して情報(ネイバーデータ構造)を作成します。ネイバーの管理で必要な情報は下図に示した通りですが、主なものとしてはネイバーのルータIDやIPアドレスなど基本情報、ネイバーの状態、送信しなければならないLSAの一覧などです。ネイバーの情報はこれ以降の機能に大きく影響を与えます。ネイバーを認識しなければLSAの作成も同期も発生しません。ネイバーの状態はNeighbor state machineによって制御されていてパケットで受け取るネイバーの挙動に反応して状態を変化させます。ネイバーに関する詳細は「OSPFのネイバーと同期」のページを参照してください

6)LSAの作成

OSPFルータは一通りの初期動作を完了するとリンク情報を作成します。すべてのルータはエッジ(IPサブネット)に対するリンクを作成します。またネイバーを認識している場合はノード(ルータ)に対するリンクも作成します。作成したリンク情報は一つひとつをLSAという形態にパッケージします。LSAにはいくつかの種類がありますが、ノードに対するリンクとエッジに対するリンクはすべてRouter-LSAかNetwork-LSAに作り分けられます。作成した各LSAはそのエリアのルート計算とネイバーとの交換のためにLSDB(エリアデータ構造)に格納されます。下図はブロードキャスト回線でR1とR2がLSAを作成している様子です。R1とR2はDRであるR2に対するRouter-LSAを作成し、R2はDRであるためネットワーク内のネイバーを表すNetwork-LSAを作成しています。リンクに対する考え方は「OSPF ネットワークの構造」のページの「エリア内の構造」セクションで説明しています。またLSAの作成に関する詳細は「OSPFのLSA」のページを参照してください。

7)LSAの同期

リンクステートプロトコルであるOSPFはルート計算を行うためにエリア内のリンク情報(LSA)をすべて集めなければなりません。そこでOSPFではLSAを交換してもよいと判断したネイバーと隣接関係を築きHelloパケット以外の4つのパケットを使用してLSAを同期します。下図はR1とR2でLSAを交換している様子を示しています。それぞれのルータが作成したLSAを交換してLSDBが同じLSAを持つように同期を行います。この動作はネイバーの認識と同じNeighbor state machineによって制御されます。LSAの同期の詳細は「OSPFのネイバーと同期」のページを参照してください。

8)ルート計算

LSAの同期によって収集したLSAを元に各エリア毎にルート情報を計算します。初めにノードの関係を整理し自分をルートとして各ルータまでを最短で結ぶツリー(shortest-path tree)を作成します。その後エッジに対するリンクを付加してエリア内のすべてのルート情報を求めます。計算する際にはインターフェースのコストが使用され結果的に宛先までのトータルコストが一番小さいルートが選択されることになります。同じコストのルートが存在する場合は2つとも採用されます。エリア間やAS外のルート情報は最短のツリー情報に対してABRが作成したSummary-LSA、ASBRが作成したAS-external-LSAをエッジのルートと同様に追加して計算します。ルート計算の詳細は「OSPFのルート計算」のページを参照してください。

9)ルート情報の登録

ルート計算によって求めたルート情報をルーティングテーブルへ登録します。エリア内では宛先までのトータルコストによってルート情報が作成されましたが、ルート情報の登録には下記の優先順位があり、同じ宛先のルート情報が複数存在する場合には優先順位の高いルートが登録されることになります。

ルート情報の優先順位

1)エリア内ルート

2)エリア間ルート

3)AS外ルート(タイプ1)

4)AS外ルート(タイプ2)

5)エリア内ASBR経由のAS外ルートを優先、その他は同位(RFC1583Compatibility無効の場合。デフォルトは有効)

6)最小コスト

10)ルーティングテーブル

OSPFで使用するルーティングテーブルは下図のようになっています。エリアやパスのタイプなどの情報も併せて登録されていてOSPFで必要な項目が揃っているので一目でわかりやすくなっています。またルーティングテーブルはIPパケットの転送だけでなく、ABRがSummary-LSAを作成するためにも使用します。詳しくは次の「ABRの動作」で説明しています。

※このルーティングテーブルはRFC内で説明されているものですが、他のプロトコルとの関係は考慮されていません

項目 内容
Type(Destination Type) ルート情報の種別
R — ルータ
N — ネットワーク
Destination(Destination ID) 宛先となるアドレス
ルータの場合はルータID
ネットワークの場合はネットワークアドレス
Address Mask IPサブネットを求めるために必要なマスク情報。サブネットマスク。上図ではDestinationの”/”に続く数字で表しています
Optional Capabilities オプションに対応するためのフィールド。使用できるケースがなくここでは省略
Area ルート情報の属するエリア
Path-Type ルート情報のパス種別
intra-area — エリア内ルート
inter-area — エリア間ルート
type1 ext. — AS外ルート(タイプ1)
type2 ext. — AS外ルート(タイプ2)
Cost ルート情報のコスト(タイプ2のAS外ルート除く)
Type2 cost タイプ2のAS外ルートのコスト
Link State Origin MOSPF(RFC1584)で使用
Next Hops 転送先アドレス
Advertise Router(Advertising Router) 発信元のルータ

ABRの動作

ABRはエリアの境界に位置する関係上必ず2つ以上のエリアを保持しています。ABRでは上で説明した共通動作に加えてエリア間を仲立ちする動作を行います。例えば下図のR1とR2は共にABRでそれぞれ2つのエリアに接続しています。

下図はR1の機能的関係です。R1はエリア0とエリア1に接続しているため2つのエリアを持ちます。各エリア内の動作は上で説明したものと同じです。異なるのはルーティングテーブルが各エリアで共通であることと、ルーティングテーブルからエリア間ルートが作成されることです。以降ではABRがどのようにエリア間ルートを作成するのかについて説明していきます。

1)エリア間ルートのLSAの作成

R1はエリア1とエリア2に接続するABRであるため下図のようなルーティングテーブルを持っています。そしてエリアを仲立ちするためのSummary-LSA(ASBR-Summary-LSA含む)を作成します。エリア0のルート情報を元に作成したSummary-LSAをエリア1に配布し、逆にエリア1のルート情報を元に作成したSummary-LSAをエリア0に配布しています。このABRが作成するSummary-LSAによってそれぞれのエリア内の各ルータはエリア間のルートはR1経由で到達できることを知ります。この動作は下表に示したルールに則って行います。なお、Summary-LSA作成時にはルート集約を行うこともできます。

Summary-LSA作成のルール

・ルーティングテーブルエントリーの宛先とコストをそのままLSAに設定

・ルーティングテーブル内のエリア内ルートのSummary-LSAをバックボーンエリアに作成

・ルーティングテーブル内のエリア内ルートとエリア間ルートに対するSummary-LSAを非バックボーンエリアに作成

R2もR1と同じ動作を行います。

2)LSAの同期

共通動作と同じように各エリア内それぞれでネイバーとLSAの同期を行います。このネットワークではエリア1、2にはネイバーが存在しないためエリア0だけが同期を行います。R1が同期を行うと保持するLSAは下図のようになります。

3)ルート計算

共通動作と同じようにルート計算を行いますが、ABRのルート計算では対象となるLSAが下表のように決まっています。そのためR1では下図のように前の手順で作成したエリア0のSummary-LSAだけがルート計算の対象となります。しかしこのままでは自分が作成したSummary-LSAもルート計算の対象となってしまうため、ABRではルート計算中に自分が作成したLSAをスキップします。つまりSummary-LSAだけを見るとR2から受け取ったLSAだけが計算対象となります。逆にR2のルート計算ではR1の作成したSummary-LSAだけが計算対象となります。

ABRの計算対象LSA

LSA 計算対象
Router-LSA すべて対象
Network-LSA すべて対象
Summary-LSA バックボーンエリアのSummary-LSAだけを対象
ASBR-Summary-LSA バックボーンエリアのASBR-Summary-LSAだけを対象
External-LSA すべて対象

4)ルート情報の登録

前のルート計算の結果をルーティングテーブルに登録します。この時、内部ルータの計算で使用した下記の順位が適用されます。もし前の手順でスキップされたAに対するSummary-LSAが計算されていたとしてもルート情報の登録時にはじかれることになります。

ルート情報の優先順位

1)エリア内ルート

2)エリア間ルート

3)AS外ルート(タイプ1)

4)AS外ルート(タイプ2)

5)エリア内ASBR経由のAS外ルートを優先、その他は同位(RFC1583Compatibility無効の場合。デフォルトは有効)

6)最小コスト

5)エリア間ルートのLSAの作成

ルーティングテーブルに新しいルートが登録されたので、再びLSAを作成し宛先Cに対するSummary-LSAをLSDBに登録します。ここでも手順2で説明したSummary-LSA作成のルールに則って行います。エリア1にはネイバーは存在しないためここまでですが、もしネイバーが存在する場合は同期を行います。

補足ではABRの動作のもう少し掘り下げた内容を説明しています。

ASBRの動作

ASBRはOSPFと他のネットワークとを橋渡しするルータです。下図のようにR3がOSPF以外のネットワークに接続している場合、AS(OSPFネットワーク)外のルート情報からAS-external-LSAを作成することでOSPF内のルータがASの外に到達することができるようになります。

R3は下図のようにプロトコルデータ構造に他のASに対するルート情報(List of external routes)を持っているのでそこからAS-external-LSAを作成します。このAS外のルート情報はEGPなどの他のプロトコルなどから連携された情報ですが、受け渡し方法は規定されていません。

1)AS-external-LSAの作成

下図はBGPから受け取ったルート情報を元にAS-external-LSAを作成している様子です。R3はOSPFと外部プロトコル(BGPなど)を動作させ双方のプロトコルで連携をとっています。OSPFは外部プロトコルからルート情報を受け取り、一旦OSPFに取り込んでからAS-External-LSAを作成します。この時AS-external-LSAのメトリックタイプ(タイプ1かタイプ2)を指定します。メトリックタイプはAS-external-LSAを使用してルート計算を行う際の扱いを決めるものです。同時にフォワーディングアドレスも指定できます。フォワーディングアドレスはルート計算でネクストホップアドレスを決める際の基準を決めるものです。

2)LSAの同期

LSAの同期ではASBRはAS-external-LSAをAS内に配布します。同期におけるASBRとしての動作はこれだけです。

ASBRによって配布されたAS-external-LSAは次のように伝搬していきます。AS-external-LSAの同期はエリア内の考え方は共通動作と同じですがABRにおける配布方法と各ルータ内におけるLSAの保持の考え方が他とは異なります。ABRの動作でも説明した通りSummary-LSAはABRがルーティングテーブルからエリア毎に作成を行うLSAですが、AS-External-LSAは特定のエリアに属するものではないためABRはAS-external-LSAを受け取ると自分の分のコピーをとり再作成することなくそのまま配布(転送)します。そしてAS-external-LSA以外のLSAはエリアに固有なため各エリア毎にLSAを保持していますが、AS-external-LSAはAS(OSPFネットワーク)に固有のLSAであるためABRを含む全OSPFルータはAS-external-LSAを1セットだけ保持(プロトコルデータ構造に格納)します。

なおこの時AS-external-LSAを受け取ったABRはASBRの存在を知らせるためにASBR-Summary-LSAを作成してASBRの存在していないエリアに対して配布します。作成方法はSummary-LSAと同じです(ASBR-Summary-LSAはSummary-LSAの一部です)。

4)ルート計算

ASBRのルート計算の考え方は共通動作と同じですがAS-external-LSAは自身が作成したLSAであるため計算からは除外されます。そのためAS外ルートはルーティングテーブルに登録されません。

■補足

バックボーンエリアのないネットワーク

OSPFネットワークは複数のエリアで構成する場合、通常はバックボーンエリアを作成します。ルータの動作や要件を理解するために、ここではバックボーンエリアを使わないOSPFネットワークを構成した場合のルータの動作について考えていきます。ネットワーク構成を検討するためではなく、ABRの動作の理解が目的です。

1)初めにルータ1台を使用してシングルエリアを作成します。作成するエリアはバックボーンエリア(エリア0)以外にしておきます。下図ではエリア1をR1に設定しています。この時R1は内部ルータとして動作します。

2)次にエリア2をR1に追加します。そして各エリアに下図のようなIPサブネットが設定されているとするとR1は矢印で示したルート情報とリンク情報を持つことになります。そしてR1は複数のエリアに属しているためABRとして動作し始めます。OSPFの仕様ではルータ複数のエリアに属しているとABRとなります。通常そのうちの1つはバックボーンエリアになることが理想的な構成ですが、OSPFの仕様ではバックボーンエリアの有無に関係なく複数のエリアに接続するルータはABRとして動作しなければなりません。

3)R1はABRとしてSummary-LSAを作成し始めます。このときの動作は「ABRの動作」で説明した通り以下のルール(3つ目)に則って行います。結果的にエリア1のサブネットAのSummary-LSAがエリア2に作成され、エリア2のサブネットBのSummary-LSAがエリア1に作成されます。(この仕様自体が問題となるケースが存在するためRFC3509ではエリア0が接続されている場合のみSummary-LSAを作成するように修正されています)。

Summary-LSA作成のルール

・ルーティングテーブルエントリーの宛先とコストをそのままLSAに設定

・ルーティングテーブル内のエリア内ルートのSummary-LSAをバックボーンエリアに作成

・ルーティングテーブル内のエリア内ルートとエリア間ルートに対するSummary-LSAを非バックボーンエリアに作成

4)R1はルート計算を行います。このときの動作は「ABRの動作」で説明した下表に則って行います。問題となるSummary-LSAではバックボーンエリアのSummary-LSAだけが対象となりますが、この環境ではバックボーンエリアが存在しないため計算が行われず終了します。よって下図のようにルーティングテーブルの状態は変化しません。

ABRの計算対象LSA

LSA 計算対象
Router-LSA すべて対象
Network-LSA すべて対象
Summary-LSA バックボーンエリアのSummary-LSAだけを対象
ASBR-Summary-LSA バックボーンエリアのASBR-Summary-LSAだけを対象
External-LSA すべて対象

5)ここでさらにネットワークを下図のように拡張してみます。この構成は明らかにエリアがループしており問題が発生するように見えますが、これまでの手順に倣うと構成すること自体は可能です。この環境でのルート計算を考えていきます。

6)各ルータは前の2つのエリアの構成の場合と同じように、通常のルート計算によって直接接続の回線に対するルート情報とリンク情報を作成します。

7)次に各ルータはSummary-LSAの作成を始めます。ここでも2つのエリアの構成の場合と同じで、ルーティングテーブルの直接接続しているエリアのルート情報から他方のエリアに対してSummary-LSAを作成します。

8)この環境ではネイバーが存在するため、各ルータは同期を行いLSAを交換します。そして各ルータが持つLSAは下図のようになります。ここまではOSPFの通常の動作です。

9)ここで受信したSummary-LSAのルート計算とさらなるSummary-LSAの伝搬(作成)について考えてみます。まずルート計算ですが、2つのエリアの環境と同じように、この環境にはエリア0がないためABRのルール(手順4参照)によって各ルータが保持するSummary-LSAには計算対象が存在しないことになります。そのためルーティングテーブルにはエリア間ルートが1つも登録されません。次にSummary-LSAの伝搬ですが、ルーティングテーブルにエリア間ルートが登録されないことでABRのルール(手順3参照)によって新たなSummary-LSAの作成が行われないので、Summary-LSAのさらなる伝搬は起こりません。そして大前提としてルーティングテーブルには下記の「ルート情報の優先順位」によってローカルエリアのルートが上書きされずに存在しています。つまり上図のような構成自体にループが存在してる状態であってもSummary-LSAの伝搬ループは起こらないことになり、ルーティングループも起こりません。

ルート情報の優先順位

1)エリア内ルート

2)エリア間ルート

3)AS外ルート(タイプ1)

4)AS外ルート(タイプ2)

5)エリア内ASBR経由のAS外ルートを優先、その他は同位(RFC1583Compatibility無効の場合。デフォルトは有効)

6)最小コスト

結論として、この非バックボーンエリアがループしたネットワークは上図の状態で安定しますが、各ルータから到達できるのは直接接続するネットワークのみであり、エリアを通過する通信はできません。構成すること自体は仕様的に可能(ただし非推奨)ですがほとんど無意味な構成ということになります。また手順3でも触れているようにRFC3509を適用するとバックボーンエリアがない状態ではSummary-LSAの作成自体が行われなくなります。

プロトコルデータ構造(Protocol Data Structures)

このページで使用しているOSPFデータ構造の各要素の正確な表現は下表のとおりです。表は「OSPFネットワークの構造」のページの補足で用いたものと同じです。

” * “がついているものは設定可能なパラメータです。

パラメータ、要素 意味
Router ID* ASでルータを一意に識別する32ビットの番号。手動で設定しない場合はインターフェースに設定されたIPアドレスの中で一番小さいアドレスをルータIDとする
Area structures OSPFプロトコルのアルゴリズムが個別に適用されるデータ構造
Backbone (area) structure エリア間のルーティング情報の発信を行うエリアデータ構造
Virtual links configured* トランジットエリアを通じて接続されるバックボーンエリアの接続情報
List of external routes AS外に到達することのできるルート情報
List of AS-external-LSAs AS外のルート情報のLSA(LS Type 5)
The routing table LSDBとSPFから生成するルート情報エントリ
RFC1583Compatibility* RFC1583(OSPFv2-1994)との互換状態を表す。有効無効を全ルータで一致させる