Ubuntu Weekly Recipe

第386回 Unboundでお手軽に家庭内DNSサーバーを作ろう

この記事を読むのに必要な時間:およそ 6.5 分

社内や家庭内でローカルな名前解決をする際,(local.などのサブドメインをつけず)インターネット上に公開しているドメインと同じドメインを使いたいと思うことはないでしょうか。筆者はあります。とはいえ,インターネット上にある権威サーバーに,ローカルIPアドレスを返すレコードを登録するわけにもいきませんよね。そんな時はどうしたらよいでしょう?

ある一つのドメインの中で,ローカルな名前はローカル内だけで解決し,かつインターネット上に公開している名前は本来の権威サーバーにクエリーを投げて解決する,ということができればよさそうです。これが実現できると,グローバルIPとローカルIPを両方持つようなサーバー注1は,家庭内で名前解決をした時のみはローカルIPを返す,というようなこともできそうです。

注1)
メールサーバーなどが該当しそうですね。

キャッシュリゾルバであるUnboundにはlocal-data(およびlocal-zoneのtransparent)という機能があり,この要求を実現することができます注2)。今回はUbuntu 14.04 LTSとUnboundを用いて,ご家庭内キャッシュサーバーを構築してみましょう。

注2)
もちろんDnsmasqでも可能なのですが,ローカルホストや小規模ネットワークでの使用を前提にしたDnsmasqより,Unboundの方が細かい調整が可能なため,ある程度の規模のネットワークには向いているのではないかと判断しました。

Unboundのインストール

UnboundはUbuntu注3のリポジトリにパッケージがありますので,apt-getでインストール簡単にインストールできます。パッケージ名はunboundです。

注3)
こうやって並べて書くと,どっちがどっちかわからなくなりますよね。なりませんか,そうですか。

Unboundのインストール

$ sudo apt-get install unbound

これだけで自動的にUnboundが動作します。ローカルホストの53番ポートをunboundがLISTENしているのを確認してみましょう注4)。

注4)
8953番ポートは後述するunbound-control用に待ち受けているポートです。

ポートの状態

$ sudo ss -lntp | grep unbound
LISTEN     0      5                 127.0.0.1:8953                     *:*      users:(("unbound",17014,8))
LISTEN     0      5                 127.0.0.1:53                       *:*      users:(("unbound",17014,6))
LISTEN     0      5                       ::1:8953                    :::*      users:(("unbound",17014,7))
LISTEN     0      5                       ::1:53                      :::*      users:(("unbound",17014,4))

resolvconfとの連携

Ubuntuではresolvconfによって/etc/resolv.confが自動生成されます。そのためresolv.confを直接書き換えることはせず,使用するネームサーバーは/etc/network/interfaces内のdns-nameserversで指定する必要があるのは皆さんご存知の通りです。UbuntuのUnboundはresolvconfと連携し,Unbound(自分自身)で名前解決をするよう,サービスの起動時に/etc/resolv.confを書き換えます。また元々resolv.conf内で指定されていたnameserverを,Unboundのforwardに追加します。その仕組みを少し詳しく見てみましょう。

Unbound起動前後でのresolv.confの変化

$ sudo service unbound stop

$ cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 192.168.1.3

$ sudo service unbound start

$ cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.0.1

/etc/default/unboundを見てみてください。その中に以下の記述があります。

/etc/default/unbound

# If set, the unbound init script will provide unbound's listening
# IP addresses as nameservers to resolvconf.
RESOLVCONF=true

# If set, resolvconf nameservers will be configured as forwarders
# to be used by unbound.
RESOLVCONF_FORWARDERS=true

ここでRESOLVCONFとRESOLVCONF_FORWARDERSという2つの変数を設定しています。用途はコメントにある通りで,RESOLVCONFがtrueに設定されていると,/etc/resolv.confにUnboundが待ち受けているIPアドレスが設定されるようになります。またRESOLVCONF_FORWARDERSがtrueに設定されていると,元々dns-nameserversに指定されていたネームサーバーが,Unboundのforwardに追加されるようになります。これらはどちらもデフォルトでtrueに設定されているため,Unboundをインストールしただけで,サーバーは名前解決の際に自分自身のUnboundにクエリーを投げ,Unboundは元々設定されていたネームサーバーに再帰的にクエリーを投げる,という動作をします。つまりUbuntuデスクトップのDnsmasqと同じ挙動ですね。

resolv.confを書き換える処理は,/etc/init.d/unboundの中の

/sbin/resolvconf -a lo.unbound

が行っています。この直前の条件分岐を見るとわかりますが,interfaceには0.0.0.0もしくは127.0.0.1が指定されていること注5),もしくはinterfaceが明示的に指定されていないことを期待しています。(192.168.1.1のような)任意のIPアドレスが指定されていると,resolv.confが空になってしまうため注意してください。forwardの追加は/etc/resolvconf/update.d/unbound内で行われています。unbound-controlコマンド(後述)を利用して,forwardの追加もしくはoffを行っていることがわかります。

注5)
IPv4の場合です。

著者プロフィール

水野源(みずのはじめ)

Ubuntu Japanese Teamメンバー。理想のフリーデスクトップ環境を求めて東へ西へ……のはずが,気がついたら北の大地で就職していたインフラ寄りのエンジニア。株式会社インフィニットループ所属。

コメント

コメントの記入