BIND

提供: ArchWiki
ナビゲーションに移動 検索に移動

関連記事

Berkeley Internet Name Domain (BIND) は Domain Name System(DNS) プロトコルのリファレンス実装です。

ノート: BIND を開発している団体は Linux ディストリビューションよりも最大で4日間早く顧客にセキュリティ情報を提供しています [1]

インストール

以下の手順は 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; };
この記事またはセクションの正確性には問題があります。
理由: LAN ネットワーキングは再帰的ではありません。 (議論: トーク:BIND#)

ローカルネットワークにネームサービスを提供する場合;たとえば、192.168.0.0/24 の場合、適切なIPアドレスの範囲を /etc/named.conf に追加する必要があります。

allow-recursion { 192.168.0.0/24; 127.0.0.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) してください。

参照