BGPの基礎と実践 ~bgpsimで経路制御をシミュレーションしよう~

日本語|English|中国语
| 6 min read
Author: shohei-yamashita shohei-yamashitaの画像

はじめに

#

ビジネスソリューション事業部の山下です。今回はネットワークのプロトコルの1つであるBorder Gateway Protocol(BGP)について説明しようと思います。
普段の実務で馴染みがなくても、IPAやクラウドベンダーの資格を勉強する際に、経路探索に利用できるプロトコルとして聞く方も多いと思います。
今回はBGPについて調べる機会があったので、概要をまとめたうえで、Web上でBGPを検証できるシミュレータであるbgpsimの紹介をしたいと思います。
なお、あくまで本記事の趣旨はBGPの説明ですので、実際の機器やコマンドに関する説明はしません。

BGPの前提知識

#

Border Gateway Protocol(BGP)を説明する前に、前提となるトピックをまとめていきます。

インターネットとAutonomous System

#

インターネットは巨大なネットワークの集合体です。このネットワークはひとかたまりのネットワークとして管理されているわけではなく、Autonomous System(AS)と呼ばれる単位で管理されています。ASは独自のルーティングポリシーを持ち、他のASとは独立して経路を制御できます。ASには2バイトの一意な番号が割り振られており、Internet Assigned Numbers Authority (IANA)によって管理されています。

76b1c816f8558104c9fc112a4c43fc14.png

経路探索

#

特定のネットワークから別のネットワークに通信する場合、最適な経路を選択し制御する必要があります。
経路を手動で制御するのは現実的でありません。幸いなことに、TCP/IPでは自動的に経路を探索するプロトコルがいくつか実装されています。まず、経路制御に関するプロトコルは、ASをまたぐかどうかで2つに分類されます。

  • IGP (Interior Gateway Protocol): AS内部での経路制御プロトコル群
  • EGP (Exterior Gateway Protocol): AS間での経路制御プロトコル群

90fb8857691b5e4db1fb72dfdc20b20f.png

BGPはEGPの実装であり、別のASへの通信の経路を制御する役割を持ちます。

BGPについて

#

ここまでの内容をまとめて、BGPを一言で表現すると次のようになりますが、以降ではもう少し深掘りしようと思います。

  • BGPはネットワークの経路探索に用いられるプロトコルであり、ASを跨いだ経路の探索を可能にする

iBGPとeBGP

#

BGPもAS外部の話が関わるかどうかで2系統に分類できます。

  • iBGP (internal BGP):同じAS内のBGPルータ間で使用される実装であり、AS内部での経路情報の交換に利用される
  • eBGP (external BGP):異なるAS間のBGPルータ間で使用される実装であり、インターネット上の異なるAS間で経路情報を交換する際に利用される
    図式化すると以下のようになります。

d39029c9761f37bb4110182f16e6db1b.png

iBGPとIGPの違い

iBGPと先ほど説明したIGPとの違いについて整理しておきます。
iBGPはあくまでBGPであり、別ASの機器に対してどのような経路でアクセスするかを意識しているものであると考えてください。対して、IGPはAS内部でどのようにルーティングするのかを決定するプロトコルです。

BGPに関する用語について

#

BGPに対応し通信を中継する機器をBGPスピーカーと呼びます。BGPスピーカー[1]が経路情報を交換するためには、BGPスピーカー間でTCPコネクション(ポート179)が確立されている必要があります。
経路情報を交換するためのTCP接続を「BGPセッション」と呼びます。

また、BGPセッションが構築されている関係を「BGPピアリング」と呼びます。
TCPコネクションが確立されている限り、BGPピアリングが維持され、探索されたルートでデータをやり取りできます。
BGPに関するキーワードを整理すると以下のようになります。

  • BGPスピーカー:BGPに対応し、経路情報を交換できるもの(ルーターと同義)
  • BGPセッション:経路情報を交換するための論理的な接続
  • BGPピアリング:BGPセッションが構築された関係性

経路探索に用いるBGPのパラメータ

#

BGPの具体的な実装についてもう少し見ていきます。
BGPによる経路探索で使われる代表的なパラメータとして、次のようなものがあげられます。

  • ORIGIN: どのような手段でBGPセッションを確立したのかによって決まります[2]
  • AS_PATH: 経路情報が通過したASの番号リストであり、優先する経路を評価するにあたって重要な指標になる
  • NEXT_HOP: パケットの転送先となる次のルータのIPアドレス
  • MULTI_EXIT_DISC (MED): 同じASに複数の接続点がある場合に、アクセス元のASに対して優先する経路を示すための対外的な値
  • LOCAL_PREF: AS内の機器がAS外の機器にアクセスする際、経路の優先度を表現する値

