はじめに
こんにちは。ネットワークエンジニアの「だいまる」です。
今回は、EGPの1つであるBGP(Border Gateway Protocol)について、まとめていきたいと思います。
BGPシリーズの記事一覧
そもそもBGPとはなにか?
BGPは、EGPのプロトコルの1つであり、世の中のネットワークで広く利用されているプロトコルになります
このプロトコルは各通信事業者やISP、コンテンツ事業者が所有するネットワーク(AS)間を接続し、経路交換を行うことが目的となります。
このBGPの世界は複雑であり、とても面白いものになっています。
今回は、まず基本となる「Tier」や「ピアリング」、「ピア」、「BRIB」、「メッセージタイプ」を説明してきたいと思います。
BGPの世界で重要な「Tier」という考え方
BGPの世界で非常に重要となる考え方が「Tier」になります。
このTierとは、「ネットワークの世界を表すAS(Autonomous System)間をつなぐための権力の強さやヒエラルキー」と思ってもらえればいいと思います。
なぜこの言い方をしたのか?
それは、「Tierの番号が小さい程、その企業が所持する経路数が多く立場が強いため」です。
では、なぜ経路数を持っているAS(企業・組織)の立場が強くなるのか?
所持する経路が少ない場合、今ではどんなアプリやサイトも繋がるのが当たり前ですが、接続できない状態になる可能性があるためです。
例えば、下の図のように各市町村をつなぐ道や橋があったとします。
この道や橋はBGPの経路に該当し、数が多いほど最短でその市町村に行けるようになります。
一方、道や橋が少ない場合、遠回りになったり、たどり着けない可能性が出てきます。
そのため、所持する経路数が少ないほど不利となるのです。
また、所持する経路が少ない場合、接続可能なサイトやアプリの減少につながる恐れがあるため、ユーザ数や利益の減少につながりかねません。
そのため、必然的にネットワーク業界では、Tierの番号が一番若い「Tier1」の企業の立場が強くなるのです。
このTier1はどんな企業なのか?
それはwikipedia等にも載っていますが、以下のリストとなります。
これらの企業はインターネットの中心地であるアメリカ企業が大半を占めています。
日本の企業も唯一「NTTコミュニケーションズ」が含まれています。
この理由は、NCOMがTier1のアメリカ企業を買収したため、Tier1の仲間入りをしました。
- AT&T(アメリカ、7018)
- Deutsche Telekom Global Carrier(ドイツ、3320)
- GTTコミュニケーションズ(アメリカ、3257)
- Liberty Global(イギリス、6830)
- ルーメンテクノロジーズ(アメリカ、3356)
- NTTコミュニケーションズ(日本、2914)
- オレンジ(フランス、5511)
- PCCWグローバル(香港、3491)
- Tモバイル(アメリカ、1239)
- タタコミュニケーションズ(インド、6453)
- イタリアテレコム(イタリア、6762)
- ベライゾン(アメリカ、701)
- Zayoグループ(アメリカ、6461)
- Arelion(スウェーデン、1299)
- Telxius(スペイン、12956)
しかし、最近はGAFA系の企業がTier1に匹敵する経路を持つようになり、構造が変わりつつあるようです。
その理由は、多くのユーザや企業がパブリッククラウドを利用する昨今、クラウドを利用するユーザ端末が属する通信キャリアやプロバイダもパブリッククラウド企業と経路交換する必要があります。
そのため、パブリッククラウドの需要の高まりにより、所持する経路数が多くなり、Tier1に匹敵するようになったのです。
そのため、わざわざTier1の企業と契約する必要もない場合が出てきているようです。
経路交換のためには「ピアリング」を行う必要がある!!
「Tier」の概念がわかったところで各企業間同士で経路交換を行うためには、「ピアリング」を行う必要があります。
この「ピアリング」には、主に「トランジット」と「ピアリング」の2パターンが存在します。
基本となる「トランジット」について
トランジットとは、「ある1つのASから他のASに関する経路も受信するサービス・契約方法」になります。
これは、基本的に有償となるため、費用はかかりますが、1つのASと経路交換を行うことで全経路(フルルート)を受信できるため、保守・運用面でかなり楽になります。
このサービスは、日本の場合、BBIXやKDDI、NCOMといったIX事業者が主に取り扱っています。
BGP世界で重要となる「ピアリング」とは?
ピアリングとは、「各事業者が持つAS間でBGPピアを張り経路交換を行う方式」です。
ピアリングには、主に「パブリックピアリング」と「プライベートピアリング」の2種類があります。
まずはパブリックピアリングから説明したいと思います。
パブリックピアリングとは?
ピアリングは各事業者間での物理的な接続が必要となるため、費用がかかります。
特にサービスを提供するコンテンツ事業者(LINE/Yahoo/さくら/mixi等)は、サーバを設置するデータセンタ内でピアリングできれば良いですが、そうでない場合も多々あります。
実際、各事業者が集まるデータセンタが優位性が高くなり、サーバルームの空きがなく、大変人気となっております。
そのため、各国に存在するIX事業者が管理するネットワークに接続し、論理的にピアリングを行うことが多くなっています。
日本だとBBIXやKDDIなどが該当するよ!
しかし、このパブリックピアリングには「ピアリングのタダ乗り」という課題があります。
これはどういうことか?
IX事業者のNW(ネットワーク)を介してピアリングを行なっているため、どのASも同一レンジのネットワークに属しています。
そのため、Static経路でピアリングを実施していないASに強制的にトラフィックを流すことも可能なのです。
この行為はルール違反ですが、これを実施することでピアリングの費用を抑えることもできてしまいます。
暗黙のルールでどの事業者も基本やってませんが、稀にいます!(とある国が多い印象です)
では、どうやって見つけるのか?
残念なことに受信側の事業者で送信元と宛先のASを監視し判断するしかありません。
つまり監視体制が乏しい事業者はタダ乗りされている可能性が高いと思います。
また、このピアリング形式を実施する際には、双方のIX事業者への接続帯域を考える必要があります。
当たり前の話ですが、AS XとAS YのIX事業者への接続帯域は異なります。
その観点を無視し、ピアリングを行いトラフィックを流すと輻輳につながり、サービス品質の低下につながります。
そのため、双方の交渉の上で成り立つのが「パブリックピアリング」になるのです。
次にプライベートピアリングについて、説明したいと思います。
プライベートピアリングとは?
「プライベートピアリング」は、ASを持つ企業同士で物理的に直接繋がったNWを構築し、ピアリングを行う方法です。
これは、同規模のASの場合、双方にメリットがあるため、ピアリングを無料で行うことが多いと思います。
ASの規模が異なる場合、小規模事業者から大規模事業者に利用料を払うパターンが一般的です。
BGPのルーティングテーブル「BRIB」
BRIBとは「BGP RIB」を指し、「Adj-RIB-in」、「LOC-RIB」、「Adj-RIB-out」の3つから構成されます。
「Adj-RIB-in」はUPDATEメッセージの蓄積を行い、「LOC-RIB」でポリシー適用、フィルタリングの反映を行います。
そして、「Adj-RIB-out」でベストパスの蓄積とネイバー宛に送信を行います。
ルーティングテーブルとの連携は、「LOC-RIB」で実施し、それぞれのテーブル情報を更新・交換を行います。
- Adj-RIB-in:UPDATEメッセージの蓄積
- LOC-RIB:ポリシー適用・フィルタリング反映
- Adj-RIB-out:ベストパスの蓄積・ネイバー向けにベストパスの送信
BGPには「IBGPピア」と「EBGPピア」2種類が存在する
この章では、ルータ同士でBGPネイバーを張るためのBGPピア2種類について説明したいと思います。
BGPピアは、同一AS内のルータで接続する「IBGPピア」と他ASのルータと接続する「EBGPピア」が存在します。
同一AS内部のルータと接続するIBGPピア
IBGPピアは、基本的に全ルータとBGPネイバ関係を確立するフルメッシュ構成となります。
しかし、この構成はネットワーク規模の拡大に比例しIBGPピア数が増大するため、「ルートリフレクタ」と呼ばれるBGP専用ルータを用意し、ピア数を削減します。
ピア数が増大すると何が問題なのか?
BGPはインターネット向けや他ASなど数多くの経路を交換するために使われるプロトコルです。
そのため、ピア数が多い場合、ルータのCPUやメモリに負荷をかけてしまい、通信断につながる可能性があります。
また、ルータによっては保持できるBGPピア数に上限があるため、ピア数を減らしたいのです。
ちなみに、このIBGPピアはTTLが255以内等の条件があります。
そんなIBGPピアの設定コマンドは以下の通りです。
router bgp 10
network 10.0.1.1 mask 255.255.255.255 #経路広報するネットワークの定義
neighbor 10.0.1.2 remote-as 10 #ネイバーの設定(IPアドレス:相手のアドレス、AS番号:相手のAS番号)
!
このIBGPピアには、「スプリットホライズン」と呼ばれる機能が働いていています。
これは、IBGPピアのルータから受信した経路は他のiBGPピアには広報しないようにする機能です。
この機能がない場合、経路のループが発生しネットワーク全体がダウンしてしまいます。
外部ASと接続を行うEBGPピア
EBGPピアは「異なるAS間のルータで張るピア」になります。
同一AS内部のルータ同士でBGPネイバを確立するIBGPとは異なり、フルメッシュ構成を取る必要はありません。
また、IBGPと異なるのはTTLが1となっているため、直接接続しているルータとだけピア接続することができます。
しかし、直接接続していない場合でもEBGPピアを張りたい時は、「意図的にTTLを増やす設定を投入」することで接続することもできます。
設定コマンドは以下の通りです。
router bgp 10
network 10.0.1.1 mask 255.255.255.255 #経路広報するネットワークの定義
neighbor 10.0.2.7 remote-as 20 #ネイバーの設定(IPアドレス:相手のアドレス、AS番号:相手のAS番号)
neighbor 10.0.2.7 ebgp-multihop 2 #TTLを増やしたい場合の設定
!
EBGPピアの場合、外部のASルータと経路交換を行うために、ピアを確立します。
そのため、よく経路フィルタとして「Route-Map」や「Prefix-List」で広報する経路や受信する経路を制御しています。
これは意図しない経路を受信することにより、経路ループが発生することや悪意のあるユーザが経路を乗っ取ることもあるためです。
メッセージタイプ
この章では、BGPで利用されるメッセージについて説明していきます。
BGPでは主に「5つのメッセージ」があります。
今回は、CMLでパケットキャプチャしたデータと共に確認していきたいと思います。
BGPピア確立のための「OPENメッセージ」
OPENメッセージは、「BGPセッション開始時に送信されるメッセージ」です。
また、TCPセッション確立後にメッセージの送信を行い、同期情報が正しい場合、Keepaliveを返します。
このメッセージに含まれる情報は、「Version」や自分自身のAS番号を表す「MyAS」、Keepaliveがない際のセッション確立時間である「Holdtime」、BGPルータの識別子である「Idetifier」があります。
フィールド | オクテット | 用途 |
Version | 1オクテット | BGPのVersion(現在は4) |
My AS | 2オクテット | 送信元のAS番号(ここの値によりiBGP/eBGPを判断) |
Holdtime | 2オクテット | ホールドタイム(通常時:180sec、Keepalive:60sec) |
Identifier | 4オクテット | BGPスピーカの識別子 |
Option Param | Length:1オクテット Param:TLV表記 |
BGPの経路情報を交換する「UPDATEメッセージ」
「UPDATEメッセージ」は、経路情報の交換を行うための利用するメッセージとなります。
このメッセージには、削除経路の長さを表す「Unfeasible Route Length」や削除される経路リストを表す「Withdrawn Route」、Path Attribute長を示す「Total Path Attribute Length」、「Path Attribute」、「NLRI」があります。
今回のパケットキャプチャのデータではwithdrawnがない状態となります。
フィールド | オクテット | 用途 |
Unfeasible Route Length | 2オクテット | Withdrawn Routeの長さ |
Withdrawn Route | ・Length:1オクテット(Prefix) ・Prefix:オクテット単位 | Prefixをオクテット単位で格納 |
Total Path Attribute Length | 2オクテット | パス属性長を定義 |
Path Attribute | 可変長 | パス属性をTLV形式で格納 |
NLRI | 可変長 | パス属性が付加されたPrefixを格納 |
BGPピアの維持のために利用されるKEEPALIVEメッセージ
「KEEPALIVEメッセージ」は、BGPピアのセッションを維持するために利用されるメッセージです。
このメッセージは、デフォルトで60秒毎にネイバー宛に送信され、死活確認を行います。
KEEPALIVEメッセージは、共通ヘッダのみとなります。
単純な死活確認だけだからヘッダ情報も少ないのよ
経路更新を行うためのROUTE REFRESHメッセージ
「ROUTE REFRESHメッセージ」は、経路更新が必要な場合に経路の再要求のために利用するメッセージです。
このメッセージは、OPENメッセージのOPTION PRAMフィールドを利用します。
エラー通知のためのNOTIFICATIONメッセージ
「NOTIFICATIONメッセージ」は「BGPピア間でエラー検知時に送信されピアを切断」します。
メッセージ内容は、Error Code、Subcodeで各エラー理由を表記します。
数が多いので、テーブル表記は割愛します
最後に
今回は、BGPの基本的な部分についてまとめました。
この内容は、以下の本がとてもわかりやすくまとめられているのでおすすめです。
次回は、BGPのフィルタリングや経路集約について投稿する予定です。