1. ホーム
  2. サーバー

Ape learning ~最も包括的なDNSの原則の入門書

2022-02-25 17:27:11

DNSは、インターネットの中核となるプロトコルの1つです。インターネットを閲覧するにしても、プログラミングをするにしても、少しは知っておく必要があるのではないでしょうか。

  この記事では、DNSの仕組みと、ツールやソフトウェアを使ってその仕組みを確認する方法について詳しく説明します。この記事を読んだ後、DNSを完全に理解することが私の目標です。

 I. DNSとは何ですか?

  DNS(Domain Name Systemの略)が行うことは非常にシンプルで、ドメイン名に基づいてIPアドレスを検索することです。巨大な電話帳のようなものだと考えてください。

  たとえば、math.stackexchange.comというドメイン名にアクセスしたい場合、まずDNSでそのIPアドレスを151.101.129.69と調べる必要があるのです。

  なぜ、ネットワークで通信するためにIPアドレスを調べる必要があるのか、その理由がわからない方は インターネットプロトコルの基礎知識 .

 II. クエリプロセス

  返されるIPアドレスは1つだけですが、DNSの問い合わせ処理は非常に複雑で、複数のステップに分かれています。

  ツールディグでは、クエリの全プロセスを表示することができます。

<ブロッククオート
$ dig math.stackexchange.com


  上記のコマンドでは、6つの情報が出力されます。

  最初の段落は、クエリパラメータと統計情報です。

  2段落目はクエリーの内容です。

  上記の結果は、ドメイン math.stackexchange.com の A レコードに対するクエリを表しています(A は address の略)。

  3番目の段落は、DNSサーバーからの応答です。

  上記の結果から、math.stackexchange.comは4つのAレコード、つまり4つのIPアドレスを持っていることがわかります。600はTTL値(Time to liveの略)で、キャッシュタイム、つまり600秒間は再クエリしないことを表しています。

  第4段落は、stackexchange.com の NS レコード(ネームサーバーの略)、つまり stackexchange.com の DNS レコードの管理を担当するサーバーを表しています。

  上記の結果から、stackexchange.comには4つのNSレコード、つまり4つのネームサーバーがあり、そのどれかに問い合わせると、math.stackexchange.comのIPアドレスがわかることがわかります。

  5番目のセグメントは、上記の4つのネームサーバーのIPアドレスで、前のセグメントと一緒に返されます。

  第6パラグラフは、DNSサーバーからの転送情報の一部です。

  上記の結果から、ローカルDNSサーバーは192.168.1.253、クエリーポートは53(DNSサーバーのデフォルトポート)、レスポンス長は305バイトであることがわかります。

  そこまで表示したくない場合は、+shortパラメータを使用することができます。

<ブロッククオート
$ dig +short math.stackexchange.com

151.101.129.69
151.101.65.69
151.101.193.69
151.101.1.69


  上記のコマンドは、math.stackexchange.comに対応する4つのIPアドレス(つまり、Aレコード)だけを返します。

 III. DNS サーバー

  ここでは、この前の例に基づいて、ローカルマシンがドメイン math.stackexchange.com の IP アドレスを取得する方法を、段階的に正確に復元しています。

  まず、ローカルマシンはDNSサーバーのIPアドレスを知っていなければ、インターネットに接続することができません。DNSサーバーは、ドメイン名のIPアドレスを正確に知るための唯一の方法です。

  DNSサーバーのIPアドレスは、DHCPの仕組みと呼ばれる、オンラインになるたびにゲートウェイから割り当てられる動的なものと、あらかじめ割り当てられた固定アドレスがあります。Linux内部では、DNSサーバーのIPアドレスは、/etc/resolv.confファイルに格納されています。

  上記の例のDNSサーバーは192.168.1.253で、これはイントラネットのアドレスです。使用できるパブリックDNSサーバーもあり、最も有名なのはGoogleの 8.8.8.8 とレベル3の 4.2.2.2 .

  ローカルマシンは自分のDNSサーバーにしか問い合わせをしませんが、digコマンドには@パラメータがあり、他のDNSサーバーへの問い合わせ結果を表示します。

<ブロッククオート
$ dig @4.2.2.2 math.stackexchange.com


  上記のコマンドは、DNSサーバー4.2.2.2へのクエリを指定します。

 IV. ドメイン名の階層構造

  DNSサーバーは、どのようにして各ドメイン名のIPアドレスを知ることができるのでしょうか。その答えは、階層的なルックアップです。

  先ほどの例をよく見てください。各ドメイン名の末尾にドットが追加されています。

  例えば、ドメイン名 math.stackexchange.com は math.stackexchange.com と表示されます。これは見落としではなく、実はすべてのドメインには末尾にルートドメインがあります。

  例として、www.example.com真正的域名是www.example.com.root は、www.example.com と省略される。ルートドメイン.rootはすべてのドメインで同じなので、通常は省略されます。

  ルートドメインの次のレベルをquot;トップレベルドメイン"(TLDと略す)と呼び、例えば.com、.net、その次のレベルをquot;セカンドレベルドメイン"(SLDと略す)と呼び、例えばwww.example.com inside .NET、quot;トップレベルドメインの次のレベルをSLDと略す)と呼びます。 このレベルのドメイン名はユーザーが登録可能です。次のレベルはホスト名(host)で、例えばwww.example.com里面的www。また、"第3レベルドメイン"とも呼ばれ、これはユーザー自身のドメイン内のサーバーに割り当てられる名前で、ユーザーが自由に割り当てることが可能です。

  要約すると、ドメイン名の階層構造は次のようになります。