BGPによる経路探索アルゴリズム

#

BGPでは次の順に探索アルゴリズムが決定されます。

  • LOCAL_PREFの値が大きいこと
  • AS_PATHの長さがもっとも短い経路であること
  • ORIGINの値がIGP, EGP, Incompleteの順で選択する
  • MEDの値がもっとも小さい値である
  • 上の条件が同じであれば、eBGPピアで受信した経路情報の方を優先する
  • NEXT_HOPが最も近い経路情報を選択する
  • (以下略)[3]

いくつか条件がありますが、本記事ではLOCAL_PREFとAS_PATHに関する条件の説明にとどめます。
まず、上から2つ目の判断基準であるAS_PATHに関する条件について説明します。
AS_PATHはeBGPから受け取る値であり、対応するパスを通って通信する場合、どのASを経由するのかを表現しています。
以下のように、経由するAS番号を羅列している形式をとります。

${AS_ID_1}, ${AS_ID_2}, ${AS_ID_3}, ...${AS_ID_N}, 

以下のイメージにおいて、スタートのルータ(黄色)から目的のルータ(緑色)に向かうルートを考えてみます。外のASへ向かう出口が2つ存在していますが、片方のルートはより多くのASをまたぐ冗長なルートになっています。

3ad051081f670b247c6bfe3a725f809a.png

BGPでは原則として、経由するASが少なくなるようにルートを選定します。
したがって、先ほどの例では青線で示すルートが選ばれます。

80e04f337206dfd567b774bc6e41e256.png

一方、通過するASの数に影響されないよう、パスを選定可能にするパラメータとしてLOCAL_PREFがあります。
LOCAL_PREFを大きくすれば、ASの状況にかかわらず、そのルートがより優先されるようになります。
先ほどの例であれば、以下のように、LOCAL_PREFを変えることで、遠回りなパスが選択されます。

d200c9cb4880f500633207e455389c2b.png

AS内部のルーティングの反映

#

AS外部への経路を探索するのはEGPの役割でしたが、AS内部で完結するような経路の探索は主にIGPが担っています。
したがって、AS内部において経路が複数ある場合には、IGPによって計算されたAS内部のルーティングも利用できることが望ましいです。
これらは別のプロトコルなので直接やり取りはできませんが、再配送(redistribute)と呼ばれる仕組みにより別のプロトコルによる経路情報を参照できます[4]

本記事では説明を省きますが、今回紹介するbgpsimでは、OSPFと呼ばれるプロトコルで求められた経路をBGPによる経路探索に利用できます。

OSPFについて

OSPF(Open Shortest Path First)も経路探索に用いられるプロトコルです。
隣接するルータとルータ間のに対して「コスト」が紐づけられており、コストの合計を小さくするパスが自動的に選択されます。
後述するシミュレータの利用にあたっては、経路制御のために接続ごとのコストを設定できる程度の認識で問題ありません。

bgpsimの操作方法

#

ここからは、BGPをWeb上でシミュレートできるbgpsimについて紹介していきます。
2025年1月現在、以下のリンクからサイトに飛ぶことができます。
https://bgpsim.github.io/

bgpsimのフリーズについて

2025年1月現在、特定の操作をするとWasmモジュール内のエラーにより、画面が操作できなくなるので適度な保存をお勧めします。
シミュレータ画面の左側のメニューにある、Export Networkからjson形式でネットワークをダウンロードできます。

それでは以下の流れで見ていきましょう。

ルータの配置

#

画面左上にある「+」ボタンからBGPルータの追加が可能です。
e08ce66aed3085ee69a114ed778f3f75.png

Internal RouterとExternal Routerの2つから選べますが、まずはAS内部のルータであるInternal Routerを並べていきましょう。

bb6d747b4d9cfc187beb3437b4143846.png

次にExternal Routerを配置します。External Routerは、別のASにあるルータを表現しています。

2f7586a8544edc657ec713b76555ff42.png

接続の定義

#

右クリックからAdd Linkを選択すれば、物理的な接続が定義できます。

71922170ba4921725df5a2d0c642ca3a.png

以下のようなシンプルな接続を作ってみます。

d83b752ede6d2371419d7e8175e4ba18.png

BGPセッションの確立

#

