Unbound

提供: ArchWiki
移動先: 案内検索

Unbound は検証をおこなったり再帰・キャッシュをする DNS リゾルバです。

インストール

公式リポジトリから unbound パッケージをインストールしてください。

さらに、DNSSEC 検証をするには expat パッケージが必要です。

設定

デフォルト設定は /etc/unbound/unbound.conf に含まれています。さらに、他のオプションが使われているサンプル設定ファイルが /etc/unbound/unbound.conf.example に存在します。以下のセクションでは様々な設定を説明します。詳しい設定は man unbound.conf を見てください。

特に指定しない場合、以下のセクションで説明しているオプションは設定ファイルの server セクションの下に記述してください:

/etc/unbound/unbound.conf
server:
  ...
  setting: value
  ...

アクセス制御

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 にはデフォルトで hints が付属していますが、古くなっている可能性があるのでルートヒントファイルを使用することを推奨します。

unboundroot.hints ファイルを指定:

root-hints: "/etc/unbound/root.hints"

それからルートヒントファイルを unbound の設定ディレクトリに配置してください。以下のコマンドを実行するだけで配置できます:

# curl -o /etc/unbound/root.hints https://www.internic.net/domain/named.cache

ルートサーバーのリストを最新に保つために root.hints は6ヶ月ごとに更新すると良いでしょう。手動で実行してもよいですし、Systemd/タイマーを使う方法もあります。タイマーを使う場合は#ルートヒント systemd タイマーを参照。

ローカル DNS サーバー

ローカル DNS サーバーとして unbound を使いたい場合、resolv.conf でネームサーバーを 127.0.0.1 に設定してください。ネームサーバーの設定が変更されないように設定する必要があります。

ヒント: openresolv パッケージをインストールして /etc/resolvconf.confname_servers=127.0.0.1 行をアンコメントして resolvconf -u を実行することで /etc/resolv.conf を生成できます。

設定のテスト方法については Resolv.conf#Linux における DNS を読んでください。

resolv.conf に変更を加えた後に 127.0.0.1 が使用されていることを確認してください。

DNSSEC 検証

unbound は自動的にルートサーバーの信頼鍵アンカーファイルを /etc/trusted-key.key から /etc/unbound/trusted-key.key にコピーします。DNSSEC 検証を使用するには以下の文字列を追加して unbound にファイルを指定してください:

trust-anchor-file: trusted-key.key

DNS サーバーへの転送を設定した場合、上記をコメントアウトしてください。そうしないと、DNS クエリが失敗するようになります。DNS サーバーが対応している場合にのみ DNSSEC 検証が行われるようになります。

ノート: DNSSEC のチェックを有効にすると最初のルックアップ時の DNS 問い合わせ時間が長くなります。アドレスがローカルにキャッシュされたら、瞬時に解決されます。

DNSSEC が機能しているか確認するには drill を使用:

$ drill sigfail.verteiltesysteme.net
$ drill sigok.verteiltesysteme.net

最初のコマンドの rcodeSERVFAIL に、2番目のコマンドの rcodeNOERROR になっていれば問題ありません。

クエリの転送

ヒント: 転送を設定することで Unbound から DNSCrypt を使うことができます。DNSCrypt#Unbound を参照。

DNS クエリを送りたいローカルネットワークに DNS サーバーが存在しクエリを転送したい場合、以下の行を記述してください:

private-address: local_subnet/subnet_mask

例:

private-address: 10.0.0.0/24
ノート: プライベートアドレスを使うことで DNS Rebind 攻撃から身を守ることができます。RFC1918 ネットワーク (10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 169.254.0.0/16 fd00::/8 fe80::/10) を有効にすることができます。Unbound はデフォルトでは機能を有効にしません。

ローカルアドレスの正引き・逆引きの両方でローカル 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
ノート: There is a difference between forward zones and stub zones - stub zones will only work when connected to an authoritative DNS server directly. This would work for lookups from a BIND DNS server if it is providing authoritative DNS - but if you are referring queries to an unbound server in which internal lookups are forwarded on to another DNS server, then defining the referral as a stub zone in the machine here will not work. In that case it is necessary to define a forward zone as above, since forward zones can have daisy chain lookups onward to other DNS servers. i.e. forward zones can refer queries to recursive DNS servers. This distinction is important as you do not get any error messages indicating what the problem is if you use a stub zone inappropriately.

以下のようにすることでローカルホストの正引き・逆引きを設定できます:

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 サーバーを使用します。

ノート: OpenDNS はレスポンスから DNSSEC レコードを省略するため、DNSSEC 検証を有効にする場合は上記の設定は使わないでください。

使用方法

Unbound の起動

unbound.service起動有効化してください。

Unbound の遠隔操作

unbound には unbound-control ユーティリティが付いており、リモートの unbound サーバーを管理することができます。pdnsdpdnsd-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
ノート: In order to return some OK statuses on those hosts, you can change the 127.0.0.1 redirection to a server you control and have that server respond with empty 204 replies, see this page

権威 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 タイマーを起動有効化してください。

トラブルシューティング

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-threads1 より大きな値に設定すると unbound を起動したときにログにファイル記述子の数が多すぎるという警告が吐かれます。小規模なネットワークで Unbound を使っている場合、num-threads1 より大きな値に設定して性能をあげようとしても無駄です。設定したい場合は 公式ドキュメント を参照してください。

outgoing-range はできるだけ大きな値に設定してください。上記で参照しているウェブページのセクションには 1024 の制限を越える方法が書かれています。複数のクライアントを同時にさばくことが可能です。シングルコアなら 950 を、デュアルコアなら 450 を、クアッドコアなら 200 を試して下さい。num-queries-per-threadoutgoing-range の数字の半分に設定するのが最適です。

Because of the limit on outgoing-range thus also limits num-queries-per-thread, it is better to compile with libevent, so that there is no 1024 limit on outgoing-range. If you need to compile this way for a heavy duty DNS server then you will need to compile the programme from source instead of using the unbound package.

参照