否定応答がわからなくなる話

〜 jp.sharp は何が問題だったのか?  

Dec 19, 2020 DNS 温泉番外編in大阪 (大阪?)

http://www.e-ontap.com/dns/amagasaki2020-neg/

自己紹介

何もわからない... とりあえず否定応答がわからない

わからなくて当たり前!

なぜなら...
RFC 2308 - Negative Caching of DNS Queries (DNS NCACHE) は滅茶苦茶

... 1998年当時のデタラメな実装たちの妥協の産物。RFC8020 (2016年) が出てよかった。

NODATA と NXDOMAIN の違いはわかる?

RFC 8499 DNS Terminology / JPRS 訳より


NXDOMAIN: このRCODEは、"名前エラー [...] このコードは、問い合わせで参照されたドメイン名が存在しないことを意味する"という記述で[RFC1035]のセクション4.1.1の中に初出している。[RFC2308]は、Name Error(名前エラー)の同義語としてNXDOMAINを規定した。


NODATA: "指定されたクラスの名前としては正当だが、指定されたタイプのレコードが存在しないことを示す疑似RCODE。NODATA応答は、回答からの推論を必要とする"([RFC2308]のセクション1から引用)。"NODATAは、RCODEがNOERRORに設定されており、かつ回答部に関連する情報を何も持たないことで提示される。権威部はSOAレコードを含む。SOAレコードが無ければNSレコードは存在しない"([RFC2308]のセクション2.2から引用)。

NODATA と NXDOMAIN の違いはわかる?

RFC 8499 DNS Terminology / JPRS 訳より

NXDOMAIN: このRCODEは、"名前エラー [...] このコードは、問い合わせで参照されたドメイン名が存在しないことを意味する"という記述で[RFC1035]のセクション4.1.1の中に初出している。[RFC2308]は、Name Error(名前エラー)の同義語としてNXDOMAINを規定した。

 ~% drill -o rd wwww.e-ontap.com @ns.e-ontap.com
 ;; ->>HEADER<<- opcode: QUERY, rcode: NXDOMAIN, id: 49053
 ;; flags: qr aa ; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
 ;; QUESTION SECTION:
 ;; wwww.e-ontap.com. IN A

 ;; ANSWER SECTION:

 ;; AUTHORITY SECTION:
 e-ontap.com. 2560 IN SOA ns.e-ontap.com. hostmaster.e-ontap.com. 1607761683 16384 2048 1048576 2560

;; ADDITIONAL SECTION:

NODATA と NXDOMAIN の違いはわかる?

RFC 8499 DNS Terminology / JPRS 訳より

NODATA: "指定されたクラスの名前としては正当だが、指定されたタイプのレコードが存在しないことを示す疑似RCODE。NODATA応答は、回答からの推論を必要とする"([RFC2308]のセクション1から引用)。"NODATAは、RCODEがNOERRORに設定されており、かつ回答部に関連する情報を何も持たないことで提示される。権威部はSOAレコードを含む。SOAレコードが無ければNSレコードは存在しない"([RFC2308]のセクション2.2から引用)。

 ~% drill -o rd aaaa www.e-ontap.com @ns.e-ontap.com
 ;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 45117
 ;; flags: qr aa ; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
 ;; QUESTION SECTION:
 ;; www.e-ontap.com. IN AAAA

 ;; ANSWER SECTION:

 ;; AUTHORITY SECTION:
 e-ontap.com. 2560 IN SOA ns.e-ontap.com. hostmaster.e-ontap.com. 1607761683 16384 2048 1048576 2560

 ;; ADDITIONAL SECTION:

NODATA と Referral の違いはわかる?

RFC 8499 DNS Terminology / JPRS 訳より

NODATA: ... SOA レコードが権威部に存在すること、または NS レコードが権威部に存在しないこと等を手がかりに、NODATA 応答と参照応答を区別することは可能である。

 > drill -o rd a www.e-ontap.com @a.gtld-servers.net
 ;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 3504
 ;; flags: qr ; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 2
 ;; QUESTION SECTION:
 ;; www.e-ontap.com. IN A

 ;; ANSWER SECTION:

 ;; AUTHORITY SECTION:
 e-ontap.com. 172800 IN NS ns.e-ontap.com.
 e-ontap.com. 172800 IN NS ns2.e-ontap.com.

 ;; ADDITIONAL SECTION:
 ns.e-ontap.com. 172800 IN A 14.192.44.1
 ns2.e-ontap.com.172800 IN A 49.212.106.253

