池の上にも

平均以下の理解力で、色々アウトプットしてみるブログ

quagga + mininet で BGP 検証環境を作る その②

前回のあらすじ

tawaku.hatenablog.com

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 オプションが怪しいのですが、この説明だと分かりません。公式ドキュメントもざっと検索したのですが、説明が見つからず。仕方ないので、以下のソースコード読んでみました。

quagga.git - quagga

./zebra/main.c に -z オプションに対応するコードがありました。

        case 'z':
          zserv_path = optarg;
          break;


zserv_path を追っかけて行くと、./zebra/zserv.cpath 変数に -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_PATHzserv.api のパスが指定されています。-z オプションにパスを指定すれば、$quagga_statedir/zserv.api に変わるパスを設定できるみたいです。

おわりに

show ip route くらい確認しろという話でした。
quagga を触るのが初めてだったので、bgpd で show ip route が叩けなかった時点でこんなものかなと思い、調べるのをやめたのが良くなかったです。