BuildしたFRRoutingをDockerコンテナで動作させ、BGPのオレオレPath Attributeを流す
- buildしたFRRoutingをDockerコンテナで動かす
- FRRoutingでbgpdを小改造し、自作path_attrをパケットに入れて運ぶ
- BGPあれこれ
- 動作確認
- おまけ : topotestsの動かし方
- Github
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では、IPv4やIPv6の複数のプロトコルをサポートすることから、それぞれの経路情報を区別して管理するためのグループであるAddress Famillyを定義している。
以下のような種類がある。
Split Horizon
iBGPピアからの経路情報をiBGPピアに流さないことで、iBGPルートがループするのを防止する。
Route-Reflector
AS内の全ルータをフルメッシュでiBGP接続すると、張らなければいけないピア数が増えすぎる。
そこで、Route-Reflectorと複数のクライアントという関係を結び、eBGPルータは得た経路をRoute-Reflectorのみに流すようにする。
そうすることでクライアントは、Route-ReflectorとさえiBGPピアを張りさえすれば各経路を受け取ることができるようになる。
動作確認
自作Path Attributeを含むBGP updateメッセージのパケットをキャプチャした様子は以下である。
ただ単に文字列を含んでるだけであるが、確かにBGP updateメッセージに乗っている。