自宅ルータが調子が悪くなり潮時かと思い立ち、ZRouterでビルドしたFreeBSDベースのルータに交換する事にした。
構成はこんな感じです。
プロバイダーからDHCPでIPアドレスが渡されて、その時にDNSのアドレスも取得できるので、以下のような構成で対応してみた。
rcのスクリプトでunboundを起動する。とりあえず設定はGoogleのpublicサーバを参照するようにしておく。(あんまり意味ないけど)
/var/unbound/unbound.conf
server:
interface: 0.0.0.0
access-control: 10.0.1.0/24 allow
do-ip6: no
username: "nobody"
remote-control:
control-enable: yes
forward-zone:
name: "."
forward-addr: 8.8.8.8
以下の/etc/dhclient-exit-hooksを用意してrcスクリプトでdhclientをINTERNET側のインターフェースを指定して起動する。
# !/bin/sh
if [ -n "$new_domain_name_servers" ]; then
cp /etc/unbound.conf.tmp /var/unbound/unbound.conf.tmp
# TS=`date "+%Y-%m-%d %H:%M:%S"`
for namesvr in $new_domain_name_servers
do
echo " forward-addr: $namesvr" >> /var/unbound/unbound.conf.tmp
# echo "${TS} $namesvr" >> /tmp/dhcp_debug.log
done
if [ -e /var/unbound/unbound.conf ]; then
TMD=`md5 /var/unbound/unbound.conf.tmp | awk '{print $4}'`
OMD=`md5 /var/unbound/unbound.conf | awk '{print $4}'`
if [ "${TMD}" = "${OMD}" ]; then
UPDATE="no"
else
UPDATE="yes"
fi
else
UPDATE="yes"
fi
if [ "${UPDATE}" = "yes" ];then
mv /var/unbound/unbound.conf.tmp /var/unbound/unbound.conf
/usr/sbin/local-unbound-control reload
fi
fi
unbound.conf.tmpは上のunbound.confからforward-addrを抜いたファイル。
local-unbound-controlは鍵がないと使えません。ネットで調べると鍵はlocal-unbound-setupで作れるという情報があったのですが、12.1ではできなかったの自前スクリプトで作りました。
これでDHCPで渡されたDNSサーバをunboundに渡す事ができます。
更新されてない場合はunboundを再起動しないようにしました。これは再起動するとunboundの統計情報がリセットされてしまためにそうしました。
new_domain_name_serversが複数あり、順番をランダムにして送ってくる場合はうまく動かないですが、我が家のISPは毎回同じ順番で返してくれているようなので、大丈夫なようです。
DDNSを使っている場合は登録用の処理をこのスクリプトの中に入れます。
dnsmasqを内側のDHCP Serverだけで使っているのは以前のなごりです。ネットで調べたところdnsmasqとunboundを連携する方法もありましたが、シンプルにDNSはunboundだけにしてみました。Flashが8Mのルータで設定しましたがとりあえず6Mくらいには収まっています。unboundはライブラリをいくつか必要としていてちょっと大きかったです。