DynamicDNS(DDNS)の検証に際し、ゾーンデータ更新用の DNS パケットについて調べたことをまとめてみました。
※ここでは実際に設定、動作したものを掲載していますが、内容について保証するものではありません。流用される場合は各自の責任でお願いします。
ゾーンデータ更新に関するDNSパケットの規約等については DNS UPDATE として RFC2136 に標準化されています。詳細についてはそちらをご参照ください。
DynamicDNS(DDNS)の検証については「BIND で Dynamic DNS」をご参照ください。
セクションの構成について
DNS パケットは、問い合わせ(QUERY)として使用されることが多いと思いますが、更新(UPDATE)では各セクションの使われ方が異なります。
UPDATE のセクションの構成を下表に示します。参考までに QUERY のセクションについても併記します。
| UPDATE | QUERY | ||
|---|---|---|---|
| Header | Opcode、RCODE など | Header | Opcode、RCODE など |
| Zone | 更新対象のゾーン情報 | Question | クエリ情報 |
| Prerequisite | 更新条件 | Answer | クエリに対するレスポンス |
| Update | 更新要求情報 | Authority | 名前解決で使用するネームサーバ |
| Additional Data | 追加情報 | Additional | 追加情報(グルーなど) |
Header セクション
要求および応答の状況を示すセクションです。
UPDATE の Header の構成を下表に示します。参考までに QUERY の Header についても併記します。
| UPDATE | QUERY | ||
|---|---|---|---|
| ID | 識別子 | ID | 識別子 |
| QR | 要求は 0、応答は 1 | QR | 要求は 0、応答は 1 |
| Opcode | UPDATE(5) | Opcode | QUERY(0) |
| Z | 予約(0) | Flag | AA、RD など |
| RCODE | 応答の状態を示すコード(*1) | RCODE | 応答の状態を示すコード |
| ZOCOUNT | セクションのエントリ数 | QDCOUNT | セクションのエントリ数 |
| PRCOUNT | ANCOUNT | ||
| UPCOUNT | NSCOUNT | ||
| ADCOUNT | ARCOUNT | ||
*1 DNS UPDATE 用に、以下のコードが追加されています。
YXDOMAIN(6) :存在すべきでない名前が存在する。
YXRRSET (7) :存在すべきでない資源レコード集合が存在する。
NXRRSET (8) :存在するべき資源レコード集合がみつからない。
NOTAUTH (9) :サーバーは Zone セクションで指定したゾーンの権威ではない。
NOTZONE (10):Prerequisite あるいは Update セクションで使われた名前が Zone セクションで示されるゾーン内に存在しない。
Zone セクション
どのゾーンに対して更新要求を行うかを指定するセクションです。
Zone セクションの構成を下表に示します。QUERY の場合、ここは Question セクションに当たりますが、参考までに併記します。
| UPDATE(Zone Section) | QUERY(Question Section) | ||
|---|---|---|---|
| ZNAME | 更新要求対象のゾーン名 | QNAME | 問い合わせレコードのドメイン名 |
| ZTYPE | ゾーンのタイプ(つまり SOA(6)) | QTYPE | 問い合わせレコードのタイプ |
| ZCLASS | ゾーンのクラス(通常 IN(1)) | QCLASS | 問い合わせレコードのクラス |
キャプチャしたパケットで見る Zone セクションの設定項目
実際のパケットを以下に示します。
[root@dns-client ~]# tshark -nn -r /tmp/test.pcap -Y '(frame.number==1)' -V | grep ^Domain -A100 | cat -n
Running as user "root" and group "root". This could be dangerous.
1 Domain Name System (query)
2 Transaction ID: 0xcde4
3 Flags: 0x2800 Dynamic update
4 0... .... .... .... = Response: Message is a query
5 .010 1... .... .... = Opcode: Dynamic update (5)
6 .... ..0. .... .... = Truncated: Message is not truncated
7 .... ...0 .... .... = Recursion desired: Don't do query recursively
8 .... .... .0.. .... = Z: reserved (0)
9 .... .... ...0 .... = Non-authenticated data: Unacceptable
10 Zones: 1
11 Prerequisites: 0
12 Updates: 3
13 Additional RRs: 0
14 Zone
15 test.com: type SOA, class IN
16 Name: test.com
17 [Name Length: 8]
18 [Label Count: 2]
19 Type: SOA (Start Of a zone of Authority) (6)
20 Class: IN (0x0001)
21 Updates
~ ~
Prerequisite セクション
更新要求の際の条件を指定するセクションです。
条件は下記項目(RFC1035 の Resource record format を参照)への指定の組み合わせで決まります。
- NAME
- TYPE
- CLASS
- TTL
- RDLENGTH
- RDATA
指定可能な条件について下表に示します。
| 条件の種類(*1) | 条件の内容 |
|---|---|
| RRset exists (value independent) | 指定された NAME、TYPE が一致する RR が存在すること。 |
| RRset exists (value dependent) | 指定された NAME、TYPE、RDATA が一致する RR が存在すること。 |
| Name is in use | 指定された NAME が一致する RR が存在すること。 |
| RRset does not exist | 指定された NAME、TYPE が一致する RR が存在しないこと。 |
| Name is not in use | 指定された NAME が一致する RR が存在しないこと。 |
条件の種類ごとに指定する値について下表に示します。
| 条件の種類(*1) | CLASS | NAME | TYPE | TTL | RDATA(*2) |
|---|---|---|---|---|---|
| RRset exists (value independent) | ANY(255) | 検査対象の NAME、TYPE | 0 | (空) | |
| RRset exists (value dependent) | IN(1) | 検査対象の NAME、TYPE | 0 | 検査対象のデータ | |
| Name is in use | ANY(255) | 検査対象の NAME | ANY(255) | 0 | (空) |
| RRset does not exist | NONE(254) | 検査対象の NAME、TYPE | 0 | (空) | |
| Name is not in use | NONE(254) | 検査対象の NAME | ANY(255) | 0 | (空) |
*1 条件の種類については RFC2136 で使われていた表記をそのまま使用しています。
*2 表では RDLENGTH(RDATA に指定された値の長さ)を省略しています。RDATA が空('')の場合、RDLENGTH は 0 です。
キャプチャしたパケットで見る Prerequisite セクションの設定項目
条件ごとの実際のパケットを以下に示します。
RRset exists (value independent)(NAME、TYPE が一致する RR が存在すること)
[root@dns-client ~]# tshark -nn -r /tmp/test.pcap -Y '(frame.number==7)' -V | grep ^Domain -A100 | cat -n
Running as user "root" and group "root". This could be dangerous.
1 Domain Name System (query)
2 Transaction ID: 0x0000
3 Flags: 0x2800 Dynamic update
4 0... .... .... .... = Response: Message is a query
5 .010 1... .... .... = Opcode: Dynamic update (5)
6 .... ..0. .... .... = Truncated: Message is not truncated
7 .... ...0 .... .... = Recursion desired: Don't do query recursively
8 .... .... .0.. .... = Z: reserved (0)
9 .... .... ...0 .... = Non-authenticated data: Unacceptable
10 Zones: 1
11 Prerequisites: 1
12 Updates: 1
13 Additional RRs: 0
14 Zone
~ ~
21 Prerequisites
22 www9.test.com: type A, class ANY
23 Name: www9.test.com
24 Type: A (Host Address) (1)
25 Class: ANY (0x00ff)
26 Time to live: 0
27 Data length: 0
28 Updates
~ ~
RRset exists (value dependent)(NAME、TYPE、RDATA が一致する RR が存在すること)
1 Domain Name System (query)
~ ~
21 Prerequisites
22 www9.test.com: type A, class IN, addr 9.9.9.9
23 Name: www9.test.com
24 Type: A (Host Address) (1)
25 Class: IN (0x0001)
26 Time to live: 0
27 Data length: 4
28 Address: 9.9.9.9
~ ~
Name is in use(NAME が一致する RR が存在すること)
1 Domain Name System (query)
~ ~
21 Prerequisites
22 www9.test.com: type ANY, class ANY
23 Name: www9.test.com
24 Type: * (A request for all records the server/cache has available) (255)
25 Class: ANY (0x00ff)
26 Time to live: 0
27 Data length: 0
~ ~
RRset does not exist(NAME、TYPE が一致する RR が存在しないこと)
1 Domain Name System (query)
~ ~
21 Prerequisites
22 www2.test.com: type A, class NONE
23 Name: www2.test.com
24 Type: A (Host Address) (1)
25 Class: NONE (0x00fe)
26 Time to live: 0
27 Data length: 0
~ ~
Name is not in use(NAME が一致する RR が存在しないこと)
1 Domain Name System (query)
~ ~
21 Prerequisites
22 www2.test.com: type ANY, class NONE
23 Name: www2.test.com
24 Type: * (A request for all records the server/cache has available) (255)
25 Class: NONE (0x00fe)
26 Time to live: 0
27 Data length: 0
~ ~
Update セクション
更新要求を指定するセクションです。
更新要求は下記項目(RFC1035 の Resource record format を参照)への指定の組み合わせで決まります。
- NAME
- TYPE
- CLASS
- TTL
- RDLENGTH
- RDATA
指定可能な更新要求について下表に示します。
| 更新の種類(*1) | 更新の内容 |
|---|---|
| Add To An RRset | 指定された RR を追加。 |
| Delete An RRset | 指定された NAME、TYPE が一致する RR を削除。 |
| Delete All RRsets From A Name | 指定された NAME が一致する RR を削除。 |
| Delete An RR From An RRset | 指定された NAME、TYPE、RDATA が一致する RR を削除。 |
更新の種類ごとに指定する値について下表に示します。
| 更新の種類(*1) | CLASS | NAME | TYPE | TTL | RDATA(*2) |
|---|---|---|---|---|---|
| Add To An RRset | IN(1) | 追加(更新)する RR の値 | |||
| Delete An RRset | ANY(255) | 削除対象の NAME、TYPE | 0 | (空) | |
| Delete All RRsets From A Name | ANY(255) | 削除対象の NAME | ANY(255) | 0 | (空) |
| Delete An RR From An RRset | NONE(254) | 削除対象の NAME、TYPE | 0 | 削除対象のデータ | |
*1 更新の種類については RFC2136 で使われていた表記をそのまま使用しています。
*2 表では RDLENGTH(RDATA に指定された値の長さ)を省略しています。RDATA が空('')の場合、RDLENGTH は 0 です。
キャプチャしたパケットで見る Update セクションの設定項目
更新ごとの実際のパケットを以下に示します。
Add To An RRset(RR を追加)
[root@dns-client ~]# tshark -nn -r /tmp/test.pcap -Y '(frame.number==1)' -V | grep ^Domain -A100 | cat -n
Running as user "root" and group "root". This could be dangerous.
1 Domain Name System (query)
2 Transaction ID: 0x0000
3 Flags: 0x2900 Dynamic update
4 0... .... .... .... = Response: Message is a query
5 .010 1... .... .... = Opcode: Dynamic update (5)
6 .... ..0. .... .... = Truncated: Message is not truncated
7 .... ...1 .... .... = Recursion desired: Do query recursively
8 .... .... .0.. .... = Z: reserved (0)
9 .... .... ...0 .... = Non-authenticated data: Unacceptable
10 Zones: 1
11 Prerequisites: 0
12 Updates: 3
13 Additional RRs: 0
14 Zone
~ ~
21 Updates
22 www2.test.com: type A, class IN, addr 2.3.4.5
23 Name: www2.test.com
24 Type: A (Host Address) (1)
25 Class: IN (0x0001)
26 Time to live: 2000
27 Data length: 4
28 Address: 2.3.4.5
~ ~
Delete An RRset(NAME、TYPE が一致する RR を削除)
1 Domain Name System (query)
~ ~
21 Updates
~ ~
29 www3.test.com: type A, class ANY
30 Name: www3.test.com
31 Type: A (Host Address) (1)
32 Class: ANY (0x00ff)
33 Time to live: 0
34 Data length: 0
~ ~
Delete All RRsets From A Name(NAME が一致する RR を削除)
1 Domain Name System (query)
~ ~
21 Updates
~ ~
35 www4.test.com: type ANY, class ANY
36 Name: www4.test.com
37 Type: * (A request for all records the server/cache has available) (255)
38 Class: ANY (0x00ff)
39 Time to live: 0
40 Data length: 0
Delete An RR From An RRset(NAME、TYPE、RDATA が一致する RR を削除)
1 Domain Name System (query)
~ ~
21 Updates
22 www2.test.com: type A, class NONE, addr 2.3.4.5
23 Name: www2.test.com
24 Type: A (Host Address) (1)
25 Class: NONE (0x00fe)
26 Time to live: 0
27 Data length: 4
28 Address: 2.3.4.5
~ ~
Additional Data セクション
TSIG で通信する際にキーを設定したりするようです。(別途、DNS UPDATE の検証を実施しましたが、その際 TSIG を使用した DNS UPDATE は行っていないため、このセクションの具体的な使用方法については未確認です。)