今度はBGPセッションを確立していきます。まずは、Data PlaneからBGP Configにビューを切り替えていきます。
次に任意のInternal Routerの上で右クリックを押すとメニューが出現するので、Add iBGP Sessionを選択します。

023c5d902fcc4f2995b74df71af436ff.png

ここで青い矢印がマウスカーソルを追尾する状態になるので、この状態で特定のルータをクリックすると、セッションを確立できます。
3つあるInternal Routerのルータを相互に接続させて、最終的に以下のようにセッションを確立します。

c09958c4a7a92c5a24877a1d636feab4.png

次にeBGPを構築します。external Routerの上で右クリックをしてAdd eBGP Sessionを選択します。
同様にして隣接するルータにeBGPを確立していきます。

c67006521f2c04c0455f64b510855edc.png

eBGPからルータへの広告

#

ここまでの操作では、AS外の情報を一切渡していないため、BGPは機能しません。
まず、任意のexternal Routerを左クリックします。
右側にメニューが現れるので、Advertised Routes内New routeにASのCIDR(100.0.0.0/24)を入力します。

ac56784bceab557de019fddce8c3b4d1.png
この状態でAdvertiseをクリックすると、さらに設定が追加できます。

AS_PATHを入力する項目があるので、任意のパス(この例では”2”)を入力してください。

6e8054833cdde818c13b586789bedca9.png

もう1つのeBGPについても、AS Pathも変更します。
次のパスは少し長めにしたいので、「1; 3」といった具合に設定します。

7eb94f3baa9991a79998e346e6b815c2.png

この状態で左上メニューから、ビューをBGP configからData planeに変更すると、BGPによる経路が可視化されるようになります。
前章で述べたように、AS_PATHが短くなるようなパスを経由するよう、BGPの経路探索が行われます。

28a89842920de230788d591dac4bc585.png
このようにして、bgpsim上で通信経路を探索できました。

bgpsimを使ったパラメータの検証

#

最後に、シミュレータを使った検証例を示していきます。

AS_PATHの変化による制御

#

前章で示したように、外部のASにアクセスする場合、経由するASを少なくするようなパスが選択されます。
2つのeBGPセッションのうち、パス長を短くしていたものに対して、パスを追加していきます。
修正前のパスは次のようになっています。

3d5a681418e3f5b013c9e0006f642182.png

このAS_PATHについて”2”から”2, 5, 7”といった具合にパスを追加していくと、以下のように経路が変更されることを確認できます。

d5a48e99adb0215184e5d1968d6f897f.png

LOCAL_PREFの変化による制御

#

次に、LOCAL_PREFを使って、AS_PATHを変化させずに最適な経路の向きを元に戻しましょう。
下図において、白色の太枠で囲われているExternal Router(E2)と青マークのルータ間の優先度を上げれば、経路を元に戻せそうです。
2e1fdd58bf860a517d099aef800cda41.png

以下のようにLOCAL_PREFパラメータを制御すれば、経路を元に戻せそうです。

  • パラメータを設定するルータ:青くマークされているルータ(R3)
  • 設定すべきルート:E2→R3
  • パラメータと量:LOCAL_PREFを100から1000へ

設定対象のルータを左クリックしてメニューを表示した後、以下のようにBGP Route-Mapsを編集すれば、優先ルートが初めの向きに戻ります。

78c6bf14de1817a822e0e86580f65005.png

ここで、Control Planeにビューを切り替えた後に、特定のルータにカーソルを合わせてみます。
先ほど設定したパスが優先経路となっている旨の表示が確認できます。

8a62778e5acf409bb3d4153a7fd48b70.png

まとめ

#

本記事では経路探索プロトコルであるBGPの概要とBGPを検証するシミュレータについて簡単に紹介させていただきました。
私自身はBGPという用語だけ知っている状態でしたが、シミュレータで検証することにより、おぼろげながら理解を深めることができました。


  1. 色々なサイトを見ましたが、実質的にルーターと考えて差し支えないようです。 ↩︎

  2. 機器固有の話になるので深くは説明しませんが、BGPセッションをどのような方法(コマンド)で確立したかによってこの属性が変化します。 ↩︎

  3. 特定のIDが小さい等、有意ではない条件が続くため、以降は省略しています。 ↩︎

  4. ルータの機能として備わっているものもあれば、OSPFからBGPへのredistributeのように RFCで定義されているものもあります(RFC 1403)。 ↩︎

豆蔵では共に高め合う仲間を募集しています!

recruit

具体的な採用情報はこちらからご覧いただけます。