DNS UPDATE のパケットについて

balaeniceps-rex DNS

DynamicDNS(DDNS)の検証に際し、ゾーンデータ更新用の DNS パケットについて調べたことをまとめてみました。

※ここでは実際に設定、動作したものを掲載していますが、内容について保証するものではありません。流用される場合は各自の責任でお願いします。

ゾーンデータ更新に関するDNSパケットの規約等については DNS UPDATE として RFC2136 に標準化されています。詳細についてはそちらをご参照ください。

DynamicDNS(DDNS)の検証については「BIND で Dynamic DNS」をご参照ください。

セクションの構成について

DNS パケットは、問い合わせ(QUERY)として使用されることが多いと思いますが、更新(UPDATE)では各セクションの使われ方が異なります。
UPDATE のセクションの構成を下表に示します。参考までに QUERY のセクションについても併記します。

UPDATEQUERY
HeaderOpcode、RCODE などHeaderOpcode、RCODE など
Zone更新対象のゾーン情報Questionクエリ情報
Prerequisite更新条件Answerクエリに対するレスポンス
Update更新要求情報Authority名前解決で使用するネームサーバ
Additional Data追加情報Additional追加情報(グルーなど)

Header セクション

要求および応答の状況を示すセクションです。
UPDATE の Header の構成を下表に示します。参考までに QUERY の Header についても併記します。

UPDATEQUERY
ID識別子ID識別子
QR要求は 0、応答は 1QR要求は 0、応答は 1
OpcodeUPDATE(5)OpcodeQUERY(0)
Z予約(0)FlagAA、RD など
RCODE応答の状態を示すコード(*1)RCODE応答の状態を示すコード
ZOCOUNTセクションのエントリ数QDCOUNTセクションのエントリ数
PRCOUNTANCOUNT
UPCOUNTNSCOUNT
ADCOUNTARCOUNT
*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)CLASSNAMETYPETTLRDATA(*2)
RRset exists (value independent)ANY(255)ゾーンに存在する NAME、TYPE0(空)
RRset exists (value dependent)IN(1)ゾーンに存在する NAME、TYPE0ゾーンに存在するデータ
Name is in useANY(255)ゾーンに存在する NAMEANY(255)0(空)
RRset does not existNONE(254)ゾーンに存在しない NAME、TYPE0(空)
Name is not in useNONE(254)ゾーンに存在しない NAMEANY(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)CLASSNAMETYPETTLRDATA(*2)
Add To An RRsetIN(1)追加する RR の値
Delete An RRsetANY(255)ゾーンに存在する NAME、TYPE0(空)
Delete All RRsets From A NameANY(255)ゾーンに存在する NAMEANY(255)0(空)
Delete An RR From An RRsetNONE(254)ゾーンに存在する NAME、TYPE0ゾーンに存在するデータ
*1 更新の種類については RFC2136 で使われていた表記をそのまま使用しています。
*2 表では RDLENGTH(RDATA に指定された値の長さ)を省略しています。RDATA が空('')の場合、RDLENGTH は 0 です。

Additional Data セクション

TSIG で通信する際にキーを設定したりするようです。(別途、DNS UPDATE の検証を実施しましたが、その際 TSIG を使用した DNS UPDATE は行っていないため、このセクションの具体的な使用方法については未確認です。)

タイトルとURLをコピーしました