BINDの排除とUnbound/LDNSの導入

FreeBSD 10からはベースシステムからBINDが取り除かれる点に注意が必要。BINDはよくセキュリティ脆弱性が発見されるソフトウェアのひとつだが、BINDのリリースエンジニアリングとFreeBSDの相性の問題で今回ベースシステムからは外れることになった。置き換えというわけにはいかないが、これを補うことになるソフトウェアとしてUnboundとLDNSの一部がベースシステムにマージされている。

% ls /etc/rc.d/ | grep named
% ls /etc/rc.d/ | grep unbound
local_unbound
% grep unbound /etc/defaults/rc.conf
local_unbound_enable="NO"       # local caching resolver
%
BINDはベースシステムから削除されている。ローカルキャッシュリゾルバの機能を担当するソフトウェアとしてUnboundがマージされた

dig(1)はBINDに含まれていたツールであるため、dig(1)もベースシステムから削除されている。同じくBIND由来のhost(1)やnslookup(1)もベースシステムから取り除かれている。この代替としてはLDNSベースのdrill(1)とhost(1)が追加されている。

% whereis dig
dig:
% whereis host
host: /usr/bin/host /usr/share/man/en.UTF-8/man1/host.1.gz /usr/src/usr.bin/host
% whereis drill
drill: /usr/bin/drill /usr/share/man/en.UTF-8/man1/drill.1.gz /usr/src/usr.bin/drill
%
BINDをベースシステムから削除したことで、BINDに含まれていたdig(1)も削除。これの代替としてはLDNSのhost(1)およびdrill(1)がベースシステムにマージされた

host(1)はDNSルックアップを実施するための簡易ユーティリティ。ちょっとした名前引きなどに利用される。

% host news.mynavi.jp
news.mynavi.jp has address 210.154.149.96
%
host(1)コマンド実行例

drill(1)はdig(1)をより強力にしたようなツールで、DNSおよびDNSSECのすべての情報にアクセスできる設計になっている。FreeBSD 10以降は基本的にはdrill(1)を使えばよい。

% drill news.mynavi.jp
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 4892
;; flags: qr rd ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 5, ADDITIONAL: 4
;; QUESTION SECTION:
;; news.mynavi.jp.      IN      A

;; ANSWER SECTION:
news.mynavi.jp. 3504    IN      A       210.154.149.96

;; AUTHORITY SECTION:
mynavi.jp.      2568    IN      NS      ns1.mynavi.jp.
mynavi.jp.      2568    IN      NS      angels.sprite.ad.jp.
mynavi.jp.      2568    IN      NS      ns2.mynavi.jp.
mynavi.jp.      2568    IN      NS      ns-kg022.ocn.ad.jp.
mynavi.jp.      2568    IN      NS      ns3.mynavi.jp.

;; ADDITIONAL SECTION:
ns1.mynavi.jp.  927     IN      A       210.154.149.8
ns2.mynavi.jp.  927     IN      A       210.154.149.9
ns3.mynavi.jp.  503     IN      A       210.190.113.64
angels.sprite.ad.jp.    83727   IN      A       202.227.128.129

;; Query time: 8 msec
;; SERVER: 192.168.1.1
;; WHEN: Mon Dec 23 14:00:02 2013
;; MSG SIZE  rcvd: 224
%
drill(1)コマンド実行例

こうした新しいコマンドではなく従来のコマンドを使いたいという場合にはbind-tools(dns/bind-tools)をインストールするという方法がある。bind-tools(dns/bind-tools)をインストールするとBINDベースのdig(1)、host(1)、nslookup(1)が利用できるようになる。

% cd /usr/ports/dns/bind-tools/
% cat pkg-plist
bin/dig
bin/host
bin/nslookup
%
dig(1)が使いたい場合はbind-tools(dns/bind-tools)をインストールするという方法もある

Unboundはローカルキャッシュリゾルバとして導入されている。たとえば/etc/rc.confに次の設定を追加することで利用できるようになる。

local_unbound_enable="YES"
ローカルキャッシュリゾルバ機能を有効にするために/etc/rc.confファイルに追加する設定

次のようにUnboundを起動すると、一番最初の起動時には現在のシステムの設定から新しくUnboundの設定ファイルを生成するとともに、/etc/resolv.confファイルをunbound(8)を利用するように書き換えが行われる。ネームサーバとして127.0.0.1が指定されるようになっていればunbound(8)を利用するようになる。

% service local_unbound start
Performing initial setup.
Extracting forwarders from /etc/resolv.conf.
/var/unbound/forward.conf created
/var/unbound/unbound.conf created
/etc/resolvconf.conf created
original /etc/resolv.conf saved as /etc/resolv.conf.20131223.141713
Starting local_unbound.
% 
unbound(8)を起動

% cat /etc/resolv.conf
# Generated by resolvconf
search ongs.co.jp
# nameserver 192.168.1.1
nameserver 127.0.0.1
options edns0
%
/etc/resolv.confファイルはunbound(8)によって自動的に更新される

% cat /var/unbound/forward.conf
# Generated by local-unbound-setup
forward-zone:
        name: .
        forward-addr: 192.168.1.1
% cat /var/unbound/unbound.conf
# Generated by local-unbound-setup
server:
        username: unbound
        directory: /var/unbound
        chroot: /var/unbound
        pidfile: /var/run/local_unbound.pid
        auto-trust-anchor-file: /var/unbound/root.key

include: /var/unbound/forward.conf
% cat /etc/resolvconf.conf
# Generated by local-unbound-setup
resolv_conf="/dev/null" # prevent updating /etc/resolv.conf
unbound_conf="/var/unbound/forward.conf"
unbound_pid="/var/run/local_unbound.pid"
unbound_service="local_unbound"
unbound_restart="service local_unbound reload"
%
ほかの設定ファイルも起動時に自動生成される

実際に名前解決を測ってみるとその効果がよくわかる。たとえば次の例では、ローカルキャッシュ効果が出る前の段階ではクエリに394ミリ秒かかっている。

% drill www.freebsd.org
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 27410
;; flags: qr rd ra ; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;; www.freebsd.org.     IN      A

;; ANSWER SECTION:
www.freebsd.org.        429     IN      CNAME   wfe0.ysv.freebsd.org.
wfe0.ysv.freebsd.org.   1921    IN      A       8.8.178.110

;; AUTHORITY SECTION:

;; ADDITIONAL SECTION:

;; Query time: 394 msec                 ← 394ミリ秒かかっている
;; SERVER: 127.0.0.1
;; WHEN: Fri Dec 27 16:37:30 2013
;; MSG SIZE  rcvd: 72
% 
ローカルキャッシュに入る前:394ミリ秒

しかし、1度実行した後は、実行時間が1ミリ秒へ短縮していることがわかる。

% drill www.freebsd.org
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 12650
;; flags: qr rd ra ; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;; www.freebsd.org.     IN      A

;; ANSWER SECTION:
www.freebsd.org.        424     IN      CNAME   wfe0.ysv.freebsd.org.
wfe0.ysv.freebsd.org.   1916    IN      A       8.8.178.110

;; AUTHORITY SECTION:

;; ADDITIONAL SECTION:

;; Query time: 1 msec           ← 394ミリ秒から1ミリ秒へ短縮している
;; SERVER: 127.0.0.1
;; WHEN: Fri Dec 27 16:37:35 2013
;; MSG SIZE  rcvd: 72
% 
ローカルキャッシュに入った後:1ミリ秒

Unboundでは正引きや逆引きの設定を簡単に設定することができ(/var/unbound/unbound.conf)、/etc/hostsの替わりに利用することもできる。