DNS(Domain Name System)とは、ホスト情報の分散型データベースです。
ドメイン名空間はUnixファイルシステムのように木構造になっており、ルートは空文字列""です。
ドメイン名は.
で区切られ、区切られた文字列がノード(頂点)を表します。
ドメイン名.
はルートを表します(.
の右に空文字列が存在すると考えればよいです)
Unixファイルシステムでは /etc
のように/
から始まるパスを絶対パスと呼びます。
これと同じように、.
で終わるドメイン名をFQDNと呼びます。
そのノードを根とする部分木のことをドメインと呼びます。
たとえば、com
ドメインから見たとき、google.com.
は
google
-
google.com.
と表せます。
google.com
はgoogle.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