DNSの基礎と dig の使い方を整理します。
名前解決の歴史
元々, ARPANET時代には hostsファイルに IPアドレス ドメイン名 を書いていた。
しかし, ホストが増えると各ホストがhostsファイルの更新時に同期するコストが膨大になるためDNSの仕組みが生まれた。
DNSは分散DBで,必要な時に必要な分(差分)だけ更新することが可能になり効率的になった。
2011年には gTLD(Generic Top Level Domain) の自由化が始まった。
ドメイン名前空間
すべての名前を持つホストが存在する空間。
ドメインは組織 -> 国 -> 世界と小さい範囲から大きい範囲に展開される。一方で, IPアドレスはネットワーク -> サブネットと展開されていく。
重複を回避するためのドメインツリーという仕組みがある。
ドメインツリー
- Fully Qualified Domain Name (FQDN), 最上位層のTLDまで完全に指定されたホスト名のこと。
- ドメインツリーは名前の通り木構造になっている。これにより重複が発生しない。
- ドメインツリーは根(root), 節(node), 葉(leaf)から成る
- 木のルートには名前がない(又はドット)
ルートサーバは世界中に論理上は13台しか存在しない。
ドメインツリーの頂上である根は . (period)である。
グローバルIPアドレス, ドメイン名は米国カリフォルニア州にある国際的な組織であるICANNが管理を行っている。
グローバルIPアドレスは日本の場合はJPNICが管理している。また, ルートの直下のドメインを管理しているのがレジストリである。.jpドメインの管理はJPRSが管理している。
ネームサーバとゾーン
ネームサーバ(DNS Server)は自分の直下のホストと名前のみを管理する。
この管理範囲をゾーンと呼ぶ。従って,自分のゾーン内の情報を管理しているという意味で分散的に権限を持っている, つまりオーソリティを持つという。
外部に繋げたいときは内部ネームサーバを立てる。
レジストリが持つネームサーバにドメインのオーソリティを明示するNSレコードとアドレス情報のAレコードを登録してもらう必要がある。
リソースレコード
ネームサーバが管理しているDBの中身のこと。主要なレコードに以下がある。
- Aレコード : 正引き,ホストのアドレス(ドメイン名に対応するIPアドレス名)
- AAAAレコード : ホストのアドレス(Quad-A record)
- CNAMEレコード : ホストの別名。サーバの切り替え時の並行運用時にも便利
- NSレコード : ドメインのネームサーバ(FQDN)
- MXレコード : ドメインのメール交換ホスト
- SOAレコード : ゾーン転送の制御
- PTRレコード : 逆引き(IPアドレスに対応するドメイン名)
サブドメイン
サブドメインのネームサーバを構築しこのサーバに権限委譲をする。そして、親ドメインのネームサーバにサブドメインのNSレコードを登録する。
DNS問い合わせ
C -> S 方向に Stub Resolver が53番ポートを使ってドメイン名を問い合わせる。
そして,Full-Service Resolverやcontent server が S -> C 方向にリソースレコードを応答する。
通常, 問い合わせるネームサーバを複数持っている。
- preferred name server (優先)
- alternate name servers (代替)
また, 障害対策のためprimary serverのゾーン情報をコピーするためのゾーン転送を行う secondary serverを用意する。
ゾーン転送はSOAレコードのRefleshで指定した間隔で行うが DNS Notify を用いる事でサーバpushのような通知を行える。
正確には, Refleshをゼロに指定にして通常のゾーン転送を行う。通常はコネクションレス型のUDPを使うが, 512Byteを超えるとデータ損失リスクを回避するために,UDPからTCPに切り替える。
DNS Packet
DNS Packetは以下で構成される
IP Header + UDP/TCP Header + DNS Message
DNS Message
DNS Messagesは以下から構成される
- Message Header : 識別IDや質問数を記述する。OperationCodeが重要。opcodeは 0: 正引き, 1:逆引き。
- Question Section : 問い合わせるドメイン名、クラス、タイプを記述する。
- Answer Section : 回答、オーソリティ、追加がある。リソースレコードをそのまま返す。
DNSに対する攻撃
DNSキャッシュポイズニング
Full-Service ResolverのDNSキャッシュを偽のレコードで汚染すること。正しいドメイン名でアクセスしても偽のサーバに誘導されてしまう。
DNSSECでは公開鍵暗号方式と電子署名の仕組みを利用しパケット改ざんや問い合わせたレコードが存在するか否かを検証する。
DNS Amp
Full-Service Resolverに不正なレコードを持たせる。ターゲットに成り済ましてTXTレコードを送りつけサイズの大きい応答をさせる攻撃。
digの基本的な使い方
dig (domain information groper) コマンドの基本的な使い方。
$ dig -version
DiG 9.8.3-P1
ドメイン名のみ指定した場合, Aレコードが表示される。 IN は INTERNET の IN を表す。
$ dig fisproject.net
; <<>> DiG 9.8.3-P1 <<>> fisproject.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52018
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;fisproject.net. IN A
;; ANSWER SECTION:
fisproject.net. 337 IN A 160.16.116.76
;; Query time: 7 msec
;; SERVER: 192.168.10.1#53(192.168.10.1)
;; WHEN: Fri Aug 4 22:41:58 2017
;; MSG SIZE rcvd: 47
+short で IPアドレス のみ表示される。
$ dig fisproject.net +short
160.16.116.76
PTRレコードの表示。つまりIPアドレスからドメイン名を逆引きしたい場合。
($()内 または `` 内は shell の内部展開となるのでIPアドレス 160.16.116.76 を指定したのと同じ)
$ dig -x $(dig fisproject.net +short)
; <<>> DiG 9.8.3-P1 <<>> -x 160.16.116.76
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56822
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;76.116.16.160.in-addr.arpa. IN PTR
;; ANSWER SECTION:
76.116.16.160.in-addr.arpa. 3600 IN PTR fisproject.net.
;; Query time: 20 msec
;; SERVER: 192.168.10.1#53(192.168.10.1)
;; WHEN: Sat Aug 5 10:21:33 2017
;; MSG SIZE rcvd: 7
逆引きの +short でドメイン名のみ表示。
$ dig -x $(dig fisproject.net +short) +short
fisproject.net.
ANY で全てのレコードの表示。
$ dig ANY fisproject.net
; <<>> DiG 9.8.3-P1 <<>> ANY fisproject.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7512
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 3
;; QUESTION SECTION:
;fisproject.net. IN ANY
;; ANSWER SECTION:
fisproject.net. 1200 IN TXT "v=spf1 ip4:160.16.116.76 ~all"
fisproject.net. 1200 IN NS ns1.value-domain.com.
fisproject.net. 1200 IN NS ns2.value-domain.com.
fisproject.net. 2560 IN SOA ns1.value-domain.com. hostmaster.fisproject.net. 1501895467 16384 2048 1048576 2560
fisproject.net. 1200 IN A 160.16.116.76
fisproject.net. 1200 IN MX 10 fisproject.net.
;; ADDITIONAL SECTION:
ns1.value-domain.com. 264 IN A 54.65.150.1
ns2.value-domain.com. 167 IN A 54.64.110.166
fisproject.net. 1200 IN A 160.16.116.76
;; Query time: 21 msec
;; SERVER: 192.168.10.1#53(192.168.10.1)
;; WHEN: Sat Aug 5 10:22:22 2017
;; MSG SIZE rcvd: 252
@ の後にDNSサーバを指定することができる。以下はISP提供のDNSサーバでなく Google Public DNS を指定した場合の例。
$ dig @8.8.8.8 fisproject.net
; <<>> DiG 9.8.3-P1 <<>> @8.8.8.8 fisproject.net
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32627
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;fisproject.net. IN A
;; ANSWER SECTION:
fisproject.net. 1199 IN A 160.16.116.76
;; Query time: 94 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sat Aug 5 10:23:52 2017
;; MSG SIZE rcvd: 47
ルートサーバまでの追跡。上位に表示されているのがルートサーバ。
$ dig fisproject.net +trace
; <<>> DiG 9.8.3-P1 <<>> fisproject.net +trace
;; global options: +cmd
. 243338 IN NS j.root-servers.net.
. 243338 IN NS l.root-servers.net.
. 243338 IN NS b.root-servers.net.
. 243338 IN NS c.root-servers.net.
. 243338 IN NS m.root-servers.net.
. 243338 IN NS i.root-servers.net.
. 243338 IN NS k.root-servers.net.
. 243338 IN NS h.root-servers.net.
. 243338 IN NS f.root-servers.net.
. 243338 IN NS d.root-servers.net.
. 243338 IN NS a.root-servers.net.
. 243338 IN NS g.root-servers.net.
. 243338 IN NS e.root-servers.net.
;; Received 508 bytes from 192.168.10.1#53(192.168.10.1) in 269 ms
jp. 172800 IN NS b.dns.jp.
jp. 172800 IN NS d.dns.jp.
jp. 172800 IN NS f.dns.jp.
jp. 172800 IN NS g.dns.jp.
jp. 172800 IN NS a.dns.jp.
jp. 172800 IN NS c.dns.jp.
jp. 172800 IN NS h.dns.jp.
jp. 172800 IN NS e.dns.jp.
;; Received 487 bytes from 202.12.27.33#53(202.12.27.33) in 173 ms
fisproject.net. 86400 IN NS ns4.value-domain.com.
fisproject.net. 86400 IN NS ns5.value-domain.com.
fisproject.net. 86400 IN NS ns2.value-domain.com.
fisproject.net. 86400 IN NS ns3.value-domain.com.
fisproject.net. 86400 IN NS ns1.value-domain.com.
;; Received 137 bytes from 203.119.1.1#53(203.119.1.1) in 126 ms
fisproject.net. 1200 IN A 160.16.116.76
fisproject.net. 1200 IN NS ns1.value-domain.com.
fisproject.net. 1200 IN NS ns2.value-domain.com.
;; Received 131 bytes from 54.64.110.166#53(54.64.110.166) in 12 ms
fisproject.net のNSレコードのTTLは 86400 とわかる。
$ dig @a.dns.jp fisproject.net ns
; <<>> DiG 9.8.3-P1 <<>> @a.dns.jp fisproject.net ns
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56650
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 5, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;fisproject.net. IN NS
;; AUTHORITY SECTION:
fisproject.net. 86400 IN NS ns1.value-domain.com.
fisproject.net. 86400 IN NS ns5.value-domain.com.
fisproject.net. 86400 IN NS ns3.value-domain.com.
fisproject.net. 86400 IN NS ns2.value-domain.com.
fisproject.net. 86400 IN NS ns4.value-domain.com.
;; Query time: 14 msec
;; SERVER: 203.119.1.1#53(203.119.1.1)
;; WHEN: Fri Aug 4 22:45:18 2017
;; MSG SIZE rcvd: 137