応答コード (RFC 1035: 4.1.1. Header section format)

RCODE Response code - this 4 bit field is set as part of
	   responses.  The values have the following
	   interpretation:

      0       No error condition

      1       Format error - The name server was
              unable to interpret the query.

      2       Server failure - The name server was
	           unable to process this query due to a
	           problem with the name server.

      3       Name Error - Meaningful only for
	           responses from an authoritative name
	           server, this code signifies that the
	           domain name referenced in the query does
	           not exist.

      4       Not Implemented - The name server does
              not support the requested kind of query.

      5       Refused - The name server refuses to
	           perform the specified operation for
	           policy reasons.  For example, a name
              server may not wish to provide the
        	     information to the particular requester,
        	     or a name server may not wish to perform
        	     a particular operation (e.g., zone
        	     transfer) for particular data.

      6-15    Reserved for future use.
	 

RFC 2308: 4. SOA Minimum フィールド

過去3つの定義

2つめはマスターゾーンファイルの中でだけ意味がある。セカンダリへ転送されたデータは明示的な TTL が生成される。別な方法が使われるべきであり RFC 1035 ではマスターファイルフォーマットがディレクティブとして
$TTL <:TTL> [comment]
を含むよう拡張された。
このディレクティブ以降に現れる明示的な TTL を持たない RR には $TTL の TTL が設定される。

残った現在の意味は否定応答の TTL であり、SOA minimum フィールドの新しい定義だ。

RFC 2308: 5. 否定回答のキャッシング

権威サーバが否定回答を作成するとき TTL を指定しなければいけない。
Authority Section に SOA レコードをいれる。その TTL は SOA の minimum フィールドと SOA レコードの TTL の小さい方が選ばれる。キャッシュの TTL は減算されて 0 になったら回答に使用してはいけない。

SOA レコードのない否定応答はキャッシュされるべきではない。

キャッシュ時間には制限を設けるべきだ。1 - 3 時間をデフォルトとするのが賢明だ。1日を越えると問題が多いことがわかっている。
(Unbound のデフォルトは cache-max-negative-ttl: 3600)

否定応答の TTL 事例 1

  ~% dnsq soa city.amagasaki.hyogo.jp iris-n01.pref.hyogo.lg.jp
  6 city.amagasaki.hyogo.jp:
  148 bytes, 1+1+2+0 records, response, authoritative, noerror
  query: 6 city.amagasaki.hyogo.jp
  answer: city.amagasaki.hyogo.jp 300 SOA iris-n01.pref.hyogo.lg.jp postmaster.city.amagasaki.hyogo.jp\
  2019091701 10800 1800 6048008 86400
  authority: city.amagasaki.hyogo.jp 300 NS iris-n01.pref.hyogo.lg.jp
  authority: city.amagasaki.hyogo.jp 300 NS iris-z01.pref.hyogo.lg.jp

  ~% dnsq a wwww.city.amagasaki.hyogo.jp iris-n01.pref.hyogo.lg.jp
  1 wwww.city.amagasaki.hyogo.jp:
  116 bytes, 1+0+1+0 records, response, authoritative, nxdomain
  query: 1 wwww.city.amagasaki.hyogo.jp
  authority: city.amagasaki.hyogo.jp 300 SOA iris-n01.pref.hyogo.lg.jp postmaster.city.amagasaki.hyogo.jp\
  2019091701 10800 1800 6048008 86400

否定応答の TTL 事例 2

