DNSキャッシュサーバDnsmasqのUnboud連携・冗長化のすすめ(自宅用)

2019年4月17日

インターネットドメイン

自宅ではプロバイダ提供のDNSサーバを利用している方が多いと思いますが、最近はプロバイダ提供のDNSがらみのトラブルも多いと感じます。

DNS絡みのトラブルに巻き込まれないために、またDNSの名前解決の速度を上げてパフォーマンスをアップするために、自宅でDNSキャッシュサーバを立てることをおすすめします。

構成

概要

私の自宅のホストでは以下のような構成でDNSキャッシュサーバを運用しています。

外部への通信経路は大きくipv4とipv6で冗長化されており、フォワード先はGoogle Public DNS2系統、Cloudflare2系統、localhostで動作しているDNSリゾルバUnboundと計5系統としています。

※現在はforward1, 4, 6, 7, 9のみ有効化しています

Dnsmasq
 -> forward1: Google Public DNS1(ipv4)
 -> forward2: Google Public DNS1(ipv6)
 -> forward3: Google Public DNS2(ipv4)
 -> forward4: Google Public DNS2(ipv6)
 -> forward5: Cloudflare Public DNS1(ipv4)
 -> forward6: Cloudflare Public DNS1(ipv6)
 -> forward7: Cloudflare Public DNS2(ipv4)
 -> forward8: Cloudflare Public DNS2(ipv6)
 -> forward9: Unbound(localhost)

※Public DNSのアドレスは以下の表のとおり

DNS1DNS2
Google ipv48.8.8.88.8.4.4
Google ipv62001:4860:4860::88882001:4860:4860::8844
Cloudflare ipv41.1.1.11.0.0.1
Cloudflare ipv62606:4700:4700::11112606:4700:4700::1001

Dnsmasq

Dnsmasqは動作がとても軽くてシンプルな設定で使えるDHCPサーバ機能なども有したDNSキャッシュサーバです。

よく開発現場でFake DNSとして利用されることも多いと思います。

DNSフォワーダーとして機能し一度問い合わせた結果は一定期間キャッシュされます。

キャッシュサイズやキャッシュ時間の上限は設定で変更可能です。

ローカルゾーンの名前解決もDnsmasqで行っています。

フォワード先は主に/etc/resolv.dnsmasqファイルに記述していますが、Unboundはポート53が使えない(dnsmasqが使用している)ので、設定ファイルにポート番号指定付きで直接記述しています。

※resolv.dnsmasqへはポート番号指定の記述ができない

all-servers設定はフォワード先に並列で問い合わせをして、一番早く帰って来た結果を使用するというものですが、DNSの問い合わせが激しい環境での使用はおすすめしません。

フォワード関連の設定例
resolv-file=/etc/resolv.dnsmasq
all-servers
server=::1#8053
resolv.dnsmasqの設定例
nameserver 8.8.8.8
#nameserver 2001:4860:4860::8888
#nameserver 8.8.4.4
nameserver 2001:4860:4860::8844
#nameserver 1.1.1.1
nameserver 2606:4700:4700::1111
nameserver 1.0.0.1
#nameserver 2606:4700:4700::1001

ホストのリゾルバ設定はもちろんdnsmasqを見るように変更しています。

resolv.confの設定例
#nameserver 127.0.0.1
nameserver ::1

もちろんdnsmasqが受け付けるクエリはLAN内のみに制限しています。

Unbound

Unboundは設定が簡単で自宅ホストでも使用できるDNSリゾルバ、DNSSEC検証機能を持ったDNSキャッシュサーバです。

Dnsmasqのフォワード先が全て死んでいた場合、最終的に問い合わせをUnboundで解決する構成にしています。

※もちろんUnbound単体でも使用できます

キャッシュサイズやキャッシュ時間の下限や上限、送信元ポート範囲なども簡単に設定できます。

ポート番号は8053に変更して、もちろんクエリの受付はLAN内のみに制限しています。

ホストのコア数によってスレッド関連の設定を調整するとパフォーマンスが向上します。

スレッド関連の設定例
num-threads: 2
#注:自宅ホストは貧弱で小規模なのでデフォルトより値を下げています
num-queries-per-thread: 256
#上記とセットで2倍の値を設定
outgoing-range: 512
so-reuseport: yes

so-reuseportの設定はKernel3.9から使えるSO_REUSEPORTというソケットオプションを制御するもので、単一ポートに複数のリスナーをbindできるようにして負荷分散を効率よくできるようにするものです。

まとめ

サイトへの接続ができなくなり、サーバが落ちたかな?、または経路障害が起きたかな?、と原因を調べたらDNS障害だったということがたまにあります。

一般の人には見わけがつかず騒ぐだけですが、自宅のDNS環境を冗長化しておけば影響が少なくて済みます。

現代の日常生活ではネットサービスが必須となってきていますので、保険をかける意味で対策できることはしておくのがよいと思います。

私のとっている対策よりももっと良い方法があるかもしれませんが、この記事を読んでくれている皆様の参考になれば幸いです。