BGP Well Known Mandatoryアトリビュートとは

BGPでアドバタイズするルート情報にはさまざまなパスアトリビュートが付加されます。パスアトリビュートによって、BGPのベストパスを選択し、AS間のルーティングを制御することができます。

パスアトリビュートの中でWell known Mandatoryアトリビュートは、どのようなBGPルートにも必ず付加されるという最も基本的なパスアトリビュートです。以降で、Well known Mandatoryの以下の3つのパスアトリビュートについて解説します。

  • ORIGIN
  • AS_PATH
  • NEXT_HOP
以降の説明の中の図では、説明の都合上、BGPルートに付加されているパスアトリビュートを限定して記述していますが、実際にはORIGIN、AS_PATH、NEXT_HOPの3つのWell known Mandatoryアトリビュートすべてが付加されています。

ORIGINアトリビュート

ORIGINアトリビュートは、BGPルートの生成元を示すパスアトリビュートで、次の3つの種類があります。

  • IGP
  • EGP
  • Incomplete

「IGP」

IGPのORIGINアトリビュートは、BGPルートがAS内のIGPから生成されているということを示しています。BGPテーブル上では、「i」で表されます。AS内のネットワークは、IGPでルーティングできるようになっていることを思い出してください。IGPのORIGINアトリビュートが付加されているBGPルートは、生成したルータが所属するASのもので、そのAS内でルーティング可能であることを示しています。ほとんどすべてのBGPルートのORIGINとして、IGPが付加されています。

Ciscoルータでは、networkコマンド、aggregate-addressコマンドでBGPルートを生成した場合にIGPのORIGINアトリビュートが付加されます。

「EGP」

EGPのORIGINアトリビュートは、BGPルートがEGP(Exterior Gateway Protocol)から生成されていることを示しています。EGPはBGPの前身のプロトコルで、いまでは利用することはありません。BGPテーブル上では「e」で表されます。ORIGNがEGPとなるようなBGPルートは、ないものとして考えてよいでしょう。

「Incomplete」

IncompleteのORIGINアトリビュートは、BGPルートの生成元が不明であることを示しています。BGPテーブル上では「?」で表されます。Ciscoルータでは、AS内のIGPのルートをBGPに再配送してBGPルートを生成した場合にIncompleteのORIGINアトリビュートが付加されます。ただし、ルートの生成元が不明であるIncompleteのORIGINアトリビュートを付加したまま、他のASにアドバタイズするのは好ましくありません。IncompleteのORIGINアトリビュートが付加されているルートを他のASにアドバタイズするときには、IGPのORIGINアトリビュートに変更するのが一般的です。

AS_PATHアトリビュート

AS_PATHアトリビュートは、文字列でBGPルートが経由してきたAS番号のリストを表します。networkコマンドなどでBGPルートを生成したとき、初期のAS_PATHアトリビュートは空っぽです。他のASのネイバーであるEBGPネイバーにBGPルートをアドバタイズするとき、AS_PATHアトリビュートの左端に自AS番号を追加します。AS_PATHアトリビュートの左端に追加することを特に「プリペンド(prepend)」といいます。このようなAS_PATHアトリビュートのプリペンドの動作から、AS_PATHアトリビュートの右端のAS番号はそのルートの生成元のASと見なされます。

AS_PATHアトリビュートのAS番号の間には空白を入れます。

IBGPネイバーにBGPルートをアドバタイズするときには、AS_PATHアトリビュートは変更されません。これは、BGPではルートをAS単位で考えていることを表しています。AS_PATHアトリビュートのプリペンドの様子を表したのが次の図です。

図 AS_PATHのプリペンド
図 AS_PATHのプリペンド

この図は、AS1の中の100.0.0.0/8のルート情報に対して、AS_PATHアトリビュートがどのように変更されているかを示しています。

初期のAS_PATHアトリビュートは空白です。AS1からAS2のEBGPネイバーに100.0.0.0/8をアドバタイズするときにAS番号「1」がプリペンドされます。AS2内のIBGPネイバーにアドバタイズするときには、100.0.0.0/8のAS_PATHアトリビュートは変更されません。AS2からAS3のEBGPネイバーに100.0.0.0/8をアドバタイズするときにAS番号「2」がプリペンドされて、AS_PATHアトリビュートは「2 1」となります。

