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 | 問い合わせレコードのクラス |
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 です。
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 です。
Additional Data セクション
TSIG で通信する際にキーを設定したりするようです。(別途、DNS UPDATE の検証を実施しましたが、その際 TSIG を使用した DNS UPDATE は行っていないため、このセクションの具体的な使用方法については未確認です。)