Chapter 02

DNSの全体像を把握しよう(名称編)

koyamaso
koyamaso
2021.06.22に更新
このチャプターの目次

DNS(Domain Name System)とは、ホスト情報の分散型データベースです。

ドメイン名空間はUnixファイルシステムのように木構造になっており、ルートは空文字列""です。

ドメイン名は.で区切られ、区切られた文字列がノード(頂点)を表します。

ドメイン名.はルートを表します(.の右に空文字列が存在すると考えればよいです)

Unixファイルシステムでは /etcのように/から始まるパスを絶対パスと呼びます。

これと同じように、.で終わるドメイン名をFQDNと呼びます。

そのノードを根とする部分木のことをドメインと呼びます。

たとえば、comドメインから見たとき、google.com.

  • google
  • google.com.
    と表せます。
    google.comgoogle.com.com.になってしまうことに注意してください。

ネームサーバは、あるゾーンに対して完全な情報を格納しています。

このとき、ネームサーバはゾーンに関する権威を持っているといいます。

ルートについて権威を持っているネームサーバのことをルートサーバと呼びます。

12の独立した組織が13のルートサーバを管理しています。 https://root-servers.org/

また、ネームサーバは自身が権威を持つゾーンの一部(サブドメイン)を他のネームサーバに委任することが出来ます。これは委任するサブドメインのゾーンを切り離し、そのゾーンの権威を移譲しているとも言えます。

digコマンドを使って確認してみましょう

$ dig google.com +trace
; <<>> DiG 9.16.12 <<>> google.com +trace
;; global options: +cmd
.                       53537   IN      NS      m.root-servers.net.
.                       53537   IN      NS      b.root-servers.net.
.                       53537   IN      NS      c.root-servers.net.
.                       53537   IN      NS      d.root-servers.net.
.                       53537   IN      NS      e.root-servers.net.
.                       53537   IN      NS      f.root-servers.net.
.                       53537   IN      NS      g.root-servers.net.
.                       53537   IN      NS      h.root-servers.net.
.                       53537   IN      NS      i.root-servers.net.
.                       53537   IN      NS      a.root-servers.net.
.                       53537   IN      NS      j.root-servers.net.
.                       53537   IN      NS      k.root-servers.net.
.                       53537   IN      NS      l.root-servers.net.
;; Received 239 bytes from 127.0.0.53#53(127.0.0.53) in 13 ms
com.                    172800  IN      NS      k.gtld-servers.net.
com.                    172800  IN      NS      j.gtld-servers.net.
com.                    172800  IN      NS      m.gtld-servers.net.
com.                    172800  IN      NS      e.gtld-servers.net.
com.                    172800  IN      NS      h.gtld-servers.net.
com.                    172800  IN      NS      f.gtld-servers.net.
com.                    172800  IN      NS      c.gtld-servers.net.
com.                    172800  IN      NS      a.gtld-servers.net.
com.                    172800  IN      NS      l.gtld-servers.net.
com.                    172800  IN      NS      g.gtld-servers.net.
com.                    172800  IN      NS      b.gtld-servers.net.
com.                    172800  IN      NS      i.gtld-servers.net.
com.                    172800  IN      NS      d.gtld-servers.net.
;; Received 1198 bytes from 192.33.4.12#53(c.root-servers.net) in 13 ms
google.com.             172800  IN      NS      ns2.google.com.
google.com.             172800  IN      NS      ns1.google.com.
google.com.             172800  IN      NS      ns3.google.com.
google.com.             172800  IN      NS      ns4.google.com.
;; Received 836 bytes from 192.5.6.30#53(a.gtld-servers.net) in 203 ms
google.com.             300     IN      A       172.217.24.142
;; Received 55 bytes from 216.239.38.10#53(ns4.google.com) in 129 ms

この1行で表されたデータを資源レコード(Resource Record,RR)と呼びます。

NSは資源レコードのタイプの1つです。

詳細はRFC1035 3.2.2. TYPE valuesで確認できます。

この資源レコードは「ゾーン.に対する権威を持つネームサーバの1つがm.root-servers.net.」であることを表します。

.                       53537   IN      NS      m.root-servers.net.

また、ルートサーバが[a-m].gtld-servers.net.comゾーンを委任していることが分かります。

com.                    172800  IN      NS      k.gtld-servers.net.

同様にして、[a-m].gtld-servers.net.ns[1-4].google.com.google.comゾーンを委任していることも分かります。

google.com.             172800  IN      NS      ns2.google.com.

最後に、Aレコードがns4.google.comから返されています。

この例では、「google.com.のIPv4アドレスの1つが172.217.24.142」であることを表します。

google.com.             300     IN      A       172.217.24.142

グルーレコード(glue record)

https://jprs.jp/glossary/index.php?ID=0185 より引用すると

権威サーバー(権威DNSサーバー)が、委任先のネームサーバーの名前を応答する際に追加する情報です。具体的には、ネームサーバーの名前に対応するIPアドレスです。
グルーレコードは、ネームサーバーの名前が委任先のドメイン名で管理されている場合にのみ必要になります。グルーレコードを追加することで、名前解決におけるループの発生を防ぎます(図1、図2)。
グルーレコードは委任情報の一部であり、権威を持たないという点に注意してください。

「ネームサーバーの名前が委任先のドメイン名で管理されている場合」を説明します。

先程の例では、google.comゾーンをns[1-4].google.com.に委任していることが当てはまります。

google.comゾーンについて名前解決するにはns[1-4].google.com.に問い合わせる必要がある、しかしns[1-4].google.com.google.comゾーンにある、とループを形成していることが分かります。

グルーレコードを確認してみましょう

ADDITIONAL SECTION:以下の資源レコードがグルーレコードです。

$dig @a.gtld-servers.net. google.com +norec
; <<>> DiG 9.16.12 <<>> @a.gtld-servers.net. google.com +norec
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27812
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 4, ADDITIONAL: 9

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;google.com.                    IN      A

;; AUTHORITY SECTION:
google.com.             172800  IN      NS      ns2.google.com.
google.com.             172800  IN      NS      ns1.google.com.
google.com.             172800  IN      NS      ns3.google.com.
google.com.             172800  IN      NS      ns4.google.com.

;; ADDITIONAL SECTION:
ns2.google.com.         172800  IN      AAAA    2001:4860:4802:34::a
ns2.google.com.         172800  IN      A       216.239.34.10
ns1.google.com.         172800  IN      AAAA    2001:4860:4802:32::a
ns1.google.com.         172800  IN      A       216.239.32.10
ns3.google.com.         172800  IN      AAAA    2001:4860:4802:36::a
ns3.google.com.         172800  IN      A       216.239.36.10
ns4.google.com.         172800  IN      AAAA    2001:4860:4802:38::a
ns4.google.com.         172800  IN      A       216.239.38.10

;; Query time: 76 msec
;; SERVER: 192.5.6.30#53(192.5.6.30)
;; WHEN: Wed Apr 07 13:24:35 JST 2021
;; MSG SIZE  rcvd: 287