権威サーバの応答

  ~% dnsq soa amashin.co.jp a1-35.akam.net.
  6 amashin.co.jp:
  219 bytes, 1+1+6+0 records, response, authoritative, noerror
  query: 6 amashin.co.jp
  answer: amashin.co.jp 28800 SOA a9-66.akam.net hostmaster.akamai.com 1560762823 43200 7200 604800 7200

  ~% dnsq a wwww.amashin.co.jp a1-35.akam.net.
  1 wwww.amashin.co.jp:
  107 bytes, 1+0+1+0 records, response, authoritative, noerror
  query: 1 wwww.amashin.co.jp
  authority: amashin.co.jp 7200 SOA a9-66.akam.net hostmaster.akamai.com 1560762823 43200 7200 604800 7200

空だったキャッシュサーバ (cache-max-negative-ttl: 3600 な Unbound) からの応答

~% dnsqr a wwww.amashin.co.jp
1 wwww.amashin.co.jp:
107 bytes, 1+0+1+0 records, response, noerror
query: 1 wwww.amashin.co.jp
authority: amashin.co.jp 3600 SOA a9-66.akam.net hostmaster.akamai.com 1560762823 43200 7200 604800 7200

RFC 2308: 6. キャッシュからの否定回答

否定回答のキャッシュを答える際に、減算された TTL を持つ SOA を Authority Section に付加しなければいけない。(NXDOMAIN や NODATA が正しく timeout するように)

(つまりキャッシュが多段になるから浸透が遅いというような話は妄言)

RFC 2308: 7. 他の否定応答

(TTL を示せない) 他の否定応答のキャッシングをカバーする RFC はない。ループ回避の必要あり。

RFC 2308: 7.1 Server Failure (オプション)

Server Failure は 2 つに分類される。

  1. ゾーン設定にミスがあることを検出できた場合: サーバに指定されているのにゾーンが設定されていないかゾーンデータが取得できなくなっている
  2. そのサーバが他のサーバからデータを取得しなくてはいけないがそのサーバがデータを提供できなくなっている

いずれの場合もリゾルバは server failure 応答をキャッシュしてもよい。その場合、5 分を超えてキャッシュしてはいけない (MUST NOT)。<query name, type, class, server IP address> の組みでキャッシュしなければいけない(MUST)。

RFC 2308: 7.2 Dead / Unreachable Server (オプション)

120秒以内にサーバが応答しなかったらそれをキャッシュしても良い(MAY)。

例: ICMP unreachable, TCP resets, その他 IP スタックのエラー

リゾルバーは、サーバーのサービス不能通知をキャッシュしてもよい(MAY)。

5 分以上停止とみなしてはいけない (MUST NOT)。

トランスポート層でサーバ停止が検出されたときは IP アドレスで、それ以外の場合は <query name, type, class, server IP address> の組みでキャッシュしなければいけない(MUST)。

djb の重要な警告 (前野訳より)

NXDOMAINに関する警告: NXDOMAIN は 照会ドメインにサブドメインが存在しないことを保証することは RFC 1034 と RFC 1035 から明らかである。