<ブロッククオート
Hostname. Secondary domain name. Top-level domain. Root domain name

# i.e.

host.sld.tld.root


 V. ルートネームサーバー

  DNSサーバーは、ドメイン名の階層構造に基づいて階層的な検索を実行します。

  明確には、各レベルのドメイン名には独自のNSレコードがあり、そのNSレコードはそのレベルのドメイン名のドメインネームサーバーを指しています。これらのサーバーは、次のレベルのドメイン名のためのさまざまなレコードを認識しています。

  いわゆる"階層クエリ"は、ルートドメイン名から始めて、最終的なIPアドレスにたどり着くまで、各レベルのドメインのNSレコードを順番に問い合わせることですが、そのプロセスはおおよそ次のようになります。

<ブロッククオート
  1. ルートネームサーバーからトップレベルネームサーバーまでのNSレコードとAレコード(IPアドレス)を確認します。
  2. トップレベルドメインネームサーバーからセカンダリードメインネームサーバーへのNSレコードとAレコード(IPアドレス)です。
  3. ホスト名"のIPアドレスを"セカンダリネームサーバー"から調べる。

  上記のプロセスをよく見てみると、DNSサーバーが「ルートネームサーバー」のIPアドレスをどのように知っているのかについて言及されていないことにお気づきでしょうか。答えは、quot;ルートネームサーバー"のNSレコードとIPアドレスは一般に変更されないので、DNSサーバーに組み込まれています。

  以下は、組み込みのルートDNSサーバーのIPアドレスで .

  上のリストには、ルートドメイン(.root)の3つのNSレコード、A.ROOT-SERVERS.NET、B.ROOT-SERVERS.NET、C.ROOT-SERVERS.NETと、それらのIPアドレス(つまりAレコード)198.41.0.4、192.228.79.201、192.33 . 4.12. がリストアップされています。

  また、すべてのレコードのTTL値が3600000秒であり、1000時間に相当することがわかります。つまり、ルート・ネーム・サーバーのリストは1000時間に一度しか照会されないということです。

  現在、世界にはA.ROOT-SERVERS.NETからM.ROOT-SERVERS.NETまで13グループのルートネームサーバーが存在する。

 VI. 階層型クエリの例

  digコマンドの+traceパラメータは、DNSの階層的なクエリプロセス全体を表示します。

<ブロッククオート
$ dig +trace math.stackexchange.com


  上記のコマンドの最初の段落は、ルートドメインのすべてのNSレコードを一覧表示します。ルートドメインのすべてのNSレコード、つまりすべてのルートネームサーバーです。

  組み込みのルート DNS サーバー IP アドレスに基づいて、DNS サーバーはこれらの IP アドレスすべてに、math.stackexchange.com のトップレベル DNS サーバー com の NS レコードを求めるクエリー要求を送信します。最初に返信したルートDNSサーバーはキャッシュされ、このサーバーへのリクエストのみが後で送信されます。

  続いて第2段落。

  上記の結果、.comドメインの13のNSレコードと、返された各レコードに対応するIPアドレスが表示されます。

  次にDNSサーバーは、これらのトップレベルのネームサーバーに、math.stackexchange.comのサブドメインであるstackexchange.comのNSレコードを求めるクエリリクエストを送信します。

  上記の結果、stackexchange.comには4つのNSレコードがあり、各NSレコードに対応するIPアドレスも返されます。

  次にDNSサーバーは、上記の4つのNSサーバーに、math.stackexchange.comのホスト名を問い合わせます。

  上記の結果から、math.stackexchange.com には 4 つの A レコードがあり、4 つの IP アドレスすべてがサイトにアクセスできることがわかります。また、結果を返した最初のNSサーバーはns-463.awsdns-57.comで、IPアドレスは205.251.193.207であることも示しています。

 VII. NSレコードのクエリ

  digコマンドを使用すると、ドメイン名の各レベルのNSレコードを個別に表示することができます。

<ブロッククオート
$ dig ns com
$ dig ns stackexchange.com


  shortパラメータは、結果を簡略化して表示します。

$ dig +short ns com
$ dig +short ns stackexchange.com


 VIII. DNSレコードタイプ

  ドメイン名とIPの対応をquot;record"(レコード)と呼びます。利用シーンに応じて、"record"は様々なタイプ(型)に分けられ、先に見たようにAレコードとNSレコードがある。

  一般的なDNSレコードの種類は、以下の通りです。

