Unbound、知ってる? この先10年を見据えたDNS

第2回Unboundの導入(新規導入編)

前回はUnboundの特徴を紹介しました。今回はUnboundの新規導入方法について紹介します。

インストール

UnboundではldnsというDNSライブラリを利用しています。Unboundの配布パッケージにも含まれています。しかし、ldnsを共有ライブラリとしてリンクし、さらにldnsを利用するdrillというツールの導入も行うために、別途インストールすることにします。

なお、本記事ではLinuxディストリビューションの1つであるCentOS 5.2での導入手順を紹介します。パッケージシステム用のRPMのSPECファイルも用意されていますが、今回は手動でビルドしてインストールを行ってみます。そのため、/usr/localディレクトリ以下にインストールすることにします。

ldnsのインストール

ldnsはNLnet Labsが開発しているDNSライブラリです。次のような機能もサポートしています。

  • IPv4/IPv6
  • TSIG
  • DNSSECの署名と検証

ldnsはNLnet Labsのサイトからダウンロードできます。

執筆時点での最新バージョンは1.3.0であり、ファイル名はldns-1.3.0.tar.gzです。Unboundでは1.3.0以降が必要です。ldnsをビルドするためにはOpenSSLとlibpcapのヘッダやライブラリが必要なので、あらかじめインストールしておいてください。

ldnsのtarballをダウンロードしたら、次のようにしてインストールします。

$ tar xvzf ldns-1.3.0.tar.gz
$ cd ldns-1.3.0/
$ ./configure --prefix=/usr/local
$ make
$ su
# make install

共有ライブラリlibldns.soが/usr/local/libにインストールされたので、/etc/ld.so.confにディレクトリ/usr/local/libが登録されていなければ、追加してください。

ldconfigコマンドを実行してライブラリキャッシュを更新します。

# /sbin/ldconfig

drillのインストール

ldnsのパッケージにはdrillというツールが含まれています。このdrillもインストールします。drillは、BINDにおけるdigと同じような機能を提供します。⁠If you need to dig deeper⁠「もっと深く掘りたければ(ドリルを使え⁠⁠」という謳い文句が示すとおり、DNSSECをサポートし、digより多くの情報を得ることができます。digはBINDのライブラリに依存しているため、BINDのライブラリを使用していないdrillを使うことで、BINDから解放されます。

ldnsのtarballを展開したディレクトリにおいて次のようにしてインストールを行います。

$ cd drill/
$ autoreconf
$ ./configure --prefix=/usr/local --with-ldns=/usr/local
$ make
$ su
# make install

なお、ldnsのパッケージを展開したディレクトリにはexamplesというディレクトリがあります。ldnsを利用したサンプルプログラムが含まれています。drillと同じような手順でインストールできるため、興味があったらインストールしてみてください。

Unboundのインストール

Unboundは、Unboundの公式サイトからダウンロードできます。

執筆時点での最新バージョンは1.0.2であり、ファイル名はunbound-1.0.2.tar.gzです。

Unboundのtarballをダウンロードしたら、次のようにしてインストールを行います。デフォルトでは設定ファイルunbound.confがあるディレクトリにchrootするため、ここではディレクトリ/var/unboundに設定ファイルを置くことにします。

$ tar xvzf unbound-1.0.2.tar.gz
$ cd unbound-1.0.2/
$ ./configure \
    --prefix=/usr/local \
    --with-conf-file=/var/unbound/unbound.conf \
    --with-ldns=/usr/local
$ make
$ su
# make install

共有ライブラリlibunbound.soが追加されたため、共有ライブラリのキャッシュの更新を行ってください。

# /sbin/ldconfig

起動スクリプトのサンプルファイルがcontribディレクトリにあるので、それを/etc/init.dにコピーして登録します。unboundの絶対パスの調整も行ってください。

# cp contrib/unbound.init /etc/init.d/unbound
# sed -i 's_/usr/sbin/unbound_/usr/local/sbin/unbound_' /etc/init.d/unbound
# chmod 755 /etc/init.d/unbound
# /sbin/chkconfig --add unbound
# /sbin/chkconfig unbound on

設定ファイルを/var/unbound/unbound.confに配置したので、使いやすくするために/etc/にシンボリックリンクを作成すると良いでしょう。

# ln -s /var/unbound/unbound.conf /etc/

unboundを実行するユーザunboundとグループunboundを作成し、chrootするディレクトリを所有させます。

# /usr/sbin/groupadd -r unbound
# /usr/sbin/useradd -r -g unbound -d /var/unbound -s /sbin/nologin unbound
# chown unbound:unbound /var/unbound

chrootするディレクトリ/var/unboundに/etc/localtime、/etc/resolv.confをコピーし、さらにログソケット/dev/logと乱数デバイス/dev/randomを作成する必要があります。先ほどの起動スクリプトを使用する場合には、この処理が含まれています。

必要なファイルを作成したらchrootのディレクトリは次のようになるでしょう。

# find /var/unbound -print
/var/unbound
/var/unbound/unbound.conf
/var/unbound/etc
/var/unbound/etc/resolv.conf
/var/unbound/etc/localtime
/var/unbound/dev
/var/unbound/dev/random
/var/unbound/dev/log

以上でインストールは完了しました。

動作確認

Unboundはデフォルトの設定のままで利用できますが、IPv6での通信ができない場合には設定ファイルunbound.confに次のように「do-ip6: no」を加えてください。

server:
    do-ip6: no

それではunboundを起動させてみましょう。

# /etc/init.d/unbound start

drillを使って動作確認をしてみます。drillの使い方はdigとほとんど同じです。

次の例ではgihyo.jpを正引きしてみました。Aレコードが正しく取得できれば成功です。

$ drill gihyo.jp. @127.0.0.1 A
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 19777
;; flags: qr rd ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0
;; QUESTION SECTION:
;; gihyo.jp.    IN      A

;; ANSWER SECTION:
gihyo.jp.       86400   IN      A       219.101.198.19

;; AUTHORITY SECTION:
gihyo.jp.       86400   IN      NS      ns2.iprevolution.co.jp.
gihyo.jp.       86400   IN      NS      mail0.gihyo.co.jp.

;; ADDITIONAL SECTION:

;; Query time: 507 msec
;; SERVER: 127.0.0.1
;; WHEN: Fri Oct 31 18:32:59 2008
;; MSG SIZE  rcvd: 102

問題がなければ、リゾルバの設定ファイル/etc/resolv.confを次のように書き換えてください。

nameserver 127.0.0.1

設定例

ここではいくつかの設定例を紹介します。

ホスト自身のリゾルバとして使う場合

ホスト自身のDNSキャッシュサーバとして使う場合には、先ほどの動作確認で行った設定のままで利用できます。

LAN内の他のホストのリゾルバとして使う場合

LAN内の他のホストからの再帰問い合わせを受け付けるDNSキャッシュサーバとして使用する場合には、設定ファイルにバインドするインターフェースの設定「interface」とアクセス許可の設定「access-control」を追加する必要があります。access-controlには「deny」⁠応答しない⁠⁠、⁠refuse」⁠エラーを返す⁠⁠、⁠allow」⁠許可する)の制御が出来ます。

