連載
» 2016年01月29日 05時00分 UPDATE

DNS Tips:DNSパケットフォーマットと、DNSパケットの作り方 (1/2)

DNSパケットフォーマットの構造を解説するとともに、その理解を深めるため、DNSパケットの具体的な作り方を説明する。

[藤原 和典(JPRS),@IT]

 DNSを理解するために、DNSパケットフォーマットを理解することは重要である。ここでは、DNSパケットフォーマットの構造を解説するとともに、その理解を深めることができるよう、DNSパケットの具体的な作り方について説明する。

DNSパケットフォーマット

 DNSでは、「スタブリゾルバとフルサービスリゾルバの間」と、「フルサービスリゾルバから権威DNSサーバの間」では、サービス用のポートとしていずれもDNS専用のポート番号53を用い、UDPまたはTCPで通信を行う。流れるデータはバイナリで、ネットワークバイトオーダーで構成される。DNSパケットは、DNSヘッダ、クエリ、応答からなる。DNSパケットフォーマットを図1に示す。

図1 DNSパケットフォーマット 図1 DNSパケットフォーマット

 TCPの場合は、DNSパケットの前に、DNSパケットのサイズを16ビットで付加する。

 次に、DNSヘッダフォーマットを図2(説明は表1)に示す。

図2 DNSヘッダフォーマット 図2 DNSヘッダフォーマット
名称 説明
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セクションは、以下のフォーマットである。

dnstips_format_fig03.gif

 Questionセクションの数は、通常は1である。そのため、QDCOUNTの値は1となる。

 Answerセクション、Authorityセクション、Additionalセクションは、リソースレコードフォーマットのデータを並べ、それぞれのリソースレコード数をANCOUNT、NSCOUNT、ARCOUNTに記述する。

 リソースレコードは、以下のフォーマットである。

dnstips_format_fig04.gif

 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 が以下のように表現され、

dnstips_format_fig08.gif

 タイプAが00 01、クラス INが00 01、TTL 300が00 00 01 2c、IPv4アドレスであるからRDLENGTHが4、そのあとにIPアドレスを詰めると、

dnstips_format_fig09.gif

となる。

       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。