2008-09-04

FreeBSDのjail内でdhcpdを動かす

今のところFreeBSD-7.0のjailではbpfが動かないが、net/isc-dhcp3-serverにはDHCP_SOCKETSオプションがあり、bpfを使わずに動作するバイナリがビルドできる。しかし、これをjail内で動かすだけで、dhcpサーバとして働くかというと、そうもいかなかった。

まず、jail内ではbroadcastパケットを受信できないようで、dhcpリクエストの中継サーバが外に必要らしい。jail(8), jail(2), ハンドブックを探したが、broadcast受信の制約は見かけなかった気がする。jailの制約はときどき変わったりするので、どこかにまとめてあればいいんだけど。

そこで次に、net/isc-dhcp3-relayをホスト側で動かしてみた。そうすると確かに、dhcpdのログにはリクエストの到着とレスポンス内容が記録されるが、そのレスポンスパケットが外に出ていっていない。jail内のdhcpdからlo0経由でホスト側に来たパケットをdhcrelayが見ていない感じである。dhcrelayに -i lo0 を指定するとエラーになるので、無理やりIFF_LOOPBACKをスキップしないようコードを修正してみたが、それもうまくいかなかった。

というわけで、dhcrelayを完全に別のホストに設置してみたところ、あっさりと双方向に中継されて、dhcpクライアントが動くようになった。つまり、同じホスト内でパケットを中継するということをdhcrelayが想定していないせいなので、うまくいじれば直せる問題だと思う。

とすると、他の実装では動く可能性があるということなので、試しに、net/dhcprelay と net/dhcprelya をホスト側で動かしてみたら、どちらも、*_ifaces に lo0 を追加指定するだけで、問題なく中継できてしまった。そこで最終的に、これらのうち、高負荷ルータ用と銘打っている dhcprelya を採用。

ちなみに、dhcpdには、ホスト側で起動してbpfを掴んだのちに、chrootやjailに入るというオプションもあるようだが、美しさというか整合性の都合で採用を見送った。

中継サーバがいらなくなるであろう、vimageの正式採用にとても期待。

追記(9/11)

dhcprelyaを動かしていたら、数秒に1回
wrong ether type -- packet ignore
と出ていた。わずらわしいだけだが、dhcprelayだと出ないようなので、こちらに採用変更。

0 件のコメント: