DNSサーバーとしてのBIND9は、パブリックDNSの未定義の方向に置き換えることはできません。

DNSサーバーとしてのBIND9は、パブリックDNSの未定義の方向に置き換えることはできません。

設定

次のコンテナファイルを介して独自のIPを取得するコンテナ化されたネーミングサービスがあります。

FROM alpine:latest
RUN apk --no-cache add bind bind-tools bind-dnssec-tools bind-dnssec-root

COPY --chmod=500 --chown=root:root init.sh /usr/sbin/init

COPY --chmod=444 --chown=root:root bindetc/named.conf /etc/bind/named.conf

RUN chmod 770 /var/bind
RUN chown root:named /var/bind

COPY --chmod=440 --chown=root:named bindetc/direct.db /var/bind/direct.db
COPY --chmod=440 --chown=root:named bindetc/reverse.db /var/bind/reverse.db

VOLUME "/var/bind"
EXPOSE 53/tcp 53/udp
CMD /usr/sbin/named -f -g -u named

次のように構成された信頼できるサーバーと再帰サーバーが混在しています。 bindetec/named.conf

acl LAN {
  192.168.0.0/24;
}

options {
  directory "/var/bind";

  allow-recursion {
    192.168.0.0/24;
    127.0.0.1/32; // localhost      
  };

  forwarders {          
    1.1.1.1; // Cloudflare
    208.67.222.222; // OpenDNS
  };

  listen-on { 192.168.0.136; 127.0.0.1; };
  listen-on-v6 { none; };

  allow-transfer port 53 { 192.168.0.136; 0.0.0.0; };
  allow-query { localhost; LAN; };

  recursion yes;

  pid-file "/var/run/named/named.pid";
  dump-file "/var/bind/data/cache_dump.db";
  statistics-file "/var/bind/data/named_stats.txt";
  memstatistics-file "/var/bind/data/named_mem_stats.txt";
};

zone "." IN {
  type master;
  file "/var/bind/direct.db";
  allow-update { none; };
};

zone "in-addr.arpa" IN {
  type master;
  file "/var/bind/reverse.db";
  allow-update { none; };
};

以下の内容がありますbindetc/direct.db

$TTL 3600
$ORIGIN intranet.domain.
@ IN SOA ns1.intranet.domain. postmaster.intranet.domain. (909090 9000 900 604800 1800)

@ IN NS ns1.intranet.domain.

ns1    IN A 192.168.0.136

そして次bindetc/reverse.db

$TTL 604800
@ IN SOA ns1.intranet.domain. postmaster.intranet.domain. (909090 9000 900 604800 1800)

@   IN NS ns1.intranet.domain.

136.0.168.192   IN PTR ns1.intranet.domain.

コンテナのIPはです192.168.0.136

質問

たとえば、パブリックDNSレコードを確認しようとすると、google.comCloudflareまたはOpenDNSにそのDNSレコードのIPが何であるかを尋ねるのではなく、デフォルトの空の応答が次のように提供されます。


; <<>> DiG 9.16.44 <<>> google.com @192.168.0.136
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 27326
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 1f5514b62f24a19b0100000065ed3501a3ae047abe73afef (good)
;; QUESTION SECTION:
;google.com.            IN  A

;; Query time: 48 msec
;; SERVER: 192.168.0.136#53(192.168.0.136)
;; WHEN: Sat Mar 09 22:20:17 CST 2024
;; MSG SIZE  rcvd: 67

答え1

このdigコマンドは、BIND がSERVFAILエラー・コードで応答しているため、構成に致命的なエラーがあると考えられることを示します。 BINDによって生成されたログメッセージを実際に調べる必要があります。

ゾーン宣言では、zone "." INBIND がtype masterDNS ルートゾーン用であることを指定するので、既定では、BIND に既存のすべての最上位ドメインについて既に知っていることを通知します。それでは、トップレベルのドメイン名「.com」が存在しないことを既に知っていますが、なぜ他の人に「google.com」を要求するのですか?

実際に別のDNSの世界を要求したり、実際にルートネームサーバーを維持していない場合は、ネームサーバーmasterzone "."

ルート領域のより一般的な宣言は次のとおりです。

// prime the server with knowledge of the root servers
zone "." {
        type hint;
        file "/usr/share/dns/root.hints";
};

/usr/share/dns/root.hintsルートDNSサーバーの標準リストはどこにありますか?https://www.internic.net/domain/named.cache。起動時に、BINDはこのリストを使用してルートネームサーバーの1つに接続し、同じリストの最新バージョンを取得します。

フォワーダを使用する予定なので、完全に省略することもできます。フォワーダを指定しないと、BINDは組み込みルートDNSサーバーのリストを使用します。 ofは、組み込みリストが使用されなくなったときに置き換える方法ですzone "."type hint

BINDは権限のないゾーンについてフォワーダにクエリを送信する必要があるため、BINDにルートネームサーバーの最新のリストがあるかどうかを気にする必要はありません。

フォワーダが応答しない場合、BIND が別のネームサーバに独自に接続しようとしたくない場合は、設定セクションにこの行を追加できますforward only;options{ ... };

前面領域を次のように宣言する必要がありますintranet.domain

zone "intranet.domain" IN {
  type master;
  file "/var/bind/direct.db";
  allow-update { none; };
};

これがあるので、allow-query { localhost; LAN; };おそらくacl LAN { ... };どこかにブロックがあるはずです。

関連情報