インターネットのフルルート(59万経路)をGoBGPに注入してみました。
Ubuntu16.04上でGoBGPを動かし、Route Views Archive Projectで公開されているMRT形式のダンプデータを注入します。
本記事は@codeoutさんのフルルート入れるのにgobgp を使ってみるを参考にしています。
関連投稿
その1:インターネットのフルルートをGoBGPで注入してみた(本記事)
その2:インターネットのフルルートをGoBGPからVyOSに注入してみた
はじめに
GoBGPはフロントエンドのgobgpとバックエンドのgobgpdの2つの実行ファイルがあります。
gobgpdはBGPの処理をするデーモンとして動作します。gobgpはgobgpdをユーザが操作するツールとして動作します。gobgpでBGPのピアの状態を確認や経路を注入します。
今回は下図のように、フルルートをgobgp経由でgobgpdに注入します。
環境
BGPのフルルート注入は下記の環境で実施しました。
- Intel NUC, NUC5i5RY(Core i5-5250U)
- Oracle VM VirtualBox 5.0.18
- 仮想マシンのメモリに4GB割当(gobgpdで結構メモリ使います)
- Ubuntu 16.04 LTS(ubuntu-16.04-server-amd64.iso)
- Golang 1.6
- GoBGP v1.6
図. Oracle VM VirtualBox上の仮想マシンの設定
GoBGPのインストール
GoBGPのGetting Startedを参考にインストールします。
Ubuntu16.04の場合、golangのインストールだけでOKです。
# Go言語を使っていない場合はgolang-1.6をインストール
$ sudo apt update
$ sudo apt install golang-go
# GOPATHで外部ライブラリのインストール場所を指定($HOME/go)
$ echo 'export GOPATH=$HOME/go' >> ~/.bashrc
$ echo 'export PATH=$GOPATH/bin:$PATH' >> ~/.bashrc
$ source ~/.bashrc
# GoBGPのインストール(時間かかる)
$ go get github.com/osrg/gobgp/gobgpd
$ go get github.com/osrg/gobgp/gobgp
# Bash用の補完スクリプトの読み込み
$ wget https://raw.githubusercontent.com/osrg/gobgp/master/tools/completion/gobgp-completion.bash
$ wget https://raw.githubusercontent.com/osrg/gobgp/master/tools/completion/gobgp-static-completion.bash
$ wget https://raw.githubusercontent.com/osrg/gobgp/master/tools/completion/gobgp-dynamic-completion.bash
$ source gobgp-completion.bash
GoBGPデーモンの起動
AS65000でGoBGPデーモン(gobgpd)を起動します。ルータIDは192.168.0.1を設定しています。今回はフルルートを読み込むだけで、BGPピアの設定はしていません。
# 設定ファイル作成
$ cat <<EOF > gobgpd.conf
[global.config]
as = 65000
router-id = "192.168.0.1"
EOF
# GoBGPデーモンを起動
$ sudo $HOME/go/bin/gobgpd -f gobgpd.conf
{"level":"info","msg":"gobgpd started","time":"2016-05-02T23:32:43+09:00"}
{"level":"info","msg":"finished reading the config file","time":"2016-05-02T23:32:43+09:00"}
MRTデータのダウンロード
BGPのフルルートはRoute Views Archive Projectで公開されています。MRT形式のダンプデータ(MRTデータ)のアーカイブ形式で公開されています。
今回は最新のMRTデータをダウンロードします。サイズが最も小さいDIXIE (NSPIXP), Tokyo, Japanのダンプデータを使用します。
MRT format RIBs and UPDATEs from DIXIE (WIDE)から2016.05/RIBS/rib.20160502.1400.bz2(7.1MB)をダウンロードします(UTC表記のため、JSTでは2016/5/2 21:00のデータとなります)。bzip2形式で圧縮されており、展開前は7.1MB、展開後は66MBです。
# ダウンロード
$ wget http://archive.routeviews.org/route-views.wide/bgpdata/2016.05/RIBS/rib.20160502.1400.bz2
# GoBGPで読み込むため展開
$ bzip2 -d rib.20160502.1400.bz2
フルルートの注入
gobgpコマンドでMRTデータを注入します。59万経路の注入には90秒程度かかり、gobgpdのみで2GB程度のメモリを消費します。
# コマンドの補完を効くように補完スクリプトを読み込む
$ source gobgp-completion.bash
# MRTデータをGoBGPデーモンに注入します。90秒程度
$ gobgp mrt inject global rib.20160502.1400
gobgp global rib
コマンドでは、IPプレフィックスの検索のみサポートされています。MRTデータを生成しているBGPルータのピア数は2のため、ベストパス以外も表示されます。IPプレフィックスと、ASパス、アトリビュートが表示されます。ネクストホップはMRTデータを生成したルータのものになります。
# 8.8.8.8のIPアドレス形式で検索
$ gobgp global rib 8.8.8.8
Network Next Hop AS_PATH Age Attrs
*> 8.8.8.0/24 202.249.2.169 2497 15169 00:04:03 [{Origin: i}]
* 8.8.8.0/24 202.249.2.169 7500 2497 15169 00:04:03 [{Origin: i}]
# 202.248.0.0/16のIPプレフィックス形式で検索
$ gobgp global rib 202.248.0.0/16
Network Next Hop AS_PATH Age Attrs
*> 202.248.0.0/16 202.249.2.169 2497 2510 00:03:51 [{Origin: i}]
* 202.248.0.0/16 202.249.2.110 7500 2516 2510 00:03:51 [{Origin: i}]
# BGPテーブルを表示(時間がかかります)
$ gobgp global rib | head -n20
Network Next Hop AS_PATH Age Attrs
*> 1.0.4.0/24 202.249.2.169 7500 2497 4637 1221 38803 56203 00:30:31 [{Origin: i}]
* 1.0.4.0/24 202.249.2.169 2497 4637 1221 38803 56203 00:30:31 [{Origin: i}]
*> 1.0.5.0/24 202.249.2.169 7500 2497 4637 1221 38803 56203 00:30:31 [{Origin: i}]
* 1.0.5.0/24 202.249.2.169 2497 4637 1221 38803 56203 00:30:31 [{Origin: i}]
*> 1.0.6.0/24 202.249.2.169 7500 2497 4637 1221 38803 56203 56203 56203 00:30:31 [{Origin: i}]
* 1.0.6.0/24 202.249.2.169 2497 4637 1221 38803 56203 56203 56203 00:30:31 [{Origin: i}]
*> 1.0.38.0/24 202.249.2.169 2497 10026 24155 00:30:31 [{Origin: i}]
* 1.0.38.0/24 202.249.2.169 7500 2497 10026 24155 00:30:31 [{Origin: i}]
*> 1.0.64.0/18 202.249.2.169 2497 7670 7670 7670 18144 00:30:31 [{Origin: i} {AtomicAggregate} {Aggregate: {AS: 18144, Address: 219.118.225.188}}]
* 1.0.64.0/18 202.249.2.110 7500 2516 7670 18144 00:30:31 [{Origin: i} {AtomicAggregate} {Aggregate: {AS: 18144, Address: 219.118.225.188}}]
*> 1.0.128.0/17 202.249.2.169 2497 38040 9737 00:30:31 [{Origin: i} {AtomicAggregate} {Aggregate: {AS: 9737, Address: 203.113.12.254}}]
* 1.0.128.0/17 202.249.2.169 7500 2497 38040 9737 00:30:31 [{Origin: i} {AtomicAggregate} {Aggregate: {AS: 9737, Address: 203.113.12.254}}]
*> 1.0.128.0/18 202.249.2.169 2497 38040 9737 00:30:31 [{Origin: i} {AtomicAggregate} {Aggregate: {AS: 9737, Address: 203.113.12.254}}]
* 1.0.128.0/18 202.249.2.169 7500 2497 38040 9737 00:30:31 [{Origin: i} {AtomicAggregate} {Aggregate: {AS: 9737, Address: 203.113.12.254}}]
*> 1.0.128.0/19 202.249.2.169 2497 38040 9737 00:30:31 [{Origin: i} {AtomicAggregate} {Aggregate: {AS: 9737, Address: 203.113.12.254}}]
* 1.0.128.0/19 202.249.2.169 7500 2497 38040 9737 00:30:31 [{Origin: i} {AtomicAggregate} {Aggregate: {AS: 9737, Address: 203.113.12.254}}]
*> 1.0.128.0/24 202.249.2.169 2497 38040 9737 23969 00:30:31 [{Origin: i}]
* 1.0.128.0/24 202.249.2.169 7500 2497 38040 9737 23969 00:30:31 [{Origin: i}]
*> 1.0.129.0/24 202.249.2.169 7500 2497 38040 9737 23969 00:30:31 [{Origin: i}]
gobgpdのメモリ消費
topの結果、gobgpdプロセスでは、2.5GB程度のメモリを消費していることがわかります。
おわりに
今回はGoBGPにフルルートを注入しました。メモリはかなり消費しますが、動作が早いのが利点です。
現状のままでは、IPプレフィックスからOrigin ASを検索することぐらいしかできません。
追記:BGPピアにフルルートを広報する記事を書きました。
インターネットのフルルートをGoBGPからVyOSに注入してみた