DNSパケットフォーマットの構造を解説するとともに、その理解を深めるため、DNSパケットの具体的な作り方を説明する。
DNSを理解するために、DNSパケットフォーマットを理解することは重要である。ここでは、DNSパケットフォーマットの構造を解説するとともに、その理解を深めることができるよう、DNSパケットの具体的な作り方について説明する。
DNSでは、「スタブリゾルバとフルサービスリゾルバの間」と、「フルサービスリゾルバから権威DNSサーバの間」では、サービス用のポートとしていずれもDNS専用のポート番号53を用い、UDPまたはTCPで通信を行う。流れるデータはバイナリで、ネットワークバイトオーダーで構成される。DNSパケットは、DNSヘッダ、クエリ、応答からなる。DNSパケットフォーマットを図1に示す。
TCPの場合は、DNSパケットの前に、DNSパケットのサイズを16ビットで付加する。
次に、DNSヘッダフォーマットを図2(説明は表1)に示す。
名称 | 説明 |
---|---|
ID | DNSのトランザクションID。クエリ時に指定し、応答パケットにコピー |
QR | 問い合わせが0、応答が1 |
OPCODE | 問い合わせの種類を指定する。0が通常のクエリ、4がNotify、5がUpdate |
AA | 管理権限がある応答であることを示す |
TC | パケット長制限などで応答が切り詰められていることを示す |
RD | 名前解決を要求するビット。0は権威DNSサーバへの問い合わせで、 1はフルサービスリゾルバへの問い合わせ |
RA | 名前解決可能であることを示す |
Z | 将来のために予約。常に0とする |
AD | DNSSEC検証に成功したことを示す(応答)/ 応答のADビットを理解できることを示す(問い合わせ) |
CD | DNSSEC検証の禁止 |
QDCOUNT | Questionセクションの数で、通常は1 |
ANCOUNT | Answerセクションのリソースレコード(RR)数 |
NSCOUNT | AuthorityセクションのRR数 |
ARCOUNT | AdditionalセクションのRR数 |
表1 DNSヘッダの説明 |
DNSクエリ情報と応答は、Questionセクション、Answerセクション、Authorityセクション、Additionalセクションの4つのセクションから構成される。
Questionセクションは、以下のフォーマットである。
Questionセクションの数は、通常は1である。そのため、QDCOUNTの値は1となる。
Answerセクション、Authorityセクション、Additionalセクションは、リソースレコードフォーマットのデータを並べ、それぞれのリソースレコード数をANCOUNT、NSCOUNT、ARCOUNTに記述する。
リソースレコードは、以下のフォーマットである。
RDLENGTHは、RDATAの長さを示す。
RDATAの形式はタイプごとに決められており、例えばタイプが1(A)であればIPv4アドレスを4オクテットで表現して格納する。その場合のRDLENGTHは4である。
ドメイン名は、63文字以下のラベルを連結し、最後を文字列長がゼロのルートラベル(0x00)で終端したもので、各ラベルは文字数の1オクテットの後にラベルがつく。
ラベル長部の先頭2ビットは別の意味を持ち、00の場合は1オクテットでラベル長を示すが、11の場合は次のオクテットと合わせて16ビットの情報とし、ドメイン名のデータ量を圧縮(メッセージ圧縮)することに用いられる。
メッセージ圧縮されたデータがあると、オフセットで示された部分からの情報がドメイン名として後続するという意味となる。オフセットは、DNSヘッダの先頭からのバイト位置である。
リソースレコードを、具体例を使用して説明する。例えば、
www.jprs.co.jp. 300 IN A 117.104.133.167
というリソースレコードは、ドメイン名 www.jprs.co.jp が以下のように表現され、
タイプAが00 01、クラス INが00 01、TTL 300が00 00 01 2c、IPv4アドレスであるからRDLENGTHが4、そのあとにIPアドレスを詰めると、
となる。
Copyright © ITmedia, Inc. All Rights Reserved.