近年のUnboundは権威サーバ機能が追加さ、DNS Authとしてゾーンをホスト出来るようになった。 例えば、ホスト名の管理用のシステムからゾーン転送を受信してUnboundでstub-zoneを使用しバックエンドに問い合わせることなく、Unboundが応答を返せるようになった。 これにより、例えば、ホスト名が追加された場合に誤った問い合わせでNXDOMAINが帰りネガティブキャッシュで数分間ホスト名の解決が出来ないといった状態になる事を防ぐ事が出来る。

設定方法は以下の通りである。

auth-zone:
    name: "test.corp"
    primary: 192.0.2.1
    allow-notify: 192.0.2.1
    fallback-enabled: yes
    zonefile: /etc/unbound/zones/test.corp.zone

fallback-enabled: yes を使用するとレコードが存在しない場合にUnboundがresolverとして動作しインターネットに問い合わせるようになる。

この設定を行い、unboundに test.corp を問い合わせるとゾーンの内容により以下のように応答が返る。

$ dig @192.0.2.2 test.corp

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6 <<>> @10.127.85.31 test.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7247
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;test.corp.                      IN      A

;; ANSWER SECTION:
test.corp.               600     IN      A       192.0.2.1

;; Query time: 0 msec
;; SERVER: 10.127.85.31#53(10.127.85.31)
;; WHEN: Mon Nov 16 18:45:45 JST 2020
;; MSG SIZE  rcvd: 53

フラグとしては AA グラフが追加応答を返す。

また、CNAME ではBindでCacheとAuthを共存させた場合と異なる動作を行う。 UnboundにCNAMEのあるレコードの問い合わせを行うと以下のような応答が帰って来る。

$ dig @192.0.2.2 www.test.corp

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6 <<>> @10.127.85.31 www.test.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 612
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.test.corp.                  IN      A

;; ANSWER SECTION:
www.test.corp.           600     IN      CNAME   example.com.

;; Query time: 0 msec
;; SERVER: 10.127.85.31#53(10.127.85.31)
;; WHEN: Mon Nov 16 19:03:57 JST 2020
;; MSG SIZE  rcvd: 63

となり、CNAMEの解決は行わずに権威サーバとしての応答を返す。

Bindの場合は以下のようにexample.comの解決まで行い、応答を返す。

$ dig @192.0.2.2 www.test.corp

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6 <<>> @10.127.85.31 www.test.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49154
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 5

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.test.corp.                  IN      A

;; ANSWER SECTION:
www.test.corp.           600     IN      CNAME   example.com.
example.com.            86391   IN      A       93.184.216.34

;; AUTHORITY SECTION:
example.com.            172789  IN      NS      a.iana-servers.net.
example.com.            172789  IN      NS      b.iana-servers.net.

;; ADDITIONAL SECTION:
a.iana-servers.net.     1789    IN      A       199.43.135.53
b.iana-servers.net.     172789  IN      A       199.43.133.53
a.iana-servers.net.     172789  IN      AAAA    2001:500:8f::53
b.iana-servers.net.     1789    IN      AAAA    2001:500:8d::53

;; Query time: 0 msec
;; SERVER: 10.127.85.31#53(10.127.85.31)
;; WHEN: Mon Nov 16 19:04:32 JST 2020
;; MSG SIZE  rcvd: 215

ホスト名用のゾーンの応答を返したいといった処理には問題はないが、例えば、DNS Authが落ちた場合でも内部で一部のレコードを使用したいといった処理を考えた場合には、UnboundではなくBindを選択した方が良いのではないかと思う。