quagga + mininet で BGP 検証環境を作る その②
前回のあらすじ
1ヶ月前に quagga + mininet で作る BGP 検証環境の構成方法をまとめてみたのですが、色々触っていくうちに分かった事があるので記録を取っておきます。
実は前回のエントリで間違っていた箇所があり、修正したところを自戒も込めて経緯を残しておこうかと思いました。
修正したところ
前回のエントリで修正した箇所で、最も良くなかったのが以下の箇所です。
加えて、zebra/bgpd が使う Zserv API のソケットのパス(-z オプションで指定)を追加しておきます。
quagga + mininet で BGP 検証環境を作る その① - 池の上にも
quagga では、bgpd が受け取ったルート情報を zebra に渡して、zebra がルーティングテーブルに反映するという動作をします。その際に、bgpd は zebra が提供する Zserv API を使ってルート情報を伝えるらしいです。
前回は上述の仕組みが分かっていなかったのもあり、bgpd で show ip bgp
叩いたら、ルートの交換ができていたので、うまく行ったと思い、確認を終えました。後日 zebra で show ip route
叩いたらルートが載って来ておらず、間違いが発覚しました。ちゃんと確認しろという話です。
Zserv API がおかしい
zebra のログを見たら、ちゃんとエラーが出てました。zerv.api が作られていないようです。
$ sudo cat /tmp/R1.log 2017/10/28 19:31:07 ZEBRA: Can't bind to unix socket /var/run/zserv.api: Permission denied 2017/10/28 19:31:07 ZEBRA: zebra can't provide full functionality due to above error
bgpd 側でも zserv.api にアクセスできていないことが分かるエラーが、strace で確認できました(26967
は bgpd の PID です)。
$ sudo strace -f -p 26967 connect(14, {sa_family=AF_LOCAL, sun_path="/var/run/zserv.api"}, 20) = -1 ENOENT (No such file or directory)
/var/run/
に quagga グループからの書き込み許可を追加する方法もあるかと思ったのですが、複数の quagga を動かしているのでファイル名がかぶってしまうとおかしな事になります。なので、zserv.api のパスを指定する方法を探しました。
zebra/bgpd のオプション -z
取り敢えず、起動時のオプションを確認してみます。
$ zebra --help : -z, --socket Set path of zebra socket :
-z オプションが怪しいのですが、この説明だと分かりません。公式ドキュメントもざっと検索したのですが、説明が見つからず。仕方ないので、以下のソースコード読んでみました。
./zebra/main.c
に -z オプションに対応するコードがありました。
case 'z': zserv_path = optarg; break;
zserv_path
を追っかけて行くと、./zebra/zserv.c
の path
変数に -z オプションに指定した値が入るようです。path
が指定されていないと ZEBRA_SERV_PATH
の値が使われるみたいです。
zebra_serv_un (path ? path : ZEBRA_SERV_PATH);
ZEBRA_SERV_PATH
を検索してみると、configure.ac
に以下の記述がありました。
$ grep "ZEBRA_SERV_PATH" ./configure.ac AC_DEFINE_UNQUOTED(ZEBRA_SERV_PATH, "$quagga_statedir/zserv.api",zebra api socket)
ZEBRA_SERV_PATH
に zserv.api
のパスが指定されています。-z オプションにパスを指定すれば、$quagga_statedir/zserv.api
に変わるパスを設定できるみたいです。
おわりに
show ip route
くらい確認しろという話でした。
quagga を触るのが初めてだったので、bgpd で show ip route
が叩けなかった時点でこんなものかなと思い、調べるのをやめたのが良くなかったです。