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問い合わせレコードのクラス
キャプチャしたパケットで見る 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)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 です。
キャプチャしたパケットで見る 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)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 です。
キャプチャしたパケットで見る 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 は行っていないため、このセクションの具体的な使用方法については未確認です。)

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