digでDNSを掘る
目標
digでレコードタイプ別の問い合わせを行い、TTLとネガティブキャッシュを読み、getentとdigの答えが分かれるポイントを自分で作ってみます。
なぜ重要なのか
digの出力は、statusとflagsから読む必要があります。NXDOMAIN(名前自体がない)とNOERROR + ANSWER 0(名前はあるが、そのタイプだけがない)はまったく別の状況で、対応も違います。aaフラグがなければキャッシュから来た応答で、そのためTTLが減っていきます。そしてdigは/etc/hostsを見ないので、同じ名前に対してgetentと異なる答えを返すことがあります。その違いこそが、原因の場所です。
ステップ
/root/dnsディレクトリを作成し、/etc/resolv.confからnameserverで始まる行だけを/root/dns/nameserver.txtに保存してください。example.comのAレコードの値だけを/root/dns/a.txtに保存してください。ファイルには、IPv4アドレスが少なくとも1行必要です。google.comのMX、NS、TXTをそれぞれ/root/dns/mx.txt、/root/dns/ns.txt、/root/dns/txt.txtに保存してください。3つのファイルのどれも、空であってはいけません。example.comの回答セクションだけを出力して/root/dns/ttl1.txtに保存し、5秒以上待ってから同じ方法で/root/dns/ttl2.txtを作ってください。2回目のTTLが1回目より大きくてはいけません。8.8.8.8の逆引きの結果を/root/dns/ptr.txtに保存してください。labhub-does-not-exist-9137.example.comを問い合わせ、出力全体を/root/dns/nxdomain.txtに保存してください。ファイルにstatus: NXDOMAINとSOAレコードの両方が入っている必要があります。/etc/hostsに10.77.0.1 www.example.comを追加したあと、getent hosts www.example.comの結果を/root/dns/getent-www.txtに、dig +short www.example.comの結果を/root/dns/dig-www.txtに保存してください。2つの結果は互いに異なっている必要があります。/root/dns/report.txtを次の5行で作成してください。NAMESERVERS=<1번 파일의 줄 수>/A_COUNT=<2번 파일의 줄 수>/PTR=<5번에서 얻은 이름, 끝의 점 제외>/HOSTS_WINS=<7번 getent 결과의 IP>/DNS_SAYS=<7번 dig 결과의 첫 번째 IP>(プレースホルダーは順に、ステップ1のファイルの行数、ステップ2のファイルの行数、ステップ5で得た名前から末尾のドットを除いたもの、ステップ7のgetentの結果のIP、ステップ7のdigの結果の最初のIPです)
参考
dig +short、dig +noall +answer、dig -x <IP>、dig -t MX <이름>を組み合わせると、このラボの大半は終わります(プレースホルダーは名前です)。- ステップ4で、TTLは
+noall +answerの出力の2列目です。 - ステップ6で、SOAはAUTHORITYセクションに出ます。
+noall +authorityで別に見ることもできます。 - よくある間違い1: ステップ7で、hostsに入れたIPが実際のDNS応答と同じだと、このステップの意味がありません。プライベートアドレス帯のアドレスを使ってください。
- よくある間違い2:
digの結果が空なら、そのタイプのレコードがないということです。statusを確認して、NXDOMAINなのかNOERRORなのかを区別してください。
リゾルバー設定を読む
/root/dnsディレクトリを作成し、/etc/resolv.confからnameserverで始まる行だけを/root/dns/nameserver.txtに保存してください。
resolv.confからnameserverで始まる行だけが必要です。複数ある場合があります。
正引き
example.comのAレコードの値だけを/root/dns/a.txtに保存してください。ファイルには、IPv4アドレスが少なくとも1行必要です。
値だけが必要なら、短い出力オプションがあります。Aレコードは、IPv4アドレスの形式になります。
レコードタイプ別の問い合わせ
google.comのMX、NS、TXTをそれぞれ/root/dns/mx.txt、/root/dns/ns.txt、/root/dns/txt.txtに保存してください。3つのファイルのどれも、空であってはいけません。
digは-tでタイプを指定するか、名前の後ろにタイプをそのまま付けてもかまいません。MXの値は、優先度の数字とホスト名のペアです。
TTLが減っていくのを観察する
example.comの回答セクションだけを出力して/root/dns/ttl1.txtに保存し、5秒以上待ってから同じ方法で/root/dns/ttl2.txtを作ってください。2回目のTTLが1回目より大きくてはいけません。
answerセクションだけを出力すると、TTLは2列目に出ます。同じ問い合わせを、少し間隔を置いて2回行ってください。
逆引き
8.8.8.8の逆引きの結果を/root/dns/ptr.txtに保存してください。
digには、IPを渡すとPTRを探してくれる専用のオプションがあります。結果は、ドットで終わる名前です。
存在しない名前とネガティブキャッシュ
labhub-does-not-exist-9137.example.comを問い合わせ、出力全体を/root/dns/nxdomain.txtに保存してください。ファイルにstatus: NXDOMAINとSOAレコードの両方が入っている必要があります。
statusはヘッダー行にあります。SOAはAUTHORITYセクションに出て、最後の数字がMINIMUMです。
getentとdigで答えが分かれるポイント
/etc/hostsに10.77.0.1 www.example.comを追加したあと、getent hosts www.example.comの結果を/root/dns/getent-www.txtに、dig +short www.example.comの結果を/root/dns/dig-www.txtに保存してください。2つの結果は互いに異なっている必要があります。
hostsに入れたIPとDNSが返すIPが違ってこそ、このステップの意味があります。2つの結果をそれぞれ保存してください。
落とし穴が1つあります。getent hosts <이름>はIPv6で先に問い合わせ、その答えがないときだけIPv4で聞き直します(プレースホルダーは名前です)。ところが、hostsに入れる行はIPv4の1つだけなので、その名前にAAAAレコードがあると、v6の問い合わせがhostsを素通りしてDNSに出ていき、IPv6アドレスが先に出ます。hostsが無視されたように見えますが、そうではありません。getent ahostsv4 <이름>でv4系だけを問い合わせれば、hostsの値がそのまま出ます(プレースホルダーは名前です)。このステップでは、そちらを使ってください。
問い合わせの総合レポート
/root/dns/report.txtを次の5行で作成してください。
NAMESERVERS=<1번 파일의 줄 수> / A_COUNT=<2번 파일의 줄 수> / PTR=<5번에서 얻은 이름, 끝의 점 제외> / HOSTS_WINS=<7번 getent 결과의 IP> / DNS_SAYS=<7번 dig 결과의 첫 번째 IP>(プレースホルダーは順に、ステップ1のファイルの行数、ステップ2のファイルの行数、ステップ5で得た名前から末尾のドットを除いたもの、ステップ7のgetentの結果のIP、ステップ7のdigの結果の最初のIPです)
前のステップの結果をキー=値としてまとめれば十分です。個数を数える項目は、行数で数えれば十分です。