(1) A: ドメイン名が指すIPアドレスを返すアドレスレコード。

(2) NS: Name Server レコード、次レベルのドメイン名情報を保持するサーバーのアドレスを返す。このレコードはドメイン名のみに設定でき、IPアドレスには設定できません。

(3) MX: メールレコード(Mail eXchange)、電子メールを受信するサーバーのアドレスを返します。

(4) CNAME: Canonical Nameレコード(正規名)、別のドメイン名を返す、つまり、現在のクエリは別のドメイン名へのジャンプである、詳しくは以下を参照。

(5) PTR: Reverse Query Record (Pointer Record)、IPアドレスからドメイン名を問い合わせる場合のみ使用、詳しくは下記を参照。

  一般的に、サービスの安全性とセキュリティのためにNSレコードは少なくとも2つあるべきで、AレコードとMXレコードは複数あってもよく、これによりサービスに冗長性を持たせ、単一障害点を防ぐことができます。

  CNAMEレコードは、主にドメイン名の内部ホップに使用され、ユーザーには感知されないサーバー構成の柔軟性を提供します。例えば、ドメイン名facebook.github.ioは、CNAMEレコードです。

<ブロッククオート
$ dig facebook.github.io

...

;; ANSWER SECTION:
facebook.github.io. 3370 IN CNAME github.map.fastly.net.
github.map.fastly.net. 600 IN A 103.245.222.133


  上記の結果から、facebook.github.ioのCNAMEレコードはgithub.map.fastly.netを指しており、ユーザーがfacebook.github.ioに問い合わせると、実際にはgithub.map.fastly.netのIPアドレスが返ってきていることがわかります。この利点は、サーバーのIPアドレスを変更しても、ドメイン名github.map.fastly.netを変更するだけでよく、ユーザーのfacebook.github.ioドメイン名を変更する必要がないことです。

  CNAMEレコードは置換であるため、一度ドメイン名にCNAMEレコードを設定すると、他のレコード(AレコードやMXレコードなど)を設定することができませんが、これは競合を防止するためのものです。例えば、foo.comはbar.comを指しており、2つのドメインはそれぞれ独自のMXレコードを持っていますが、これが一致しないと問題が発生する可能性があります。トップレベルドメインは通常MXレコードを設定しなければならないので、一般にユーザーはトップレベルドメインにCNAMEレコードを設定することはできません。

  PTRレコードは、IPアドレスからドメイン名をバックトラックするために使用されます。digコマンドの-xパラメータは、PTRレコードを照会するために使用されます。

<ブロッククオート
$ dig -x 192.30.252.153

...

;; ANSWER SECTION:
153.252.30.192.in-addr.arpa. 3600 IN PTR pages.github.com.


  上記の結果から、192.30.252.153のサーバーはpages.github.comというドメイン名を持っていることがわかります。

  逆引きの用途の1つは、スパムを防ぐことです。つまり、メールを送信したIPアドレスが、実際にそのドメイン名を持っていると主張することを確認することです。

  digコマンドは、指定されたレコードタイプを表示することができます。

<ブロッククオート
$ dig a github.com
$ dig ns github.com
$ dig mx github.com


 IX. その他のDNSツール

  digのほかにも、さまざまなガジェットがあります。

  (1)ホストコマンド

  hostコマンドは、digコマンドの簡略版と見ることができ、現在要求されているドメイン名に関するさまざまなレコードを返します。

<ブロッククオート
$ host github.com

github.com has address 192.30.252.121
github.com mail is handled by 5 ALT2.ASPMX.L.GOOGLE.COM.
github.com mail is handled by 10 ALT4.ASPMX.L.GOOGLE.COM.
github.com mail is handled by 10 ALT3.ASPMX.L.GOOGLE.COM.
github.com mail is handled by 5 ALT1.ASPMX.L.GOOGLE.COM.
github.com mail is handled by 1 ASPMX.

$ host facebook.github.com

facebook.github.com is an alias for github.map.fastly.net.
github.map.fastly.net has address 103.245.222.133


  hostコマンドは、逆引きにも使えます。つまり、IPアドレスからドメイン名を調べるには、dig -x <ip> と同じです。

<ブロッククオート
$ host 192.30.252.153

153.252.30.192.in-addr.arpa domain name pointer pages.github.com.


  (2) nslookupコマンド

  nslookupコマンドは、ドメインレコードを対話的に照会するために使用される。

<ブロッククオート
$ nslookup

> facebook.github.io
Server: 192.168.1.253
Address: 192.168.1.253#53

Non-authoritative answer:
facebook.github.io canonical name = github.map.fastly.net.
Name: github.map.fastly.net
Address: 103.245.222.133

> 


  (3) whoisコマンド

  whoisコマンドは、ドメイン名の登録状況を確認するために使用します。

<ブロッククオート
$ whois github.com


 X. 参考リンク

QQ公開番号[Hacker Alliance]をフォローして、より多くのハッキングテクニックを学びましょう