1999/09/27

ネットワーク (14)


Domain Name System

分散型データベース
    アプリケーション → レゾルバ(resolver) → gethostbyname(),gethostbyaddr()

DNSの基本

DNS は階層的な「名前空間(name space)」を持つ(Fig.14.1)。 トップレベルのドメイン名 日本(jp) の第2レベルのドメイン名 DNSは分散型データベースである。 ある組織(NIC)がDNS treeの一部(最上位ドメイン)を管理し、それ以外の部分は それぞれの zone (DNS treeの subtree)に管理権限が委譲されている。 zone毎に複数の name server (primary name server と secondary name server) をおく必要がある。 あるzoneに新しい計算機が接続されると、そのzoneの DNS管理者は 新システムのホスト名とIPアドレスをname serverのデータベースに 登録する。

name serverは要求された情報を持っていない場合は、他のname serverに 問い合わせる。 全ての name server は、root name server (1999年9月時点で13台) のIPアドレス を知っており (ftp://ftp.nic.ad.jp/pub/internet/rs.internic.net/domain/named.root)、 root name server は第2レベルのドメインを管理する name serverの名前とIPアドレスを全て知っている。

したがって、name server が要求された情報を持っていない場合は、 root name server にコンタクトし、 どの name server にコンタクトをとればよいか教えてもらう。

name server は、情報(ホスト名に対応するIPアドレスなど)を受け取ると、 その情報をキャッシュ (cache)し、同じ情報の照会があった場合、キャッシュ した情報を返す。

ftp://ftp.nic.ad.jp/pub/internet/rs.internic.net/domain/named.root
A.ROOT-SERVERS.NET.      3600000      A     198.41.0.4
B.ROOT-SERVERS.NET.      3600000      A     128.9.0.107
    ....
M.ROOT-SERVERS.NET.      3600000      A     202.12.27.33   ←日本にあるroot name server


DNSメッセージ形式

  1. DNSメッセージ一般形
    ヘッダ
    問い合わせ部
    回答部RR
    権威部RR
    付加情報部RR
  2. ヘッダのフォーマット
                         1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 (32bits width)
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |             ID                |         Flags                 |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |          QDCount              |        ANCOUNT                |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |          NSCount              |       ARCOUNT                 |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      ID: 問い合わせ識別子
      Flags:
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |Q|Opcode |A|T|R|R|  Z  | RCODE |
            |R|       |A|C|D|A|     |       |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
             QR: Query(0) または Reply(1)
             Opcode: 問い合わせの種類を示すオペコード
                0 QUERY: 標準問い合わせ       
                1 IQUERY: 逆問い合わせ       
                2 STATUS: サーバ状態の要求
                3〜15: 予約
            AA: 権威ある応答 (Authoritative Answer)
            TC: TrunCation (切断) ←不完全を意味する
            RD: 再帰問い合わせが望ましい
            RA: 再帰問い合わせが可能
            Z: 予約(0でなくてはいけない)
            RCODE: 応答コード
                0: エラーなし
                1: フォーマットエラー
                2: サーバの失敗
                3: 名前のエラー
                4: 未実装
                5: 拒否
                6〜15: 予約
            QDCOUNT: 問い合わせ部のエントリー数
            ANCOUNT: 回答部のエントリー数
            NSCOUNT: 権威レコード中のネームサーバ資源レコードの数
            ARCOUNT: 付加情報部の資源レコードの数
    
  3. 問い合わせ部のフォーマット
                         1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 (32bits width)
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                             QNAME                             |
                                  ...
    |                                                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |          QTYPE                |         QCLASS                |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        QNAME: 問い合わせの名前 (可変長)
        QTYPE: 問い合わせのタイプ
        QCLASS: 問い合わせのクラス
    
  4. 回答部、権威部、付加情報部のフォーマット
                         1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 (32bits width)
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                             NAME                              |
                                  ...
    |                                                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |           TYPE                |          CLASS                |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                            TTL                                |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |          RDLENGTH             |                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
    |                            RDATA                              |
                                 ...
    |                                                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        NAME: 資源レコードが属しているドメイン名 (可変長)
        TYPE: 資源レコードのタイプ
        CLASS: RDATAレコードのクラス
        TTL: RRのTTL
        RDLENGTH: RDATAの長さ
        RDATA: 資源レコード (RR, Resource Record)
    
  5. ドメイン名の格納
    NAME部へのドメイン名の格納は、ドメイン名の各ドメインパート毎に LV (Length, Value) の形式でシリアルに格納される。 各サブドメインパートの最大長は 63 文字。
    [例] www.foo.co.jp
                         1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 (32bits width)
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |       3       |     'w'       |     'w'       |      'w'      |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |       3       |     'f'       |     'o'       |      'o'      |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |       2       |     'c'       |     'o'       |       2       |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |      'j'      |     'p'       |      0        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    
    あるDNSパケット中に同じドメインに属する複数の名前が現れる場合に、後続の 名前を圧縮することができる。 Length部のl最初の2ビットが 11 のとき、後続の8ビットと合わせた14ビットで DNSパケットの先頭からのオフセットを表す。
    [例] www.foo.co.jpとns.foo.co.jp
                         1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 (32bits width)
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |       3       |     'w'       |     'w'       |      'w'      |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |       3       |     'f'       |     'o'       |      'o'      |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |       2       |     'c'       |     'o'       |       2       |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |      'j'      |     'p'       |      0        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       ...
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |       2       |     'n'       |     's'       |      0xc0     |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |     0x05      |      0        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    

TYPEとQTYPE

資源レコード (Resource Record) のタイプ
A1IPアドレス
NS2ネームサーバ
CNAME5エリアスの正式名 (Canonical Name)
PTR12ドメイン名のポインタ
HINFO13ホスト情報
MX15メール・エクスチェンジャ
AXFR252ゾーン転送の要求
*255全てのレコードを要求

簡単な例

sun から gemini 上の daytime server と通信する例(p.223)
sun% telnet gemini daytime       ← sun の shell 上で入力
Trying 140.252.1.11 ...
Connected to gemini.tuc.noao.edu.
Escape character is '^]'.
Wed Mar 2 10:44:17 1993           ← gemini上のdaytime serverからの出力
Connection closed by foreign host.

sun上の resolver は /etc/resolv.conf で設定されている。
sun:/etc/resolv.conf
nameserver 140.252.1.54
domain tuc.noao.edu

検索される名前が不完全な場合('.'で終っていない場合)、domain行の 値が付け加えて検索できる。nameserverのIPアドレスは3個まで指定できる。
 name server照会の tcpdump 出力
1   0.0              140.252.1.29.1447 > 140.252.1.54.53: 1+ A?
                     gemini.tuc.noao.edu. (37)
2   0.290820 (.2908) 140.252.1.54.53 > 140.252.1.29.1447: 1* 2/0/0 A
                     140.252.1.11 (69)

最初のパケットに関して、 2番目のパケットに関して 2番目のパケットでは、IPアドレスが2個返されているが、そのうちの 最初のものだけをtcpdump表示している。(Fig.14.11参照)

ポインタ照会

IPアドレス→ホスト名への対応が、ポインタ照会である。 in-addr.arpa を最後につけた名前が、IPアドレスを逆順にしたものである (DNSでは後から前へと名前が検索されるので)。
[例] IPアドレスが 140.252.13.33 の場合、33.13.252.140.in-addr.arpa となる。
140.252.13.34 を gethostbyaddrしたときのtcpdump出力
1   0.0              140.252.1.29.1610 > 140.252.1.54.53: 1+ PTR?
                     34.13.252.140.in-addr.arpa. (4)
2   0.332288(0.3323) 140.252.1.54.53 > 140.252.1.29.1610: 1* 1/0/0 PTR
                     srv4.tuc.noao.edu. (75)

ホスト名のspoofing (なりすまし)

サーバに TCP または UDP のIPパケットが到着したときに、利用可能なのは 相手のIPアドレスとポート番号の情報である。 セキュリティ上、ホストのなりすましを防ぐためには、 パケット中のIPアドレスを使ってname serverにホスト名を問い合わせ (PTR要求を出す)、(PTR応答で)返ってきたホスト名からnameserverに IPアドレスを問い合わせ、得られるIPアドレス群のどれかが、 元のパケットのIPアドレスと一致することを確認すべきである。

リソース・レコード

nslookupでmxフィールドを引いてみる
% nslookup
> set q=mx
> mit.edu.
Server:  dnss161.tsuda.ac.jp
Address:  133.99.161.3
mit.edu preference = 100, mail exchanger = PACIFIC-CARRIER-ANNEX.mit.edu
mit.edu preference = 100, mail exchanger = SOUTH-STATION-ANNEX.mit.edu
mit.edu nameserver = W20NS.mit.edu
mit.edu nameserver = BITSY.mit.edu
mit.edu nameserver = STRAWB.mit.edu
PACIFIC-CARRIER-ANNEX.mit.edu   internet address = 18.69.0.28
SOUTH-STATION-ANNEX.mit.edu     internet address = 18.72.1.2
W20NS.mit.edu   internet address = 18.70.0.160
BITSY.mit.edu   internet address = 18.72.0.3
STRAWB.mit.edu  internet address = 18.71.0.151

preference 値が小さい宛先に送ろうと試みる。
  • NS --- name server レコード。 ドメインの権威あるネームサーバを指定する。

    キャッシング

    トラフィックを減らすために、キャッシュが利用される。
    sun:/etc/resolv.conf
    domain.tuc.noao.edu
    
    
    nameserverの記述がないため、localhostのname server を利用することになる。
    ftp.uu.netをgethostbyname()した時のtcpdumpの出力
    1    0.0               140.252.1.29.1788 > 192.112.36.4.53:
                           2 A? ftp.uu.net. (28)
    2    0.559285 (0.5593) 192.112.36.4.53 > 140.252.1.29.1788:
                           2- 0/5/5 (229)
    3    0.564449 (0.0052) 140.252.1.29.1789 > 137.39.1.3.53:
                           3+ a? ftp.uu.net. (28)
    4    1.009476 (0.4450) 137.39.1.3.53 > 140.252.1.29.1789:
                           3* 1/0/0 A 192.48.96.9 (44)
    
    sun.tuc.noao.edu 140.252.1.29
    NS.NIC.DDN.MIL   192.112.36.4
    ns.UU.NET 137.39.1.3
    ftp.UU.NET 192.48.96.9
    
    1. 最初のパケットに関して、 root name server に問い合わせるときは、再帰要求フラグは指定してはいけない (2+ではなくて 2と表示されているので指定していない)。
    2. 2番目のパケットでは、 回答RRが0、権威RRが5、追加情報RRが5あることが示されている。 これは uu.net. では、5台の権威あるname serverがあるためである。
    3. 3番目のパケットでは、uu.netドメインの権威ある name server に 再帰要求フラグを指定して問い合わせを行なっている。
    4. 4番目のパケットでは、ftp.uu.net のIPアドレスが回答されている。
    ftp.uu.net のIPアドレスが 192.48.96.9 であることは、localhost の name serverで記憶され、再び問い合わせがあったときは、キャッシュの 中の情報から答を返す。

    TCPとUDP

    通常、nameserverへの問い合わせや応答は、UDPポートの53番が使われる。 不完全な応答が返ってきたとき(TCビットが設定されている)には、 TCPの53番を用いて問い合わせを再び送る。

    また、primary name server から secondary name server へのデータの 移動では、データが大きくなるので tcp が用いられる。


    その他の例

    他のドメインのrloginサーバにrlogin した場合の DNSパケットの例(Fig.14.16)。