Unbound

提供: ArchWiki
2022年5月11日 (水) 14:54時点における向日アオイ (トーク | 投稿記録)による版 (Ubound > 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 でネームサーバーを ::1127.0.0.1 に設定してください。

/etc/resolv.conf
nameserver ::1
nameserver 127.0.0.1
options trust-ad

ネームサーバーの設定が変更されないように設定する必要があります。

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

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

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

ルートヒント

アドレスがキャッシュされていないホストを問い合わせられた場合、リゾルバはサーバーツリーの一番上からルートサーバーに問い合わせて、アドレスを問い合わせることができるトップレベルドメインの場所を知る必要があります。Unbound にはデフォルトで hints が付属していますが、古くなっている可能性があるのでルートヒントファイルを使用することを推奨します。したがって、パッケージが定期的に更新されている場合、手動での介入は必要ありません。そうでない場合は、組み込みのヒントが古くなる可能性があるので、ルートヒントファイルを使用するのが良い方法です。

unboundroot.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 のチェックを有効にすると最初のルックアップ時の DNS 問い合わせ時間が長くなります。アドレスがローカルにキャッシュされたら、瞬時に解決されます。

検証のテスト

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

最初のコマンドの 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
ノート: フォワードゾーンとスタブゾーンには違いがあります。スタブゾーンは、権限のある DNS サーバーに直接接続されている場合にのみ機能します。これは、信頼できる DNS を提供している BIND DNS サーバーからの検索では機能しますが、内部検索が別の DNS サーバーに転送される非結合サーバーへのクエリを参照している場合、ここで参照をマシンのスタブゾーンとして定義しても機能しません。この場合、フォワードゾーンを上記のように定義する必要があります。フォワードゾーンは他の DNS サーバに向けてデイジーチェーン検索を行うことができるからです。つまり、フォワードゾーンは再帰的に DNS サーバへの問い合わせを参照することができます。スタブゾーンを不適切に使用すると、問題を示すエラーメッセージが表示されないため、この区別は重要です。

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

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 検証を有効にする場合は上記の設定は使わないでください。

アクセス制御

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 サーバーを管理することができます。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
ノート: これらのホストでいくつかの OK ステータスを返すために、あなたがコントロールするサーバへの 127.0.0.1 リダイレクションを変更して、そのサーバに空の 204 応答させることができます。 このページ を参照してください。

権威 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 の数字の半分に設定するのが最適です。

outgoing-range の制限により num-queries-per-thread も制限されるため、 outgoing-range に {1024 制限がないように、 libevent でコンパイルすることをお薦めします。負荷の高い DNS サーバ用にこの方法でコンパイルする必要がある場合は、 unbound パッケージを使用する代わりに、ソースからプログラムをコンパイルする必要があります。

参照