interfaceとaccess-controlにはデフォルトで次のような設定が暗黙で設定されています。つまり、localhostからのみアクセスを許可しているということです。

    interface: 127.0.0.1
    interface: ::1
    access-control: 0.0.0.0/0 refuse
    access-control: 127.0.0.0/8 allow
    access-control: ::0/0 refuse
    access-control: ::1 allow
    access-control: ::ffff:127.0.0.1 allow

このことをふまえた上で設定を追加してください。設定例は次の通りです。

    interface: 0.0.0.0
    interface: ::0
    access-control: 192.168.0.0/24 allow
    access-control: 2001:DB8::/64 allow

設定が終わったら、unboundを再起動します。

他のホストから、このホストを指定してドメイン名の検索などを行ってみてください。なお、パケットフィルタリングの設定でTCPとUDPの53番ポートを開けるのを忘れないでください。

LAN内のホストの名前の解決をする場合

ちょっとしたLAN内のホストの名前の解決のために、DNSコンテンツサーバを別途立ち上げるのもどうかなと思うときには、Unboundを簡易的なDNSコンテンツサーバとして利用することもできます。

ローカルデータ「local-data」を設定することで、この機能を利用することができます。設定方法は「local-data」の値として次のようにリソースレコードを記述するだけです。リソースレコードの書き方はBINDのゾーンデータの書き方と同じです。TTLとCLASSは省略可能です。

    local-data: "hogohoge.example.org.     A   192.168.0.1"
    local-data: 'hogohoge.example.org.     TXT "text record"'
    local-data: "1.0.168.192.in-addr.arpa. PTR hogohoge.example.org."

設定が終わったらunboundを再起動して、drillで確認してください。

まとめ

今回はUnboundを新規導入する方法を紹介しました。DNSキャッシュサーバとして動かすだけであればデフォルトの設定で簡単に動きます。簡易的なDNSコンテンツサーバとしても利用することができます。

設定や運用のTIPSなどについては次回以降にて紹介します。

おすすめ記事

記事・ニュース一覧