メモ的ななにか

@Maleic1618

RFC8914: Extended DNS Errors

こんにちは、まれいんです。

この記事は ひとりRFCの旅 Advent Calender 4日目の記事です。

qiita.com

2020年10月に出た、比較的新しめのRFCであるRFC8914を読んでいこうと思います。

原文: RFC 8914 - Extended DNS Errors

概要

DNSはステータスを返すためのフィールドRCODEがHeaderに用意されています。 名前解決に成功したらNOERROR、ドメイン存在しない時はNXDOMAIN、サーバーに何かあったらSERVFAILなど、 ここのフィールドを見ることでざっくりと名前解決結果のステータスを確認することが出来ました。 代表的なものについてはRFC1035 4.1.1参照

maleic@ohmae:~$ dig maleic1618.hatenablog.jp @8.8.8.8

; <<>> DiG 9.16.8-Debian <<>> maleic1618.hatenablog.jp @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28650
                                       ↑これ
...

しかし、あくまでざっくりとしか分かりません。 例えば以下はDNSSECの検証に失敗した場合ですが、SERVFAILしか返ってこないのでサーバー側がcrashしたのか、応答が返ってこないのかわかりません。

$ dig dnssec-failed.org @8.8.8.8

; <<>> DiG 9.16.8-Debian <<>> dnssec-failed.org @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 32185  # <-- SERVFAILになっているだけ
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;dnssec-failed.org.             IN      A
...

というわけでこれとは別にエラーが発生した場合はより詳しい失敗理由を通知できるようにする仕組みが、このRFC8914で導入されるExtended DNS Errors(EDE)です。

wire format

EDNS0で導入されたOPTリソースレコードのkey-value形式のオプションを利用します。 wire formatは以下です。

                                                1   1   1   1   1   1
        0   1   2   3   4   5   6   7   8   9   0   1   2   3   4   5
      +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
   0: |                            OPTION-CODE                        |
      +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
   2: |                           OPTION-LENGTH                       |
      +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
   4: | INFO-CODE                                                     |
      +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
   6: / EXTRA-TEXT ...                                                /
      +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
フィールド 意味
OPTION-CODE オプションタイプの識別子、EDEは15
OPTION-LENGTH INFO-CODE長 + EXTRA-TEXT長
INFO-CODE エラー理由を示すコード
EXTRA-TEXT 人間が読む用のUTF-8な文字列

INFO-CODEのいくつかはこのRFCで定義されています。 序盤はDNSSEC関連がほとんどですね。

INFO-CODE 意味 定義か所
0 Other Error Section 4.1
1 Unsupported DNSKEY Algorithm Section 4.2
2 Unsupported DS Digest Type Section 4.3
3 Stale Answer Section 4.4 and [RFC8767]
4 Forged Answer Section 4.5
5 DNSSEC Indeterminate Section 4.6
6 DNSSEC Bogus Section 4.7
7 Signature Expired Section 4.8
8 Signature Not Yet Valid Section 4.9
9 DNSKEY Missing Section 4.10
10 RRSIGs Missing Section 4.11
11 No Zone Key Bit Set Section 4.12
12 NSEC Missing Section 4.13
13 Cached Error Section 4.14
14 Not Ready Section 4.15
15 Blocked Section 4.16
16 Censored Section 4.17
17 Filtered Section 4.18
18 Prohibited Section 4.19
19 Stale NXDomain Answer Section 4.20
20 Not Authoritative Section 4.21
21 Not Supported Section 4.22
22 No Reachable Authority Section 4.23
23 Network Error Section 4.24
24 Invalid Data Section 4.25
25-49151 Unassigned
49152-65535 Reserved for Private Use Section 5.2