インターネットのフルルートをGoBGPで注入してみた

インターネットのフルルート（59万経路）をGoBGPに注入してみました。
Ubuntu16.04上でGoBGPを動かし、[Route Views Archive Project](http://archive.routeviews.org/)で公開されているMRT形式のダンプデータを注入します。
本記事は@codeoutさんの[フルルート入れるのにgobgp を使ってみる](http://codeout.hatenablog.com/entry/2015/08/11/214248)を参考にしています。

関連投稿
その1：[インターネットのフルルートをGoBGPで注入してみた](http://qiita.com/kooshin/items/fe70c68217a0d399cefa)（本記事）
その2：[インターネットのフルルートをGoBGPからVyOSに注入してみた](http://qiita.com/kooshin/items/103e30ad7cc7b38ce779)

# はじめに
GoBGPはフロントエンドのgobgpとバックエンドのgobgpdの2つの実行ファイルがあります。
gobgpdはBGPの処理をするデーモンとして動作します。gobgpはgobgpdをユーザが操作するツールとして動作します。gobgpでBGPのピアの状態を確認や経路を注入します。

今回は下図のように、フルルートをgobgp経由でgobgpdに注入します。

![diagram.svg.png](https://qiita-image-store.s3.amazonaws.com/0/12026/c35ea55f-4039-2def-65f7-e708ff01bffd.png)
図. 仕組み

# 環境
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](https://golang.org/) 1.6
- [GoBGP](http://osrg.github.io/gobgp/) v1.6

![Screenshot from 2016-05-03 08-41-07.png](https://qiita-image-store.s3.amazonaws.com/0/12026/7e77e065-9658-dd64-7f4e-4a1e8a64501d.png)
図. Oracle VM VirtualBox上の仮想マシンの設定

# GoBGPのインストール
GoBGPの[Getting Started](https://github.com/osrg/gobgp/blob/master/docs/sources/getting-started.md)を参考にインストールします。
Ubuntu16.04の場合、golangのインストールだけでOKです。

```bash
# 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ピアの設定はしていません。

```bash
# 設定ファイル作成
$ 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](http://archive.routeviews.org/)で公開されています。MRT形式のダンプデータ（MRTデータ）のアーカイブ形式で公開されています。

今回は最新のMRTデータをダウンロードします。サイズが最も小さいDIXIE (NSPIXP), Tokyo, Japanのダンプデータを使用します。

[MRT format RIBs and UPDATEs from DIXIE (WIDE)](http://archive.routeviews.org/route-views.wide/bgpdata/)から[2016.05/RIBS/rib.20160502.1400.bz2](http://archive.routeviews.org/route-views.wide/bgpdata/2016.05/RIBS/rib.20160502.1400.bz2)（7.1MB）をダウンロードします（UTC表記のため、JSTでは2016/5/2 21:00のデータとなります）。bzip2形式で圧縮されており、展開前は7.1MB、展開後は66MBです。

```bash
# ダウンロード
$ 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程度のメモリを消費します。

```bash
# コマンドの補完を効くように補完スクリプトを読み込む
$ source gobgp-completion.bash

# MRTデータをGoBGPデーモンに注入します。90秒程度
$ gobgp mrt inject global rib.20160502.1400
```

``gobgp global rib``コマンドでは、IPプレフィックスの検索のみサポートされています。MRTデータを生成しているBGPルータのピア数は2のため、ベストパス以外も表示されます。IPプレフィックスと、ASパス、アトリビュートが表示されます。ネクストホップはMRTデータを生成したルータのものになります。

```bash
# 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程度のメモリを消費していることがわかります。

![Screenshot from 2016-05-02 23-47-30.png](https://qiita-image-store.s3.amazonaws.com/0/12026/cea4768a-ca6c-49ef-56c6-d206e6d73c65.png)
図. top画面

# おわりに
今回はGoBGPにフルルートを注入しました。メモリはかなり消費しますが、動作が早いのが利点です。

現状のままでは、IPプレフィックスからOrigin ASを検索することぐらいしかできません。

追記：BGPピアにフルルートを広報する記事を書きました。
[インターネットのフルルートをGoBGPからVyOSに注入してみた](http://qiita.com/kooshin/items/103e30ad7cc7b38ce779)