BGPは「パスベクタ型」ルーティングプロトコルと呼ばれることもあります。これは、パスアトリビュートの特別な変更を行っていなければ、AS_PATHアトリビュートが最も短いルートをベストパスとして決定することを表しています。

AS_PATHアトリビュートは、BGPルートがループすることを防止するという重要な役割も果たしています。受信したBGPルートのAS_PATHアトリビュートの中に自AS番号が入っているルートはループしているものと見なして破棄します。

図 AS_PATHによるループの防止
図 AS_PATHによるループの防止

BGPでは、ルート情報をAS単位で考えるのが基本です。そのため、BGPのルートが経由してきたAS番号をリストしているAS_PATHアトリビュートは重要なアトリビュートです。ルートをフィルタしたり、他のパスアトリビュートを付加したりするときにAS_PATHアトリビュートを基準にして行うことがよくあります。

AS_PATHアトリビュートを参照してBGPルートの制御を行うためには、AS_PATHアクセスリストという特殊なアクセスリストを利用します。AS_PATHアクセスリストは、AS_PATHアトリビュートが文字列であることを利用します。AS_PATHアトリビュートの文字列のパターンを正規表現で指定することで、AS_PATHアトリビュートを基準にしたルート情報を識別することができます。

NEXT_HOPアトリビュート

NEXT_HOPアトリビュートは、その名前の通り、ルートに対するネクストホップアドレスを示しています。ただし、BGPではルート情報をAS単位で考えることに注意してください。アドバタイズするネイバーによって、NEXT_HOPアトリビュートの扱い方が異なります。

BGPルートを生成したときの初期のNEXT_HOPアトリビュートは、ルーティングテーブル上のネクストホップアドレスです。そして、他のASのネイバーであるEBGPネイバーにBGPルートをアドバタイズするとき、NEXT_HOPアトリビュートを自分のIPアドレスに変更してアドバタイズします。このIPアドレスはネイバーを構成しているIPアドレスです。

図 NEXT_HOPアトリビュート
図 NEXT_HOPアトリビュート

また、次のような場合、NEXT_HOPアトリビュートは変更されません。

  • マルチアクセスネットワーク上のEBGPネイバーにBGPルートをアドバタイズするとき
  • IBGPネイバーにBGPルートをアドバタイズするとき

1.でNEXT_HOPアトリビュートが変更されないのは、実際のIPパケットのルーティングの効率を考えてのためです。次のような構成を考えます。

図 NEXT_HOPアトリビュートが変更されない場合 その1
図 NEXT_HOPアトリビュートが変更されない場合 その1

図では、R1(AS1)、R2(AS2)、R3(AS3)がイーサネットで同一ネットワークに接続されています。EBGPネイバーはR1(AS1)-R2(AS2)間とR2(AS2)-R3(AS3)間で構成されています。R2からR3へ100.0.0.0/8をアドバタイズするときにNEXT_HOPアトリビュートをR2の10.0.0.2に変更すると、実際のIPパケットのルーティングの効率が悪くなります。R3からは直接R1へパケットをルーティングする方が効率がよいです。そのため、NEXT_HOPアトリビュートのIPアドレスと同じネットワーク上のEBGPネイバーにBGPルートをアドバタイズするときは、NEXT_HOPアトリビュートを変更しません。

2.は、BGPではAS単位でルート情報を考えるためです。次の図のように、IBGPネイバーに対してBGPルートをアドバタイズするときは、デフォルトではNEXT_HOPアトリビュートを変更しません。

図 NEXT_HOPアトリビュートが変更されない場合 その1
図 NEXT_HOPアトリビュートが変更されない場合 その2

NEXT_HOPアトリビュートは、IPパケットをルーティングするときの転送先です。ですから、NEXT_HOPアトリビュートのIPアドレスに到達できないとIPパケットをルーティングできません。そのため、BGPルートを利用する大前提として、付加されているNEXT_HOPアトリビュートに到達できることが必要です。