ノートPCにunbound導入

ノートPC(FreeBSD 7.1-STABLE)にunboundを導入した.

やりたいことは, http://www.imasy.org/~ume/published/mobile-dns/でtotdを使って行われていることである.
ノートPCでdhcpを使って接続しているとき, 接続先が変わったときに/etc/resolv.confが更新される. firefoxやらなんやらのソフトウェアは/etc/resolv.confを読み直したりしないので, 変更が反映されなくて困る. そこで, /etc/resolv.confには常にローカルで動いているDNSサーバを参照するようにして, DNSサーバの設定を変更するようにすればよい.

別に先のURLの通りにtotdを使ってやってもよくて, unboundをわざわざ採用したのはしいていえば新しかったから, というくらいの理由.
なお, unboundの設定はSoftware Design 2009/1の記事を参考にした(久しぶりに買った).

unboundをまずインストール.

 # cd /usr/ports/dns/unbound
 # make install

/etc/rc.confの適当な場所に

 unbound_enable="YES"

を記述する. 次に設定ファイルを書く. /usr/local/etc/unbound/unbound.confに置く.
同じディレクトリにunbound.conf.sampleがあるから参考にする. 中身は次のようにする.

 server:
 include: "/usr/local/etc/unbound/forward-zone.conf"

server:は書いてあるけど, 何も書いてないので結局デフォルトのまま. そのうち何かあったら書こうかな, というわけで.... 動的に生成するファイル(forward-zone.conf)は別にしておいて, include:で取り込むようにする(後日記す: 相対パスで書くと, unboundを実行した所からの相対パスと認識されるようだ).
/usr/local/etc/unbound/forward-zone.confをtouchして, 空で作成しておく. これがないと, unboundが起動時に怒る.

次はdhclient-scriptの動作変更.
先に参照したURLでは, /sbin/dhclient-scriptにあるmake_resolv_conf()の動作を上書きするとのことだったが, make_resolv_conf()はなくなって, 代わりにadd_new_resolv_conf()ができていた. これを上書きするため, /etc/dhclient-enter-hooksを以下で作成.

 add_new_resolv_conf() {
 
 	local tmpres=/var/run/forward-zone.conf.${interface}
 	rm -f $tmpres
 
 	echo "forward-zone:" >>$tmpres
 	echo "  name: \".\"" >>$tmpres

 	if [ -n "$new_domain_name_servers" ]; then
 		for nameserver in $new_domain_name_servers; do
 			echo "  forward-addr: $nameserver" >>$tmpres
 		done
 	fi
 
 	if [ -f $tmpres ]; then
 		if cmp -s $tmpres /usr/local/etc/unbound/forward-zone.conf; then
 			rm -f $tmpres
 			return 0
 		fi 2>/dev/null
 
 		cat $tmpres > /usr/local/etc/unbound/forward-zone.conf
 		rm -f $tmpres
 
 		chown -RL root:wheel /usr/local/etc/unbound/forward-zone.conf
 		chmod -RL 644 /usr/local/etc/unbound/forward-zone.conf
 		/usr/local/etc/rc.d/unbound reload
 
 		return 0
 	fi
 
 	return 1
 }

forward-zone:は, nameに書かれたゾーンをforward-addrに尋ねる, という動作を記述するそうだ. nameに"."と書いておけば, ぜんぶforward-addrに書かれたIPアドレスに聞きにいくとのこと. forward-zone.confを作った後で, reloadすることで設定を読み直させている. kill -HUP `cat /usr/local/etc/unbound/unbound.pid`でもよい. forward-zone.confのパスがあちこちにうまってるのでグロテスクだけど, そこは見なかったことにする. あと, 変数名があれとか(tmpresのresはresolv.confのresなのだろうから...)というのも考えないことにする.
それから, /etc/resolv.confを

 nameserver 0.0.0.0

としておく.

 # /usr/local/etc/rc.d/unbound start
 # rm -f /etc/resolv.conf.save
 # (dhclientを再起動する)

などとして, テストしておしまい.

...だが, いまのところテストしていないのでちゃんと動いているかはわからない(笑)