BIND
Berkeley Internet Name Domain (BIND) はドメインネームシステム (DNS) プロトコルのリファレンス実装です。
目次
インストール
以下の手順は BIND をインストールしてローカルキャッシュサーバーとして設定する方法です。
公式リポジトリにある bind パッケージをインストールしてください。
必要に応じて /etc/named.conf
を編集してローカルホストからしか接続を受け付けないように、以下のようなセクションを追加してください:
listen-on { 127.0.0.1; };
設定した DNS サーバーを使うために /etc/resolv.conf
を編集します:
nameserver 127.0.0.1
named デーモンを起動します。
設定
BIND は /etc/named.conf
で設定されます。使用可能なオプションについては、named.conf(5) を参照してください。
Reload して named.service
ユニットに構成変更を適用します。
localhost へのアクセスを制限する
デフォルトでは、BIND はすべてのインタフェースと IP アドレスのポート53で待機します。localhost からの接続のみを許可するには、/etc/named.conf
の options セクションに次の行を追加します。
listen-on { 127.0.0.1; };
DNS 転送を設定する
BIND が DNS クエリを別の DNS サーバーに転送するには、forwarders を options セクションに追加します。
BIND を Google DNS サーバに転送する例:
forwarders {8.8.8.8;8.8.4.4;};
TLS または HTTPS で DNS を提供する
BIND 9.18で DNS over TLS または HTTPS のサービスを有効にするには、証明書を指定して tls ブロックを定義し、DNS over TLS および HTTPS リスナー (標準 DNS リスナーと同様) を有効にする listen-on を追加してください。
/etc/named.conf
tls mycert { cert-file "<path>.crt"; key-file "<path>.key"; }; options { // Standard port 53 listeners need to be re-added explicitly listen-on { any; }; listen-on-v6 { any; }; // Add a DNS over TLS listener on standard port 853 listen-on tls mycert { any; }; listen-on-v6 tls mycert { any; }; // Add a DNS over HTTPS listener on custom port listen-on port 9443 tls mycert http default { any; }; listen-on-v6 port 9443 tls mycert http default { any; }; // If needed, add a cleartext HTTP listener for a reverse proxy //listen-on port 8443 tls none http default { 127.0.0.1; }; //listen-on-v6 port 8443 tls none http default { ::1; }; }; ...
tls{}
はトップレベルで定義されており、options{}
ブロック内では定義されていないことに注意してください。
デーモンを実行するための設定テンプレート
これは BIND でシンプルなホームネットワーク DNS サーバーを作成するための手順です。この例では "domain.tld" というドメインを使用しています。
もっと詳しい説明が欲しい方は Two-in-one DNS server with BIND9 を参照してください。Linux Home Server HOWTO - Domain name system (BIND) にはすぐに内部ネットワークの名前解決をセットアップする方法が載っています。
1. zone ファイルを作成する
# nano /var/named/domain.tld.zone
$TTL 7200 ; domain.tld @ IN SOA ns01.domain.tld. postmaster.domain.tld. ( 2007011601 ; Serial 28800 ; Refresh 1800 ; Retry 604800 ; Expire - 1 week 86400 ) ; Minimum IN NS ns01 IN NS ns02 ns01 IN A 0.0.0.0 ns02 IN A 0.0.0.0 localhost IN A 127.0.0.1 @ IN MX 10 mail imap IN CNAME mail smtp IN CNAME mail @ IN A 0.0.0.0 www IN A 0.0.0.0 mail IN A 0.0.0.0 @ IN TXT "v=spf1 mx"
$TTL (Time to Live) は全てのレコードのデフォルトのパケットの有効期間を秒単位で定義します。この例では7200秒 (2時間) となっています。
Serial は zone レコードを変更し named デーモンを再起動するたびに手動で増やしてください。忘れるとスレーブサーバーに zone 情報が転送されません。スレーブサーバーへの zone 転送は最後に転送された時間から値が増えていなければ転送されません。
2. マスターサーバーを設定する
/etc/named.conf
に zone を追加してください:
zone "domain.tld" IN { type master; file "domain.tld.zone"; allow-update { none; }; notify no; };
完了したらデーモンを再起動してください。
再帰を許可
自分の DNS サーバを動かしているなら、すべての DNS 検索に使うか、RFC:7706 に従って自分で ルートゾーンをローカルで提供した方がよいでしょう。 前者には、 再帰 ルックアップを実行する機能が必要です。DNS Amplification Attacks を防ぐために、ほとんどのリゾルバで再帰はデフォルトでオフになっています。デフォルトの Arch /etc/named.conf
ファイルでは、ループバックインターフェイスでのみ再帰が許可されます。
allow-recursion { 127.0.0.1; };
ローカルネットワークにネームサービスを提供する場合;たとえば、192.168.0.0/24 の場合、適切なIPアドレスの範囲を /etc/named.conf
に追加する必要があります。
allow-recursion { 192.168.0.0/24; fd01:2345:6789::/64; 127.0.0.1; ::1; };
DNSSEC 署名ゾーンを処理するための BIND の設定
DNSSEC 検証はデフォルトで有効になっています。"edns" が無効になっていないことを必ず確認してください。
マスター DNS サーバ:
- KSK キーと ZSK キーを生成する
$ dnssec-keygen -a NSEC3RSASHA1 -b 2048 -n ZONE example.com $ dnssec-keygen -f KSK -a NSEC3RSASHA1 -b 4096 -n ZONE example.com
- ゾーン構成を変更します。
zone "example.com" { type master; allow-transfer { ... }; auto-dnssec maintain; inline-signing yes; key-directory "master/"; file "master/example.com.zone"; };
これで BIND が自動的にゾーンに署名します。(この例では、必要なすべてのファイルが /var/named/master/
にあることを前提としています)
次に、レジスター Web サイトを使用して、DS レコード (dsset-example.com
から。) ファイルを親ゾーン所有者に渡す必要があります。親ゾーンを KSK で接続します。
KSK (および対応する DS レコード) は、手動による介入が必要なため、変更しないでください。ZSK は、署名チェックを高速化するために通常はこのキーが短いため、頻繁に変更できます。
以下を使用して、古い ZSK キーの有効期限をスケジュールし、新しい有効期限を生成できます。
$ dnssec-settime -I +172800 -D +345600 Kexample.com.+000+111111.key $ dnssec-keygen -S Kexample.com.+000+111111.key -i 152800
Bind は適切なタイミングで自動的に新しい ZSK キーを使用します。
OpenDNSSEC のような、完全に自動化された鍵のロールオーバーが可能な外部メカニズムもあります。
新しいインターフェイスに自動で接続
デフォルトで bind は新しいインターフェイスをスキャンし、数時間たったらインターフェイスを切断します。以下を追加することでこの値を調整できます:
interface-interval <rescan-timeout-in-minutes>;
named.conf
の options セクションにパラメータを追加してください。最大値は28日間 (40320分) です。値を0に設定することで機能を無効にすることもできます。
設定を変更したらサービスを再起動して下さい。
chroot 環境で実行する
chroot で実行することは必須ではありませんが、セキュリティが向上します。
監獄の作成
chroot を使うには、まず監獄を維持するための場所を作成する必要があります。ここでは /srv/named
を使用して、必要なファイルを監獄に追加します:
# mkdir -p /srv/named/{dev,etc,usr/lib/engines,var/{run,log,named}}
必要なシステムファイルをコピー:
# cp -av /etc/{localtime,named.conf} /srv/named/etc/ # cp -av /usr/lib/engines/* /srv/named/usr/lib/engines/ # cp -av /var/named/* /srv/named/var/named/.
必要な dev ノードを設定:
# mknod /srv/named/dev/null c 1 3 # mknod /srv/named/dev/random c 1 8
ファイルの所有者を設定:
# chown -R named:named /srv/named
これで監獄に必要なファイルシステムが作成されます。
サービスファイル
次に、chroot で bind を実行できるようにする新しいサービスファイルを作成します:
# cp -av /usr/lib/systemd/system/named.service /etc/systemd/system/named-chroot.service
サービスが bind を実行する方法を編集してください:
/etc/systemd/system/named-chroot.service
ExecStart=/usr/bin/named -4 -f -u named -t "/srv/named"
そして systemd をリロード (systemctl daemon-reload
) してからサービスを起動 (systemctl start named-chroot.service
) してください。
ルートゾーンをローカルで提供する
サードパーティ DNS サービス に依存したくない場合は、RFC:7706 に従ってローカルでルートゾーンを提供できます。これは、DNS 再帰リゾルバーとして BIND を使用することで実現できます。
再帰リゾルバーを管理するには、通常、root hints file を設定する必要があります。このファイルには、ルートゾーンの権威ネームサーバーの名前と IP アドレスが含まれています。
IANA Web サイト からファイルを取得し、/var/named
に配置します。
サーバー設定を編集して、それぞれのファイルを追加します。
/etc/named.conf
zone "." IN { type hint; file "named.root"; };
設定内でも再帰を許可する必要があります。#再帰を許可 を参照してください。