インターネットの心臓部を支える「BGP」をより柔軟に使うにはどうすればいいか?

インターネットの心臓部を支える「BGP」をより柔軟に使うにはどうすればいいか?

  • GIGAZINE
  • 更新日:2020/08/02
No image

インターネットを利用していると「IPアドレス」や「プロバイダー」といった単語を見かけたことがある人は多いはず。インターネットではIPやTCPといった数多くのプロトコルによって通信が行われていますが、中でもインターネットの中心部で利用されているプロトコルが「Border Gateway Protocol(BGP)」です。ネットワークエンジニアのJordan Whited氏が、BPGをより柔軟に利用するためのプラグインを提供するライブラリ「CoreBGP」を公開しています。

CoreBGP - Plugging in to BGP | Jordan Whited

https://www.jordanwhited.com/posts/corebgp-plugging-in-to-bgp/

BGPは通信の宛先を決定するルーティングプロトコルの一種で、代表的なルーティングプロトコルはBGPの他にもRIPOSPFがあります。BGPはインターネットの中心部で使用されるプロトコルであるだけに、設定ミスなどの影響が大きくなりがちです。2020年7月にCloudflareで発生した障害も、BGPの設定ミスによるもの。

Cloudflareでネットワークの50%がダウンする大規模障害、DiscordやFeedlyなどの大型サイトに影響 - GIGAZINE

No image

ルーティングプロトコルは隣接するルーター間で宛先までの距離と方向を交換し合う距離ベクトル型と、すべてのルーターがネットワーク全体の経路図を保持するリンク状態型に大別され、BGPは距離ベクトル型に分類されるプロトコル。正確には、距離ベクトル型を発展させたパスベクトル型の経路制御を行っています。

BGPが動作するルーターは「BGPスピーカー」と呼ばれ、BGPスピーカー同士が「BGPピア」を確立して経路情報を交換し合うことで、通信の宛先を自動で制御することができます。BGPスピーカーは以下の4つのメッセージによって、他のBGPスピーカーとやりとりします。

・OPEN:隣接するルーター(BGPネイバー)とのTCPコネクション確立後、BGPピアの確立を行うために送信するメッセージ。

・UPDATE:経路情報を含んだメッセージ。BGPスピーカーの設定変更時などに送信される。

・KEEPALIVE:BGPネイバーとの通信が可能かどうかを確認するためのメッセージ。

・NOTIFICATION:エラーを通知するメッセージ。

また、BGPピアの確立は以下の6つの段階があります。

・Idle:BGPが設定されて、まだ何も行われていない状態。

・Connect:BGPネイバーとのTCPコネクション確立を待機している状態。

・Active:TCPコネクション確立を試みている状態。

・OpenSent:BGPネイバーからのOPENメッセージを待機している状態。受信後は問題がなければKEEPALIVEメッセージを、問題があればNOTIFICATIONメッセージを送信する。

・OpenConfirm:BGPネイバーからのKEEPALIVEDもしくはNOTIFICATIONメッセージを待機している状態。KEEPALIVEDメッセージの受信に問題が生じたり、NOTIFICATIONメッセージを受信したりした場合は、Idle状態に戻る。

・Established:BGPピアが確立され、UPDATEメッセージなどを送受信できる状態。

オープンソースのBGP実装はBIRDGoBGPOpenDaylightQuaggaなどがあり、いずれも大規模なインターネットプロバイダーやクラウドプロバイダー、インターネットエクスチェンジ(IX)で利用されるほど安定したものであるとWhited氏。しかし、独自のデータ構造をルーティングテーブルとして使用したり、設定内容の表記方法をカスタマイズしたりするのは、既存の実装では困難であるとのこと。また、ルーティングプロトコルを機能拡張する場合、ルーターの製造元やIETFを説得する必要があり、長い年月がかかるという課題があります。

No image

こうした問題を解決へと導くため、IEEE ICNP 2019で発表された論文「The Case for Pluginized Routing Protocols」は「ルーティングプロトコルのプラグイン化」を提唱。オープンソースのBGP実装である「FRRouting」を利用して、主にメッセージの受信や受信内容をフラグとした分岐動作に対し、プラグインによる機能拡張を提案していました。プラグインの実装にはユーザー空間で実行されたプログラムをカーネル空間内の仮想マシンで実行するLinuxカーネルの機能「eBPF」が使われており、元のプロトコルに影響を与えることなくプラグインをロードできるようになっているとのこと。

Whited氏はThe Case for Pluginized Routing Protocolsにおけるアプローチを「刺激的」としつつも、メッセージの受信にのみ焦点が当たっている点を指摘。そこでWhited氏が開発したのが、BGPに対応したアプリケーション全体で利用できるBGPライブラリ「CoreBGP」です。CoreBGPはGoで記述されており、OPENメッセージの送信と検証、受信したUPDATEメッセージの処理、UPDATEメッセージの送信といった機能を備えています。

GitHub - jwhited/corebgp: CoreBGP is a BGP library written in Go that implements the BGP FSM with an event-driven, pluggable model.

https://github.com/jwhited/corebgp

No image

CoreBGPは本格的なBGPデーモンの基盤としても、単にUPDATEメッセージのロギングとしても機能するとのと。GitHubにコード例が公開されており、IP番号やAS番号を指定してBGPメッセージを送受信することができます。

具体的なCoreBGPの実装は以下。Connect状態においてOPENメッセージなどの情報を取得する「GetCapabilities」や……

No image

OpenSent状態時にOPENメッセージを受信した際、NOTIFICATIONメッセージを送信してBGPピアをIdle状態にする「OnOpenMessage」

No image

Established状態でUPDATEメッセージをやりとりする「OnEstablished」

No image

BGPピアノの状態がEstablishedでなくなったときに発生する「OnClose」を利用することができます。

No image

CoreBGPを用いたサンプルコードも公開されており、IPアドレスやAS番号などを指定してBGPメッセージの処理を行うことができます。

この記事をお届けした
グノシーの最新ニュース情報を、

でも最新ニュース情報をお届けしています。

外部リンク

  • このエントリーをはてなブックマークに追加