【MED】BGPプロトコルの経路制御は、どのように使い分けるべきか?【AS_PATH】

2022-03-13

ネットワークインフラの世界では、BGPは超重要なプロトコルです。DNSと並んで、BGPはインターネットの根幹を成す仕組み。そのためDNSとBGPに強いインフラエンジニアは、大抵どんなプロジェクトでもやっていけると個人的には思います。

しかし、BGPはスキルとして身に着けるのが難しいと思ったことはないでしょうか?

私もこれまで書籍やネットでいろいろと調べてきました。しかし、現場での具体的な使い方等はあまり見つからないのが実態。

そこで、この記事ではBGPの経路制御についての具体的なユースケースをまとめてみました。

BGPの経路選択の基本

優先順位パスアトリビュート
(パス属性)
1WEIGHT
2LOCAL_PREF
3LOCAL
4AS_PATH
5ORIGIN
6MED
7Peer Type
8IGP Metric
9Oldest Path
10Router-ID

BGPの経路制御における最適経路は、上記のパスアトリビュート(パス属性)の優先順位に従って決定されます。その中でも、ネットワーク設計には「MED」と「AS_PATH」がよく使われます。

では、これら2つは一体どのように使い分けて設計するのでしょうか?

結論としては、次の様に使い分けます。

MEDは、隣接する単一のASに対する経路制御に用いる。

AS_PATHは、隣接する複数の異なるASに対する経路制御に用いる。

次からは、AS_PATHとMEDの挙動について簡易なネットワーク図を元に具体的に見ていきます。

MEDによる経路制御

上図のネットワークは、3つのAS間をルーター4台によるBGPの冗長構成で接続しています。なお、簡略化のためにIPアドレスその他の情報は割愛しています。

各機器の関係性は以下一覧となります。

送信元宛先宛先から受け取るMED値経路の主/副
ルーターAルーターC100主系
ルーターAルーターD200副系
ルーターBルーターC200副系
ルーターBルーターD100主系

この構成に基づくと、最適経路は上図ピンク色の矢印となります。通常時はルーターA⇔C間、ルーターB⇔D間でBGPによる優先経路として通信が行われます。これは、各ルーターから受信するMED値のより小さい方が優先されるためです。

ではもし上図のようにルーターB⇔D間で何らかの通信障害が発生したら、トラフィックにはどんな影響があるでしょうか?

結果として、MED200の冗長経路として設定されていたルーターB⇔D間の経路が自動的に最適経路となります。よってルーターBは通信を継続することが可能であり、このように外部ネットワークとの接続での冗長構成においては一般的にBGPが利用されます。

次に、ルーターB⇔D間の障害が復旧したらどうなるでしょうか?

結果としては、ルーターBが受け取る最小のMED値が再度100に戻るため、ルーターD向けの経路が自動的に最適経路に復帰します。

一般的には、このようにBGPによるダイナミックルーティングとMED値を用いた冗長構成による経路制御を行うことで、ネットワークインフラの耐障害性を高めています。

隣接ASが異なる場合のMEDによる経路制御

上図のネットワークは少し構成が変わり、4つのAS間をルーター4台によるBGPの冗長構成で接続しています。MED値も各経路の主/副の関係性も前項と同じとなる想定で設定します。

果たして、この構成で前項と同様の経路制御が実現可能となるでしょうか?

その結論としては「No」となります。

その理由は最初に基本でポイントとしても挙げましたが、BGPプロトコルの仕様として、MEDは隣接する単一のASに対して経路制御に用いるパスアトリビュートだからです。

上図の構成でルーターBは、AS64515からMED100を受け取り、AS64514からMED200を受け取ります。このため、経路制御においてMEDは有効に機能することは無く、想定通りの優先経路も冗長性も実現することはできません。

BGPと言えばMEDで経路制御するものと常日頃から認識している方は少なくないと思われますが、このような仕様をうっかり見落として設計したりしないように注意しましょう。

AS_PATHによる経路制御

それでは、隣接する複数の異なるASに対する経路制御は、一体どのような構成にすれば実現できるでしょうか?

その結論としては、より優先度の高いパスアトリビュートである「AS_PATH」と「AS_PATHプリペンド機能」を使います。

上図の構成図における各機器のAS_PATHの設定と経路制御情報は下表となります。なお、簡略化のためにIPアドレスやその他の情報は割愛し簡略化しています。

送信元宛先宛先から受け取る
AS_PATH属性

AS_PATHプリペンド
経路の主/副
ルーターAルーターC64514なし主系
ルーターAルーターD64515 6451564515副系
ルーターBルーターD64515なし主系
ルーターBルーターC64514 6451464514副系

AS_PATHプリペンドとは、対向機器に伝達する本来のAS_PATHに対し、その経路を劣後させることを目時としてダミーのAS番号を付加する機能です。それにより、優先経路と冗長経路の制御が可能となります。

上表で言うと、ルーターDからルーターA宛てのAS_PATHに対して、ルーターDが自身のAS番号をもう1つ付加しています。これによって、ルーターA⇔C間のAS_PATHが1つに対して、ルーターA⇔D間のAS_PATHが2つで劣後するため、後者の経路が副系として冗長経路として認識されるわけです。

AS_PATHプリペンドの設定追加により、想定通りの経路制御が実現されます。

ここで、ルーターA⇔C間に障害が発生したらどうなるでしょうか?

AS_PATHプリペンドにより劣後していた副系のルーターA⇔D間の経路に自動で切り替わります。

そして障害が復旧すれば、自動で優先経路に切り戻ります。

このように隣接するASが異なる場合には、AS_PATHとAS_PATHプリペンドによる経路制御を行うことで、想定通りのネットワークトラフィックの実現が可能となります。

まとめ

この記事では、BGPの基本と具体的な経路制御についてご紹介しました。

BGPは一般的に大規模なネットワーク間の接続に使われるため、高い耐障害性が要求されます。ネットワークの規模や利用者が増えるほど、障害等の影響は甚大なものとなるからです。

よって、冗長経路の確保と障害発生時のフェイルオーバーやフェイルバックには、細心の注意を払った設計と検証が必要となります。

特に、実務でも非常によく使われるMEDとAS_PATHによる経路制御は、十分に理解を深めることをおすすめします。