LAN向けのDNSキャッシュサーバ
経緯としてRTX1200 の DNS 機能が TCP フォールバックに対応してないのでオフにした、というのがある。直接 8.8.8.8 8.8.4.4 を DHCP で広告するようにしてみたが、RTT が 8ms ぐらいあるので、やはり LAN 内にキャッシュサーバがあったほうがいいかなと思いはじめた。
LAN内には常時動いている Raspberry Pi のホストがいるので、ついでにこのホストにDNS機能もやらせることにしてみた。
unbound
unbound がキャッシュサーバ専用でよさそうなのでこれにする。
sudo apt-get install unbound
#/etc/unbound/unbound.conf.d/my.conf # See /usr/share/doc/unbound/examples/unbound.conf for a commented server: verbosity: 1 num-threads: 4 interface: 0.0.0.0 interface: :: msg-cache-size: 64m msg-cache-slabs: 4 rrset-roundrobin: yes rrset-cache-size: 128m rrset-cache-slabs: 4 infra-cache-slabs: 4 access-control: 192.168.0.0/16 allow key-cache-size: 64m key-cache-slabs: 4 neg-cache-size: 64m prefetch: yes minimal-responses: yes incoming-num-tcp: 100 outgoing-num-tcp: 100 forward-zone: name: "." forward-addr: 8.8.8.8 forward-addr: 8.8.4.4
# 自動起動 sudo systemctl enable unbound # 起動 sudo systemctl start unbound # ステータス sudo systemctl status unbound # ログ sudo journalctl -r
以下のようなコマンドでクエリ数やキャッシュヒット率が見れる。
unbound-control stats_noreset | grep total
今後
キャッシュヒット率を見つつ、あんまり意味がなさそうなら (数%ぐらいしかヒットしないとか) やめるつもり。
自宅は昼間は誰もいないので、このタイミングでTTLが短いほとんどのキャッシュは無効になってしまう。unbound の prefetch は TTL が残り10%になったときにクエリがくると再問合せする機能なので、クエリがこなければ一切 prefetch はされない。
さらには一番影響がでるブラウザでは、DNS prefetch が実装されているので、体感的にはネットワークの近くにDNSがあっても意味がないことが多い。
自分で DNS キャッシュサーバを運用するコストと釣り合わないかもしれない。
(備考)raspberry pi の ip アドレスを固定
raspi の IP アドレスを固定しておく
#/etc/dhcpcd.conf interface eth0 static ip_address=192.168.0.222/24 static routers=192.168.0.1 static domain_name_servers=127.0.0.1
sudo systemctl daemon-reload sudo systemctl stop dhcpcd sudo ip addr flush dev eth0 ; sudo systemctl start dhcpcd sudo systemctl restart avahi-daemon.service
確認
dig @192.168.0.222 example.com
同一ホストで
sudo unbound-control stats_noreset | grep total sudo unbound-control dump_cache