BYB

低レイヤ好き学生エンジニアによる備忘録

BuildしたFRRoutingをDockerコンテナで動作させ、BGPのオレオレPath Attributeを流す

buildしたFRRoutingをDockerコンテナで動かす

imageのbuild

まず、FRR自体のbuildを行う。
Ubuntu 20.04 LTS — FRR latest documentation
例えばUbuntu20で動かす場合、このドキュメントに従えば良い。
次にそのバイナリをコンテナに組み込めるように、docker image をbuildする。
なお2回目以降のbuildに関しては、

 sudo make install

だけでよい。

次に、そのバイナリを含んだdocker image をビルドする。
この部分に関しては、このシェルスクリプトを実行するだけで良い。
github.com

 sudo bash path_to_frr/docker/alpine/build.sh

これが成功すれば、 frr:alpine-XXXXXX のような名前のdocker image が出来上がっているはずである。

コンテナ上でbgpdを動かす

docker run したのちそのコンテナのシェルに入り、以下のコマンドを実行する

sed -i -e 's/bgpd=no/bgpd=yes/g' /etc/frr/daemons
/usr/lib/frr/frrinit.sh start

/etc/frr/daemonsにて、動かすデーモンの種類を指定する。
デフォルトでは多くが動かない設定となっている。



FRRoutingでbgpdを小改造し、自作path_attrをパケットに入れて運ぶ

eniyo0.hatenablog.com
この記事にならってオレオレPath Attribute を自作し、それをdockerコンテナ上で動かした。
Path Attributeの実装については、この記事を見ていただきたい。
実装が終わったらbuildして、前章の内容のとおりにdocker imageに組み込む。
コンテナを立ち上げてbgpdを起動し、次にvtysh(FRRのネットワーク設定用シェル)で以下のような設定をする。
(この設定は一例であり、必ずこの設定で正しく動くことを保証するものではない。)

conf te
router bgp 3
no bgp ebgp-requires-policy
yama_filter
bgp router-id 3.3.3.3
neighbor 10.0.2.1 remote-as 2
!
address-family ipv4 unicast
redistribute connected
exit-address-family
!

AS3にてAS2と接続する際の設定である。

yama_filterというのは、bgpのupdateメッセージのPath Attributeに自作path attrを挿入するためのコマンドである。

no bgp ebgp-requires-policy

については、次章のRoute Mapの項を見ていただきたい。

redistribute connected

については、次章のRedistributeの項を見ていただきたい。

BGPあれこれ

BGPの設定をする中で調べたBGP内の概念についていくつか説明する。

Route Map

Route Mapとは、特定のパケットやルートを定義した条件と、その時に実行される処理とで構成されるリストのことである。
経路フィルタや再配布などの条件設定に使われる。
FRRでは基本的にRoute Mapを用いて明示的に広報する/受け取る経路を指定する必要があるが、

no bgp ebgp-requires-policy

とすることで、すべてのフィルタを取り払って動かすこともできる。

Redistribute

BGP以外で手に入れた経路をbgpで流すための設定。
例えば、connectedである経路をBGPで広報したい場合は、

redistribute connected

という設定を入れる。
この情報は、Address Famillyごとに設定する。

Address Familly

MP-BGPでは、IPv4IPv6の複数のプロトコルをサポートすることから、それぞれの経路情報を区別して管理するためのグループであるAddress Famillyを定義している。
以下のような種類がある。

Split Horizon

iBGPピアからの経路情報をiBGPピアに流さないことで、iBGPルートがループするのを防止する。

Route-Reflector

AS内の全ルータをフルメッシュでiBGP接続すると、張らなければいけないピア数が増えすぎる。
そこで、Route-Reflectorと複数のクライアントという関係を結び、eBGPルータは得た経路をRoute-Reflectorのみに流すようにする。
そうすることでクライアントは、Route-ReflectorとさえiBGPピアを張りさえすれば各経路を受け取ることができるようになる。

動作確認

自作Path Attributeを含むBGP updateメッセージのパケットをキャプチャした様子は以下である。

自作Path Attribute

ただ単に文字列を含んでるだけであるが、確かにBGP updateメッセージに乗っている。




おまけ : topotestsの動かし方

FRRでは作った機能を試す際に、topotestsという機能を使うことができる。
利用方法は以下のリンクを参照されたい。

docs.frrouting.org

github.com

help等を見れば、topotestsで立てた仮想ルータに対する各種操作の方法が分かるが、bashに入るときは工夫が必要である。

PID = ` ps aux | grep /bin/cat `
sudo nsenter -t $PID -a bash --norc

筆者は上記のように、nsenterコマンドによってbashに入っていた。


Github

自作Path Attribute
github.com


dockerコンテナでのテスト(tinetを使用)
github.com