Unbound
関連記事
Unbound は検証をおこなったり再帰・キャッシュをする DNS リゾルバです。Wikipedia によると
- Unboundは、いくつかのオープンソースプロジェクトにおいて、Berkeley Internet Name Domain (BIND) をデフォルトのベースシステムのネームサーバーとして置き換えており、ほとんどのアプリケーションにおいて、より小さく、よりモダンで、より安全であると認識されています。
インストール
公式リポジトリから unbound パッケージをインストールしてください。
さらに、DNSSEC 検証をするには expat パッケージが必要です。
設定
デフォルト設定は /etc/unbound/unbound.conf
に含まれています。さらに、他のオプションが使われているサンプル設定ファイルが /etc/unbound/unbound.conf.example
に存在します。以下のセクションでは様々な設定を説明します。詳しい設定は man unbound.conf
を見てください。
特に指定しない場合、以下のセクションで説明しているオプションは設定ファイルの server
セクションの下に記述してください:
/etc/unbound/unbound.conf
server: ... setting: value ...
ローカル DNS サーバー
ローカル DNS サーバーとして unbound を使いたい場合、resolv.conf でネームサーバーを ::1
と 127.0.0.1
に設定してください。
/etc/resolv.conf
nameserver ::1 nameserver 127.0.0.1 options trust-ad
ネームサーバーの設定が変更されないように設定する必要があります。
設定のテスト方法については Resolv.conf#Linux における DNS を読んでください。
resolv.conf に変更を加えた後に 127.0.0.1
が使用されていることを確認してください。
ルートヒント
アドレスがキャッシュされていないホストを問い合わせられた場合、リゾルバはサーバーツリーの一番上からルートサーバーに問い合わせて、アドレスを問い合わせることができるトップレベルドメインの場所を知る必要があります。Unbound にはデフォルトで hints が付属していますが、古くなっている可能性があるのでルートヒントファイルを使用することを推奨します。したがって、パッケージが定期的に更新されている場合、手動での介入は必要ありません。そうでない場合は、組み込みのヒントが古くなる可能性があるので、ルートヒントファイルを使用するのが良い方法です。
unbound に root.hints
ファイルを指定:
root-hints: root.hints
それからルートヒントファイルを unbound の設定ディレクトリに配置してください。以下のコマンドを実行するだけで配置できます:
# curl -o /etc/unbound/root.hints https://www.internic.net/domain/named.cache
ルートサーバーのリストを最新に保つために root.hints
は6ヶ月ごとに更新すると良いでしょう。手動で実行してもよいですし、Systemd/タイマーを使う方法もあります。タイマーを使う場合は#ルートヒント systemd タイマーを参照。
DNSSEC 検証
unbound は自動的にルートサーバーの信頼鍵アンカーファイルを /etc/trusted-key.key
から /etc/unbound/trusted-key.key
にコピーします。DNSSEC 検証を使用するには以下の文字列を追加して unbound にファイルを指定してください:
trust-anchor-file: trusted-key.key
DNS サーバーへの転送を設定した場合、上記をコメントアウトしてください。そうしないと、DNS クエリが失敗するようになります。DNS サーバーが対応している場合にのみ DNSSEC 検証が行われるようになります。
検証のテスト
DNSSEC が機能しているかどうかをテストするには、unbound.service
を起動後に次の手順を実行します。
$ unbound-host -C /etc/unbound/unbound.conf -v sigok.verteiltesysteme.net
応答は、IP アドレスの横に (secure)
という文字があるはずです。
$ unbound-host -C /etc/unbound/unbound.conf -v sigfail.verteiltesysteme.net
ここでは、(BOGUS (security failure))
を含む応答が必要です。
さらに、次のように drill を使ってリゾルバのテストをすることができます。
$ drill sigfail.verteiltesysteme.net $ drill sigok.verteiltesysteme.net
最初のコマンドの rcode
が SERVFAIL
に、2番目のコマンドの rcode
が NOERROR
になっていれば問題ありません。
クエリの転送
DNS クエリを送りたいローカルネットワークに DNS サーバーが存在しクエリを転送したい場合、以下の行を記述してください:
private-address: local_subnet/subnet_mask
例:
private-address: 10.0.0.0/24
ローカルアドレスの正引き・逆引きの両方でローカル DNS サーバーを使うには、正引きと逆引きのそれぞれで以下のような行を設定する必要があります (下の例で使用している 10.0.0.1 は DNS 機能を提供するサーバーの IP アドレスに置き換えてください):
local-zone: "10.in-addr.arpa." transparent
上記の行は逆引きを正しく動作させるために必要です。
forward-zone: name: "mynetwork.com." forward-addr: 10.0.0.1
forward-zone: name: "10.in-addr.arpa." forward-addr: 10.0.0.1
以下のようにすることでローカルホストの正引き・逆引きを設定できます:
local-zone: "localhost." static local-data: "localhost. 10800 IN NS localhost." local-data: "localhost. 10800 IN SOA localhost. nobody.invalid. 1 3600 1200 604800 10800" local-data: "localhost. 10800 IN A 127.0.0.1" local-zone: "127.in-addr.arpa." static local-data: "127.in-addr.arpa. 10800 IN NS localhost." local-data: "127.in-addr.arpa. 10800 IN SOA localhost. nobody.invalid. 2 3600 1200 604800 10800" local-data: "1.0.0.127.in-addr.arpa. 10800 IN PTR localhost."
デフォルトの正引きゾーンで、ローカルマシンやローカルネットワークの外側のサーバーを使用するには、設定ファイルに以下を追加 (例として Google と OpenDNS の DNS サーバーを指定しています):
forward-zone: name: "." forward-addr: 8.8.8.8 forward-addr: 8.8.4.4 forward-addr: 208.67.222.222 forward-addr: 208.67.220.220
上記の設定で unbound は外部ルックアップの正引きゾーンで Google と OpenDNS サーバーを使用します。
アクセス制御
IP アドレスによってクエリに応答するインターフェイスを指定できます。localhost で listen するには、以下を使用:
interface: 127.0.0.1
全てのインターフェイスで listen するには、以下を使用:
interface: 0.0.0.0
access-control
オプションを使うことでさらに細かくアクセスを設定できます:
access-control: subnet action
例:
access-control: 192.168.1.0/24 allow
action に指定できるのは deny
(メッセージを破棄), refuse
(エラー応答), allow
(再帰を許可), allow_snoop
(再帰と非再帰を許可) です。デフォルトでは、ローカルホスト以外の全てが拒否されます。
使用方法
Unbound の起動
unbound.service
を起動・有効化してください。
Unbound の遠隔操作
unbound には unbound-control
ユーティリティが付いており、リモートの unbound サーバーを管理することができます。pdnsd の pdnsd-ctl コマンドに似ています。
unbound-control の設定
使用する前に、以下の設定が必要です:
1) まず、以下のコマンドを実行してください:
# unbound-control-setup
自己署名証明書とサーバーとクライアントの秘密鍵が生成されます。これらのファイルは /etc/unbound
ディレクトリに保存されます。
2) その後、/etc/unbound/unbound.conf
を編集して以下の内容を記述してください。control-enable: yes
オプションは必須ですが、他のオプションは必要に応じて変更できます。
remote-control: # Enable remote control with unbound-control(8) here. # set up the keys and certificates with unbound-control-setup. control-enable: yes # what interfaces are listened to for remote control. # give 0.0.0.0 and ::0 to listen to all interfaces. control-interface: 127.0.0.1 # port number for remote control operations. control-port: 8953 # unbound server key file. server-key-file: "/etc/unbound/unbound_server.key" # unbound server certificate file. server-cert-file: "/etc/unbound/unbound_server.pem" # unbound-control key file. control-key-file: "/etc/unbound/unbound_control.key" # unbound-control certificate file. control-cert-file: "/etc/unbound/unbound_control.pem"
unbound-control を使う
unbound-control で使用できるコマンドの例:
- 再設定しないで統計を出力
# unbound-control stats_noreset
- キャッシュを標準出力にダンプ
# unbound-control dump_cache
- キャッシュを消去して設定をリロード
# unbound-control reload
詳しくは man 8 unbound-control
を参照してください。
ヒントとテクニック
ブロック通知
adservers ファイルを作成して以下の設定を Unbound に追加してください:
/etc/unbound/unbound.conf
... include: /etc/unbound/adservers
権威 DNS サーバーの追加
検証・再帰・キャッシュ DNS サーバーと権威 DNS サーバーを同じマシンで動作させたい場合、NSD のページを参照してください。全ての機能を提供する DNS サーバーを動作させるより、権威サーバーとキャッシュサーバーを分けることでセキュリティを向上させることができます。NSD のページには BIND から移行する際に役立つ情報を載せています。
WAN と DNS
listen しているサーバーの設定ファイルやインターフェイスを変更することで、ローカルネットワーク外のマシンからのクエリから LAN 内の特定のマシンにアクセスできるように設定できます。どこからでもアクセスできるようにするウェブサーバーやメールサーバーなどで有用です。
ルートヒント systemd タイマー
以下は #ルートヒント に書かれている方法で root.hints
を1ヶ月ごとに更新する systemd サービスとタイマーの例です:
/etc/systemd/system/roothints.service
[Unit] Description=Update root hints for unbound After=network.target [Service] ExecStart=/usr/bin/curl -o /etc/unbound/root.hints https://www.internic.net/domain/named.cache
/etc/systemd/system/roothints.timer
[Unit] Description=Run root.hints monthly [Timer] OnCalendar=monthly Persistent=true [Install] WantedBy=timers.target
roothints.timer
systemd タイマーを 起動・有効化してください。
DNS キャッシュを常に最新の状態に保つ
unbound は、キャッシュされた DNS エントリが期限切れになる前に自動的に更新され、キャッシュを常に最新の状態に保つプリフェッチをサポートしています。unbound.conf(5) のマニュアルページから引用、これをオンにすると、トラフィックとマシンの負荷が約 10% 増加しますが、需要のあるアイテムはキャッシュから期限切れになりません。これは、RTT が高いモバイルリンクで特に役立ちます。
プリフェッチを有効にするには、これを server
セクションの下に追加します:
prefetch: yes
トラブルシューティング
num-threads の問題
unbound.conf
の man ページより:
outgoing-range: <number> Number of ports to open. This number of file descriptors can be opened per thread.
一部のウェブサイトでは num-threads
は CPU コアの数に設定するように推奨しています。unbound.conf.example
サンプルファイルの記述:
# number of threads to create. 1 disables threading. # num-threads: 1
ただし num-threads
を 1
より大きな値に設定すると unbound を起動したときにログにファイル記述子の数が多すぎるという警告が吐かれます。小規模なネットワークで Unbound を使っている場合、num-threads
を 1
より大きな値に設定して性能をあげようとしても無駄です。設定したい場合は 公式ドキュメント を参照してください。
outgoing-range
はできるだけ大きな値に設定してください。上記で参照しているウェブページのセクションには 1024
の制限を越える方法が書かれています。複数のクライアントを同時にさばくことが可能です。シングルコアなら 950
を、デュアルコアなら 450
を、クアッドコアなら 200
を試して下さい。num-queries-per-thread
は outgoing-range
の数字の半分に設定するのが最適です。
outgoing-range
の制限により num-queries-per-thread
も制限されるため、 outgoing-range
に {1024
制限がないように、 libevent でコンパイルすることをお薦めします。負荷の高い DNS サーバ用にこの方法でコンパイルする必要がある場合は、 unbound パッケージを使用する代わりに、ソースからプログラムをコンパイルする必要があります。