一人にしか開かないページ
DNSの検索は、名前をアドレスに変えます。機器は、まず自分のhostsファイルを調べ、そのあとでDNSサーバーに聞きます。この順番を知っていれば、一台のノートPCでだけ動かない名前の原因を見つけられます。
サポート担当に電話が入ります。店のウェブページが、あるノートPCでは開き、別のPCでは開きません。どちらも同じネットワークにいます。
原因は、二台目のPCにある小さなファイルの、古い一行でした。誰もネットワークに聞かないうちに、その行が名前に答えてしまいます。
今日は、機器がどこを探すのかと、戻ってきた答えの読み方を学びます。
このレッスンのゴール
メモ
digで名前を調べ、どのレコードが答えたかを説明できる。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| リゾルバ | 機器の中で、名前を調べる部分 | |
| hostsファイル | 機器自身が持つ、名前とアドレスの短い一覧 | /etc/hosts |
| CNAME | この名前は別の名前だと伝えるレコード | |
| TTL | 答えを覚えておいてよい秒数 | 300 |
| NXDOMAIN | この名前は存在しないという答え | |
| ゾーン | 一つのDNSサーバーが受け持つ名前の範囲 | shop.test |
学生が入力するセルは、このプレビューでは空白です。
機器は二か所で名前を探す
ネットワークに聞く前に、機器は自分のhostsファイルを読みます。名前がそこにあれば、その答えが勝ちます。そのあとで初めて、リゾルバがDNSサーバーに聞きます。
順番は /etc/nsswitch.conf に書かれています。files がhostsファイルで、dns がサーバーです。
機器が使う順番を読む
grep '^hosts' /etc/nsswitch.confここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
プログラムと同じ方法で名前を調べる
getent hosts localhostここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
DNSサーバーはレコードで答える
DNSサーバーはゾーン、つまり受け持つ名前を持っています。名前ごとにレコードがあり、答えにはTTLが付きます。リゾルバは、その時間だけ答えを覚えておけます。
ここでは、作り話の店のための小さなサーバーを自分で起動します。ポート5300で、この機器の中だけで待ち、shop.test というゾーンを一つ持ちます。
店の練習用サーバーを起動する
sudo dnsmasq --conf-file= --no-hosts --no-resolv --port=5300 --listen-address=127.0.0.1 --bind-interfaces --local-ttl=300 --local=/shop.test/ --host-record=shop.test,10.20.30.40 --host-record=mail.shop.test,10.20.30.50 --cname=www.shop.test,shop.test --mx-host=shop.test,mail.shop.test,10 --txt-record=shop.test,v=demoここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: digで聞く
| 入力 | 聞くこと | 出力 |
|---|---|---|
| dig +short @127.0.0.1 -p 5300 shop.test | Aレコード | 10.20.30.40 |
| dig +noall +answer ... www.shop.test | 名前とそのレコード | CNAMEの行、次にAの行 |
| dig +short ... shop.test MX | メールを受け取る相手 | 10 mail.shop.test. |
| dig +short ... -x 10.20.30.40 | このアドレスの名前 | shop.test. |
学生が入力するセルは、このプレビューでは空白です。
店のアドレスを聞く
dig +short @127.0.0.1 -p 5300 shop.testここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
wwwの名前から鎖をたどる
dig +noall +answer @127.0.0.1 -p 5300 www.shop.testここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
メールの受け取り先を聞く
dig +short @127.0.0.1 -p 5300 shop.test MXここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
アドレスの名前を聞く
dig +short @127.0.0.1 -p 5300 -x 10.20.30.40ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ステータスは何が悪かったかを教える
答えにはステータスが付きます。NOERROR は、サーバーが答えたという意味です。NXDOMAIN は、サーバーが持つゾーンにその名前が無いという意味です。
REFUSED は、サーバーがその名前には一切答えないという意味です。練習用サーバーは shop.test だけを持ち、ほかに聞く相手がいません。
ゾーンに無い名前を聞く
dig @127.0.0.1 -p 5300 nothing.shop.test | grep statusここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
別のゾーンの名前を聞く
dig @127.0.0.1 -p 5300 shop.invalid | grep statusここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
「digとpingは、同じ方法で名前を調べる」と考える人が多いのですが、違います。dig はDNSサーバーにだけ聞きます。pingを含む多くのプログラムは、先にhostsファイルを読みます。名前がブラウザーでは動くのに、dig では何も出ないことがあります。
二つの方法が食い違うのを見る
dig +short @127.0.0.1 -p 5300 localhostここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
本物の検索は、上から順に下りる
インターネットには、すべての名前を知っているサーバーはありません。リゾルバは、ルート、末尾の担当、会社の担当の順に聞きます。
ラボにはインターネットが無いので、この表は読むだけで実行しません。www.shop.example のための質問を示します。
例: www.shop.example を調べる
| 段階 | リゾルバが聞く相手 | 答え |
|---|---|---|
| 1 | ルートサーバー | .example の担当サーバーに聞いてください |
| 2 | .example のサーバー | shop.example の担当サーバーに聞いてください |
| 3 | shop.example のサーバー | www は 203.0.113.20。300秒覚えてよい |
| 4 | 300秒の間は誰にも聞かない | リゾルバは記憶から答える |
学生が入力するセルは、このプレビューでは空白です。
練習用サーバーを止める
sudo pkill -f '[-]-port=5300'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
発展: digのヘッダー
練習用サーバーを起動したまま、dig @127.0.0.1 -p 5300 shop.test をもう一度実行し、ヘッダー全体を読みましょう。
フラグの行と、質問数と答えの数を探します。次に nothing.shop.test を聞いて、数を比べます。どれが変わりましたか。