例えば、ns.heaven.af.milに対して NXDOMAIN があったら、 a.ns.heaven.af.mil と b.ns.heaven.af.mil とが存在しないと結論できる。 あるサーバがa.ns.heaven.af.mil と b.ns.heaven.af.mil に対するレコードを持ち、 ns.heaven.af.mil に対するレコードを持たないなら、 NXDOMAINではなく、zero-records (#5) 返答を送る。

『にもかかわらず』、RFC 2308 ではドメインが存在しているときでさえ、 照会名に対してはいかなるタイプのレコードも存在しないことを意味する ことに NXDOMAIN を返事することを認めた。 そこで、相互運用上の破滅を引き起こさぬために、 キャッシュとしては上の推論をしないようにすることが必須である。

NXDOMAIN: There Really Is Nothing Underneath (RFC8020)

下には全く何もない

  Abstract

  This document states clearly that when a DNS resolver receives a
  response with a response code of NXDOMAIN, it means that the domain
  name which is thus denied AND ALL THE NAMES UNDER IT do not exist.

  This document clarifies RFC 1034 and modifies a portion of RFC 2308:
  it updates both of them.

(JPRS訳) この文書は、DNSリゾルバーがドメイン名不在のレスポンスコードを持つ応答を受信した場合、ないと否定されたドメイン名とその下にあるすべての名前は存在しないということを明確に述べている。

解説: ドメイン名はラベルの木構造なのだから、あるノードが存在しない ("Name Error" or "NXDOMAIN") というなら、そのノードを根とする枝(サブツリー)全体が存在しないってこと。

RFC 8020: 4. 利益

上記の例 (注: foo.example と bar.foo.example) のように2つの query が 1つですむなどキャッシュの効率化や権威サーバへのトラフック減に資すので DNS 全体のエコシステムの利益になる。

RFC 7816 の QNAME minimization に特に資する。(NXDOMAIN に遭遇したら検索をすぐに終わらせられるから)

"NXDOMAIN cut" は suffix がないことがわかればランダム QNAME 攻撃を緩和するのに役立つかもしれない。(balakrichenan-dafa888)

管理者が suffix に query を投げてやれば、"NXDOMAIN cut" により NXDOMAIN を受け取ったリゾルバは権威サーバへの query の転送をやめるだろう。

もう一歩踏み込んで RFC 8198

  Internet Engineering Task Force (IETF)                       K. Fujiwara
  Request for Comments: 8198                                          JPRS
  Updates: 4035                                                    A. Kato
  Category: Standards Track                                      Keio/WIDE
  ISSN: 2070-1721                                                W. Kumari
  Google
  July 2017


                  Aggressive Use of DNSSEC-Validated Cache

乱暴な要約:

chalie.example.com を引いて以下をキャッシュしたら、以降は alpha と echo の間のドメイン名をすべて NXDOMAIN 応答してよい。

alpha.example.com IN NSEC echo.example.com

Unbound に実装 (デフォルトは #aggressive-nsec: no)

In BIND v9.12 this feature is enabled by default. だそうです

JP も藤原さんを立てて NSEC にするか、NSEC3 でも Opt-Out をやめればこれ適用できるのに。


(注: 私は DNSSEC 自体に反対ですけどね!)

否定応答がわからなくなる事例 1:
NODATA になるべきところが NXDOMAIN だった

> dig aws.amazon.com

; <<>> DiG 9.9.5 <<>> aws.amazon.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18799
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;aws.amazon.com.		IN A

;; ANSWER SECTION:
aws.amazon.com.		50 IN CNAME aws.amazon.com.cdn.amazon.com.
aws.amazon.com.cdn.amazon.com. 55 IN CNAME dr49lng3n1n2s.cloudfront.net.
dr49lng3n1n2s.cloudfront.net. 60 IN A 54.230.126.41

;; Query time: 290 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Feb 16 10:25:28 JST 2019
;; MSG SIZE  rcvd: 123

> dig ns com.cdn.amazon.com

; <<>> DiG 9.9.5 <<>> ns com.cdn.amazon.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 61538
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;com.cdn.amazon.com.	IN NS

;; Query time: 55 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Feb 16 10:25:45 JST 2019
;; MSG SIZE  rcvd: 36

大学を通して AWS にクレーム

qname-minimisation-strict: yes な Unbound で www.chukyo-u.ac.jp が引けなかった。

Date: Thu, 5 Oct 2017 13:07:56 +0900
From: "T.Suzuki"
To: 情シス
Subject: www.chukyo-u.ac.jp

工学部鈴木です。

r1.amazonaws.com と r2.amazonaws.com が elb.amazonaws.com に関して、NXDOMAIN 
を応答します。これは RFC 1034, RFC 8020 違反であり、DNS キャッシュサーバの実
装によっては www.chukyo-u.ac.jp の名前解決に失敗する可能性があります。
(u1,u2 は NODATA で正しいので 1/2 の確率)

大学として機会損失があるとまずいでしょう。

顧客として改善の申し入れをすると良いでしょう。窓口を教えて頂ければ私が交渉し
てもよいです。(いちおう AWS の知り合いの技術者には伝えましたが)

~% dig www.chukyo-u.ac.jp @ns1.hs.ctc.jp

; <<>> DiG 9.9.5 <<>> www.chukyo-u.ac.jp @ns1.hs.ctc.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50893
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.chukyo-u.ac.jp.	IN A

;; ANSWER SECTION:
www.chukyo-u.ac.jp.	86400 IN CNAME WWW-ELB-EXT-1997305994.ap-northeast-1.elb.amazonaws.com.

;; Query time: 15 msec
;; SERVER: 218.216.179.154#53(218.216.179.154)
;; WHEN: Thu Oct 05 13:00:21 JST 2017
;; MSG SIZE  rcvd: 116

~% dig WWW-ELB-EXT-1997305994.ap-northeast-1.elb.amazonaws.com @a.gtld-servers.net

; <<>> DiG 9.9.5 <<>> WWW-ELB-EXT-1997305994.ap-northeast-1.elb.amazonaws.com @a.gtld-servers.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1961
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 4, ADDITIONAL: 5
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;WWW-ELB-EXT-1997305994.ap-northeast-1.elb.amazonaws.com. IN A

;; AUTHORITY SECTION:
amazonaws.com.		172800 IN NS u1.amazonaws.com.
amazonaws.com.		172800 IN NS u2.amazonaws.com.
amazonaws.com.		172800 IN NS r1.amazonaws.com.
amazonaws.com.		172800 IN NS r2.amazonaws.com.

;; ADDITIONAL SECTION:
u1.amazonaws.com.	172800 IN A 156.154.64.10
u2.amazonaws.com.	172800 IN A 156.154.65.10
r1.amazonaws.com.	172800 IN A 205.251.192.27
r2.amazonaws.com.	172800 IN A 205.251.195.199

;; Query time: 16 msec
;; SERVER: 192.5.6.30#53(192.5.6.30)
;; WHEN: Thu Oct 05 13:00:32 JST 2017
;; MSG SIZE  rcvd: 216

~% dig WWW-ELB-EXT-1997305994.ap-northeast-1.elb.amazonaws.com @r1.amazonaws.com 

; <<>> DiG 9.9.5 <<>> WWW-ELB-EXT-1997305994.ap-northeast-1.elb.amazonaws.com @r1.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26587
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 4, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;WWW-ELB-EXT-1997305994.ap-northeast-1.elb.amazonaws.com. IN A

;; AUTHORITY SECTION:
ap-northeast-1.elb.amazonaws.com. 300 IN NS ns-1325.awsdns-37.org.
ap-northeast-1.elb.amazonaws.com. 300 IN NS ns-1683.awsdns-18.co.uk.
ap-northeast-1.elb.amazonaws.com. 300 IN NS ns-54.awsdns-06.com.
ap-northeast-1.elb.amazonaws.com. 300 IN NS ns-982.awsdns-58.net.

;; Query time: 231 msec
;; SERVER: 205.251.192.27#53(205.251.192.27)
;; WHEN: Thu Oct 05 13:00:43 JST 2017
;; MSG SIZE  rcvd: 220

~% dig elb.amazonaws.com @r1.amazonaws.com
 
; <<>> DiG 9.9.5 <<>> elb.amazonaws.com @r1.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 10800
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;elb.amazonaws.com.	IN A

;; AUTHORITY SECTION:
amazonaws.com.		3593 IN	SOA dns-external-master.amazon.com. hostmaster.amazon.com. (
				2012708585 ; serial
				180        ; refresh (3 minutes)
				60         ; retry (1 minute)
				2592000    ; expire (4 weeks 2 days)
				3593       ; minimum (59 minutes 53 seconds)
				)

;; Query time: 262 msec
;; SERVER: 205.251.192.27#53(205.251.192.27)
;; WHEN: Thu Oct 05 13:00:52 JST 2017
;; MSG SIZE  rcvd: 120

~% dig elb.amazonaws.com @u1.amazonaws.com

; <<>> DiG 9.9.5 <<>> elb.amazonaws.com @u1.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64248
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65235
;; QUESTION SECTION:
;elb.amazonaws.com.	IN A

;; AUTHORITY SECTION:
amazonaws.com.		3593 IN	SOA pdns1.ultradns.net. hostmaster.amazon.com. (
				2014061348 ; serial
				180        ; refresh (3 minutes)
				60         ; retry (1 minute)
				2592000    ; expire (4 weeks 2 days)
				3593       ; minimum (59 minutes 53 seconds)
				)

;; Query time: 19 msec
;; SERVER: 156.154.64.10#53(156.154.64.10)
;; WHEN: Thu Oct 05 13:00:56 JST 2017
;; MSG SIZE  rcvd: 11

-- 
T.Suzuki 

AWS から回答

  
Date: Fri, 20 Oct 2017

この度は回答までお時間を要しまして誠に申し訳ございませんでした。
本事象について、調査結果をご報告致します。

歴史的な背景により、現在 r1/r2.amaozonaws.com. については、 empty non-terminal のドメインについて
NOERROR ではなく NXDOMAIN を返す挙動となっております。
この問題については担当チームも把握しており、 AWS のロードマップとして修正を予定しております。
なお、大変恐縮ではございますが、今後の予定の確定した情報があるわけではなく、具体的な修正時期につい
てはご案内できかねますことをご理解賜りたく存じます。

お客様のご期待に添う回答とならず大変恐縮ではございますが、上記についてご理解いただければ幸いでござ
います。

そして現在は、、、

~% dig any elb.amazonaws.com @r2.amazonaws.com +noall +ans
;; Truncated, retrying in TCP mode.

; <<>> DiG 9.9.5 <<>> any elb.amazonaws.com @r2.amazonaws.com +noall +ans
;; global options: +cmd
elb.amazonaws.com. 300 IN TXT "RFC7816 - do not remove"

(実装には手を入れず TXT で ENT でなくしたわけね / RFC7816 は Query Name Minimisation)

否定応答がわからなくなる事例 2:
QNAME とは? NXDOMAIN とは?

~% drill a cname.small-is-beautiful.jp @ns.small-is-beautiful.jp
;; ->>HEADER<<- opcode: QUERY, rcode: NXDOMAIN, id: 3580
;; flags: qr aa rd ; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;; cname.small-is-beautiful.jp. IN A

;; ANSWER SECTION:
cname.small-is-beautiful.jp. 60 IN CNAME www-elb-ext-1997305994.ap-northeast-1.elb.amazonaws.com.

;; AUTHORITY SECTION:
amazonaws.com. 600 IN SOA ns.amazonaws.com. tss.e-ontap.com. 2019080501 3600 600 86400 600

RFC 2308 Errata ID: 4983

	 Section 1 says:

	 "QNAME" - the name in the query section of an answer, or where this
	 resolves to a CNAME, or CNAME chain, the data field of the last
	 CNAME.

	 It should say:

	 "QNAME" - the name in the query section (RFC 1034, section 3.7.1).
  

RFC 8020: 2. Rule の注意書き

Warning: if there is a chain of CNAME (or DNAME), the name that does not exist is the last of the chain ([RFC6604]) and not the QNAME. The NXDOMAIN stored in the cache is for the denied name, not always for the QNAME.

警告: CNAME (や DNAME) の連鎖がある場合、存在しないのは連鎖の最後の名前であって QNAME ではない。キャッシュに登録される NXDOMAIN は "denied name" であって、いつも QNAME というわけではない。

いやまだおかしい

こいつは偽者だ!

~% drill -o rd a cname.small-is-beautiful.jp @ns.small-is-beautiful.jp
;; ->>HEADER<<- opcode: QUERY, rcode: NXDOMAIN, id: 53591
;; flags: qr aa ; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;; cname.small-is-beautiful.jp. IN A
					 
;; ANSWER SECTION:
cname.small-is-beautiful.jp. 60 IN CNAME www-elb-ext-1997305994.ap-northeast-1.elb.amazonaws.com.

;; AUTHORITY SECTION:
amazonaws.com. 600 IN SOA ns.amazonaws.com. tss.e-ontap.com. 2019080501 3600 600 86400 600

大丈夫、まっとうなキャッシュは騙されない。(RFC 2181 に引き直せと書いてある)

~% drill a cname.small-is-beautiful.jp @1.1.1.1
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 33653
;; flags: qr rd ra ; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;; cname.small-is-beautiful.jp. IN A

;; ANSWER SECTION:
cname.small-is-beautiful.jp. 60 IN CNAME www-elb-ext-1997305994.ap-northeast-1.elb.amazonaws.com.
www-elb-ext-1997305994.ap-northeast-1.elb.amazonaws.com. 60 IN A 54.168.8.41
www-elb-ext-1997305994.ap-northeast-1.elb.amazonaws.com. 60 IN A 52.193.237.25
(まっとうじゃなかったら...)

ここまでが基本です

ここからは私もまるで納得できない話...

jp.sharp が一部の人たちから見えなくなったらしい。

本当?

当時の jp.sharp の状態

これが Unbound で SERVFAIL になる。さあ何がおかしい?

DNSVIZ を見ると、、、

INSECURE Delegation じゃないですか。なぜこれで SERVFAIL?

DNSVIZ のエラーは、、、

RRSIG jp.sharp/CNAME alg 8, id 26718: The Signer’s Name field of the RRSIG RR (sharp) does not match the name of the zone containing the RRset (jp.sharp).

そういうことです。
jp.sharp の委譲先に sharp ゾーンがあるのおかしいでしょ!

  ;; ANSWER SECTION:
  jp.sharp. 300 IN CNAME ualsharp.hs.llnwd.net.

  ;; AUTHORITY SECTION:
  sharp. 600 IN NS ns1.sharp.co.jp.
  sharp. 600 IN NS tg1.sharp.co.jp.

  ;; ADDITIONAL SECTION:
  ns1.sharp.co.jp. 43200 IN A 61.214.248.154
  tg1.sharp.co.jp.    60 IN A 61.214.248.155

とはいえ、INSECURE Delegation (DS 無し) ...

jp.sharp を再現してみた (直されてしまったし)

そうそう、こうなる。mufj.jp が sharp に相当。(Unbound 1.13.0)
~% dig insecure.mufj.jp +noall +comm +ans

; <<>> DiG 9.9.5 <<>> insecure.mufj.jp +noall +comm +ans
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 1635
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
署名検証を無効 (+cd) にすると、、、
~% dig insecure.mufj.jp +noall +comm +ans +cd +dnssec

; <<>> DiG 9.9.5 <<>> insecure.mufj.jp +noall +comm +ans +cd +dnssec
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15469
;; flags: qr rd ra cd; QUERY: 1, ANSWER: 3, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1232
;; ANSWER SECTION:
insecure.mufj.jp. 14 IN CNAME www.e-ontap.com.
insecure.mufj.jp. 14 IN RRSIG CNAME 13 3 60 20371231000000 20201028093430 18023 mufj.jp. kA3AHm1HEiJW/Uoq+UuNZWXAEpB1Mjig7xZuSZZ6uM0IUWqud/cPPGvT 8WcU+9YqIWhWPVsJE5w0RwC+w5RuXw==
www.e-ontap.com. 1754 IN A 49.212.171.172

unbound.log さんの言い分

no valid signatures だそうです。

  [1607769102] unbound[23095:0] info: verify rrset insecure.mufj.jp. CNAME IN
  [1607769102] unbound[23095:0] debug: verify sig 18023 13
  [1607769102] unbound[23095:0] debug: verify: could not find appropriate key
  [1607769102] unbound[23095:0] debug: rrset failed to verify: no valid signatures
  [1607769102] unbound[23095:0] debug: verify result: sec_status_bogus
  [1607769102] unbound[23095:0] info: validator: response has failed ANSWER rrset: insecure.mufj.jp. CNAME IN
  [1607769102] unbound[23095:0] info: Validate: message contains bad rrsets

なんで検証するんですか? (DS 無いのですが)

バグなんですか? 仕様なんですか?

でもこんな設定、SERVFAIL で良いと思うのですけどね。
(偽 mufj.jp (sharp) ゾーンだと考えれば納得が行く / だとすると Unbound 以外の多くの実装が騙されていることに)

DNSSEC さっぱりわかりません。誰か教えて!

insecure.mufj.jp に対する各実装の言い分

 (2022.7.18 再確認) 

さらに、否定応答といえば、、、

時間が無いので以下は別な機会に

さらに、否定応答といえば、、、

まだまだ語りたいことはたくさん

またいつかどこかの温泉で...