DNSについてのメモ。普段扱わない分野なので定期的にメモらんと死んでしまうのです。
DNSの概要
TCP/IPでの通信ではホストを識別するためにIPアドレスが用いられます。しかしIPアドレスは数字の羅列であったり、IPv6はもっと複雑な英数字とコロンの羅列であったりします。これでは人間様には都合が悪いため、ホストにわかりやすい名前をつけようということになりました。そのためにIPアドレスとホスト名を相互変換するシステム「DNS (Domain Name System)」が誕生しました。
DNSサーバの役割はIPアドレスとホスト名の相互変換です。この変換の処理のことを名前解決と呼びます。
ホスト名
からIPアドレス
を求めることを正引き
IPアドレス
からホスト名
を求めることを逆引き
といいます。
例えば、ウェブブラウザでネットサーフィンをしてる時などはブラウザのバックグラウンドで正引きが行われています。
ドメインの階層構造
ドメイン名は以下のような階層構造を成しています。
- . ルートドメイン
- ccTLD: Country Code Top Level Domain
- jp
- ac
- kyoto-u
- or
- aikikai
- ne
- co
- ac
- de
- fr
- kr
- cn
- jp
- gTLD: Generic Top Level Domain
- org
- kernel
- com
- youjo
- asia
- tokyo
- biz
- net
- org
- ccTLD: Country Code Top Level Domain
URLを直訳するとこのようになります。http://www.kyoto-u.ac.jpであれば
wwwホスト、kyoto-u、教育関係ドメイン、日本(、地球 = . 省略可能)
ドメインの左のwwwやftpはホスト名で、そのドメインに属するホストを識別する固有名です。www.example.comのようなホスト名とドメイン名がセットになったものをFQDN(完全修飾ドメイン名)といいます。
名前解決のプロセス
www.example.comにブラウザでアクセスした際の名前解決のプロセスを簡単に書いてみます。
- Webブラウザでwww.example.comにアクセス
- ブラウザがリゾルバに名前解決を依頼する
- リゾルバが/etc/resolv.conf「nameserver 192.168.1.1」の設定に従って192.168.1.1に名前解決を試みる
- 192.168.1.1がルートDNSサーバに問い合わせる
- ルートサーバはcomのDNSサーバのアドレスを返す
- comのDNSサーバに「example」を問い合わせるとexample.comのDNSサーバのIPアドレスを返す
- example.comのサーバに「www」を問い合わせるとwww.example.comのIPアドレスを返す
- 192.168.1.1はそのIPをキャッシュしリゾルバに返答する
- リゾルバがブラウザにwww.example.comのIPアドレスを知らせ、ブラウザはwww.example.comにアクセスする。
192.168.1.1はルートDNSサーバ以外のレコードを持たず代理で問い合わせるキャッシュサーバの役割を果たします。一方、途中のDNSサーバは自分の管轄(ゾーン)の範囲内で情報を他のDNSサーバに返答するゾーンサーバの役目を果たしています。
以上のようなDNS問い合わせを受けたDNSサーバがゾーンの権威がない場合に他のDNSサーバに問い合わせをすることを再帰的な問い合わせといいます。通常は、自分のドメインからの問い合わせにのみ応答するように設定します。
DNSクライアント
DNSサーバと対話できるツールにはdig,nslookup,hostがあります。
dig
トラブルシューティングにも大活躍。高性能なDNSクライアントコマンドです。
- 書式:
- dig [@DNSサーバ] ドメイン名/IPアドレス [クエリタイプ]
- オプション:
- -x 逆引きを行う
- -p 問い合わせるポート番号を指定する
- クエリタイプ:
- a 正引き
- ptr 逆引き
- ns DNSサーバ
- mx メールサーバ
- soa SOAレコードを取得
- hinfo サーバ情報を取得
- axfr ゾーン転送
- txt テキスト情報を取得
- any あらゆる情報を取得
- 例:
- $ dig @216.239.32.10 google.com any
; <<>> DiG 9.9.5-3ubuntu0.1-Ubuntu <<>> @216.239.32.10 google.com any ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8454 ;; flags: qr aa rd; QUERY: 1, ANSWER: 14, AUTHORITY: 0, ADDITIONAL: 0 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;google.com. IN ANY ;; ANSWER SECTION: google.com. 300 IN A 216.58.220.238 google.com. 300 IN AAAA 2404:6800:4004:814::200e google.com. 600 IN MX 40 alt3.aspmx.l.google.com. google.com. 86400 IN SOA ns1.google.com. dns-admin.google.com. 2015032501 7200 1800 1209600 300 google.com. 345600 IN NS ns3.google.com. google.com. 345600 IN NS ns4.google.com. google.com. 600 IN MX 30 alt2.aspmx.l.google.com. google.com. 600 IN MX 10 aspmx.l.google.com. google.com. 345600 IN NS ns1.google.com. google.com. 86400 IN TYPE257 \# 19 0005697373756573796D616E7465632E636F6D google.com. 600 IN MX 20 alt1.aspmx.l.google.com. google.com. 600 IN MX 50 alt4.aspmx.l.google.com. google.com. 345600 IN NS ns2.google.com. google.com. 3600 IN TXT "v=spf1 include:_spf.google.com ip4:216.73.93.70/31 ip4:216.73.93.72/31 ~all" ;; Query time: 43 msec ;; SERVER: 216.239.32.10#53(216.239.32.10) ;; WHEN: Mon Mar 30 20:43:49 JST 2015 ;; MSG SIZE rcvd: 417
status:がNOERRORなら正常、DNSサーバが応答しなかった場合はSERVFAIL、ドメインが存在しない場合はNXDOMAINとなります。
flags:には回答の数が表示されます。- qr 問い合わせの回答
- aa 権威ある回答
- rd 再帰検索を希望
- ra 再帰検索が可能
digの回答出力には4つのセクションがあります。
- QUESTION SECTION 問い合わせ内容
- ANSWER SECTION 問い合わせに対する回答
- AUTHORITY SECTION 権威ある回答
- ADDITIONAL SECTION 付属的な情報
nslookup
対話型に問い合わせが出来るのが特徴のDNSクライアントコマンドです。windowsにも実装されています。
- 書式:
- nslookup [オプション] [ホスト名/IPアドレス]
nslookup <ホスト名/IPアドレス> <DNSサーバ> - 例:
- $ nslookup google.com 216.239.32.10
Server: 216.239.32.10 Address: 216.239.32.10#53 Name: google.com Address: 216.58.220.238
- $ nslookup
> set type=a > ns.google.com Server: 10.0.1.254 Address: 10.0.1.254#53 ↓10.0.1.254(キャッシュサーバ)に問い合わせたため権威が無いと表示された Non-authoritative answer: Name: ns.google.com Address: 216.239.32.10 > > ↓ns.google.comに問い合わせるように指定すると権威がないという表示は出ない > server 216.239.32.10 Default server: 216.239.32.10 Address: 216.239.32.10#53 > > > google.com Server: 216.239.32.10 Address: 216.239.32.10#53 Name: google.com Address: 216.58.220.238 >
- $ nslookup
hostコマンド
シンプルな簡易DNSクライアントコマンドです。出力が完結なのでこれはこれで便利です。
- 書式:
- $ host [オプション] ホスト名/IPアドレス [DNSサーバ]
- 例:
- $ host -t any google.com 216.239.32.10
BINDの代替DNSサーバ
DNSサーバといえばBINDですが、その他にもdnsmasqやdjbdnsやPowerDNSなどがあります。これは202で知識として問われるので覚えておきたいところです。
- Dnsmasq
- 軽量で比較的容易に設定できるDNSサーバのフォワーダとDHCPサーバをもつソフトウェア
- djbdns
- 機能を分割してセキュアなサーバですが開発が終了しているためIPv6やDNSSECなどには非対応
- PowerDNS
- バックエンドとしてRDBが使用できるDNSサーバ
- 関連記事
-
-
Nginx 2015/04/09
-
BIND9について 2015/03/30
-
DNSのお話 2015/03/30
-
LPI201合格しました 2014/09/20
-
SYSLINUX, lilo 201 2014/09/19
-