
注意深い読者は、この図でIPv6を見つけます。
人々はしばしばドメインに困惑しています。 サイトが機能しないのはなぜですか? なぜこのがらくたが壊れているのか、何も役に立たない、私はそれが機能したいだけです! 通常、質問者はDNSを知らないか、基本的なアイデアを理解しません。 多くの人にとって、DNSは恐ろしく、理解できないものです。 この記事は、そのような恐れを払拭する試みです。 DNSは、いくつかの基本的な概念を理解していれば簡単です。
DNSとは
DNSはDomain Name Systemの略です。 これは、キーと値のグローバル分散リポジトリです。 世界中のサーバーがキー値を提供できます。キーを知らない場合は、別のサーバーに助けを求めます。
以上です。 真実は。 ユーザーまたはブラウザがキーwww.example.com値を要求し、応答で1.2.3.4を受け取ります。
基本的な作品
DNSの大きな利点は、それがパブリックサービスであり、それを把握したい場合は、サーバーに侵入できることです。 やってみましょう。 マシンweb01.bugsplat.infoホストされているドメインpetekeen.netがあります。 以下で使用されるコマンドは、OS Xコマンドプロンプトから実行できます( ああ、macOS、およそTrans。です )。
名前と住所のマッピングを見てみましょう。
$ dig web01.bugsplat.info
digチームは、DNSクエリ用のスイスアーミーナイフです。 クールな多機能ツール。 答えの最初の部分は次のとおりです。
; <<>> DiG 9.7.6-P1 <<>> web01.bugsplat.info ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51539 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
興味深い詳細は1つしかありません。リクエスト自体に関する情報です。 記録を要求し、正確に1つの回答を受け取ったと言われています。 ここに:
;; QUESTION SECTION: ;web01.bugsplat.info. IN A
digは、デフォルトでAレコードを要求します。 Aはaddressであり、これはDNSの基本的なタイプのレコードの1つです。 Aは1つのIPv4アドレスが含まれます。 IPv6アドレスに相当するものがありますAAAA 。 答えを見てみましょう。
;; ANSWER SECTION: web01.bugsplat.info. 300 IN A 192.241.250.244
ホストにはweb01.bugsplat.info.があるとweb01.bugsplat.info. 1つのアドレスAがあります: 192.241.250.244 。 数字300はTTLまたは生存期間です。 再チェックするまで何秒間もキャッシュに値を保持できます。 INという言葉はInternet意味しInternet 。 これは歴史的に起こり、ネットワークのタイプを分ける必要があります。 詳細については、 IANAのDNSパラメータードキュメントをご覧ください。
回答の残りの部分では、回答自体について説明します。
;; Query time: 20 msec ;; SERVER: 192.168.1.1#53(192.168.1.1) ;; WHEN: Fri Jul 19 20:01:16 2013 ;; MSG SIZE rcvd: 56
特に、サーバーが応答した時間、サーバーが持っていたIPアドレス( 192.168.1.1 )、 dig ( 53 、デフォルトのDNSポート)、どのポートがノックオンされたのか、リクエストが完了したとき、応答のバイト数を示します。
ご覧のとおり、すべてのヒープは通常のDNSクエリで発生します。 Webページを開くたびに、ブラウザーは、写真やスクリプトなどのすべての外部リソースをダウンロードするなど、そのような要求を多数行います。 各リソースは、少なくとも1つの新しいDNSクエリを処理します。DNSが強力なキャッシング用に設計されていない場合、大量のトラフィックが生成されます。
しかし、この例では、DNSサーバー192.168.1.1が他のサーバー群に連絡して、単純な質問「 web01.bugsplat.infoのアドレスはweb01.bugsplat.infoですか?」に答えることは見えません。 トレースを実行して、情報がキャッシュされていなかった場合に発生する可能性のあるすべてのdigチェーンについて調べてみましょう。
$ dig +trace web01.bugsplat.info ; <<>> DiG 9.7.6-P1 <<>> +trace web01.bugsplat.info ;; global options: +cmd . 137375 IN NS l.root-servers.net. . 137375 IN NS m.root-servers.net. . 137375 IN NS a.root-servers.net. . 137375 IN NS b.root-servers.net. . 137375 IN NS c.root-servers.net. . 137375 IN NS d.root-servers.net. . 137375 IN NS e.root-servers.net. . 137375 IN NS f.root-servers.net. . 137375 IN NS g.root-servers.net. . 137375 IN NS h.root-servers.net. . 137375 IN NS i.root-servers.net. . 137375 IN NS j.root-servers.net. . 137375 IN NS k.root-servers.net. ;; Received 512 bytes from 192.168.1.1#53(192.168.1.1) in 189 ms info. 172800 IN NS c0.info.afilias-nst.info. info. 172800 IN NS a2.info.afilias-nst.info. info. 172800 IN NS d0.info.afilias-nst.org. info. 172800 IN NS b2.info.afilias-nst.org. info. 172800 IN NS b0.info.afilias-nst.org. info. 172800 IN NS a0.info.afilias-nst.info. ;; Received 443 bytes from 192.5.5.241#53(192.5.5.241) in 1224 ms bugsplat.info. 86400 IN NS ns-1356.awsdns-41.org. bugsplat.info. 86400 IN NS ns-212.awsdns-26.com. bugsplat.info. 86400 IN NS ns-1580.awsdns-05.co.uk. bugsplat.info. 86400 IN NS ns-911.awsdns-49.net. ;; Received 180 bytes from 199.254.48.1#53(199.254.48.1) in 239 ms web01.bugsplat.info. 300 IN A 192.241.250.244 bugsplat.info. 172800 IN NS ns-1356.awsdns-41.org. bugsplat.info. 172800 IN NS ns-1580.awsdns-05.co.uk. bugsplat.info. 172800 IN NS ns-212.awsdns-26.com. bugsplat.info. 172800 IN NS ns-911.awsdns-49.net. ;; Received 196 bytes from 205.251.195.143#53(205.251.195.143) in 15 ms
情報は階層順に表示されます。 digどのようにポイントを挿入したかを思い出してください. ホストの後、 web01.bugsplat.info ? だから、ポイント. これは重要な詳細であり、階層のルートを意味します。
ルートDNSサーバーには、世界中のさまざまな企業や州がサービスを提供しています。 当初、それらはほとんどありませんでしたが、インターネットは成長しており、現在は13個あります。 ただし、各サーバーには、1つのIPの背後に隠れている数十または数百の物理マシンがあります。
そのため、トレースの最上部にはルートサーバーがあり、それぞれがNS-レコードを使用して定義されています。 NSレコードは、ドメイン名(この場合はルートドメイン)をDNSサーバーに関連付けます。 NamecheapやGodaddyなどのレジストラにドメイン名を登録すると、 NSレコードが作成されます。
次のブロックでは、 digがランダムルートサーバーを選択し、 web01.bugsplat.info Aレコードを彼に要求した方法を確認できます。 ルートサーバーのIPアドレスのみが192.5.5.241 ( 192.5.5.241 )。 それで、どのルートサーバーでしたか? 見つけよう!
$ dig -x 192.5.5.241 ; <<>> DiG 9.8.3-P1 <<>> -x 192.5.5.241 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2862 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;241.5.5.192.in-addr.arpa. IN PTR ;; ANSWER SECTION: 241.5.5.192.in-addr.arpa. 3261 IN PTR f.root-servers.net.
-xフラグを使用すると、 digはIPアドレスによる逆ルックアップを実行します。 DNSは、IPとホスト(この場合はf.root-servers.netを接続するPTRレコードで応答します。
最初のクエリに戻ると、ルートサーバーFはNSサーバーの異なるセットを返しました。 彼はトップレベルのドメインinfo担当しています。 digは、これらのサーバーの1つにweb01.bugsplat.info Aレコードを要求し、応答でNSサーバーの別のセットを受信し、次にweb01.bugsplat.info. Aレコードをこれらのサーバーの1つに要求しますweb01.bugsplat.info. 。 そして最後に、答えが得られます!
ふう! 大量のトラフィックが生成されますが、これらのレコードのほとんどすべては、チェーン内の各サーバーによって長時間キャッシュされていました。 お使いのコンピューターも、ブラウザーと同様にこのデータをキャッシュします。 ほとんどの場合、DNSクエリはルートサーバーに到達しません。IPアドレスはほとんど変更されないためです( 「おそらく、データベース内のレコードの大きなTTLと同じです。DNSサーバーのIPアドレスが変更されていない場合、これは、そのベースが永遠にキャッシュされることを意味するものではありません」 -rrravからの注意 )。 トップレベルドメインcom 、 net 、 orgなど。 また、通常は大量にキャッシュされます。
他のタイプ
知っておく価値のあるタイプがいくつかあります。 最初はMXです。 ドメイン名を1つ以上のメールサーバーに接続します。 電子メールは非常に重要であるため、独自の種類のDNSレコードがあります。 petekeen.netのMX値はpetekeen.netです。
$ dig petekeen.net mx ; <<>> DiG 9.7.6-P1 <<>> petekeen.net mx ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18765 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;petekeen.net. IN MX ;; ANSWER SECTION: petekeen.net. 86400 IN MX 60 web01.bugsplat.info. ;; Query time: 272 msec ;; SERVER: 192.168.1.1#53(192.168.1.1) ;; WHEN: Fri Jul 19 20:33:43 2013 ;; MSG SIZE rcvd: 93
MXレコードはIPアドレスではなく名前を指していることに注意してください。
あなたが最もよく知っている別のタイプはCNAMEです。 Canonical Nameとして復号化します。 彼はある名前を別の名前に関連付けます。 答えを見てみましょう。
$ dig www.petekeen.net ; <<>> DiG 9.7.6-P1 <<>> www.petekeen.net ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16785 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.petekeen.net. IN A ;; ANSWER SECTION: www.petekeen.net. 86400 IN CNAME web01.bugsplat.info. web01.bugsplat.info. 300 IN A 192.241.250.244 ;; Query time: 63 msec ;; SERVER: 192.168.1.1#53(192.168.1.1) ;; WHEN: Fri Jul 19 20:36:58 2013 ;; MSG SIZE rcvd: 86
2つの回答を受け取ったことはすぐに明らかです。 最初のものは、 www.petekeen.net指しているとweb01.bugsplat.infoます。 2番目は、そのサーバーのAレコードを返します。 CNAMEは別のサーバーのエイリアス(またはエイリアス)であると想定できます。
CNAMEの何が問題なのか
CNAMEレコードは非常に便利ですが、重要なポイントがあります。ある名前のCNAMEがある場合、同じ名前の別のレコードを作成することはできません。 MXもAもNSも何もありません。
その理由は、 CNAME指す場所のすべてのレコードがCNAMEに対しても有効であるような方法でDNSが置換を実行するからです。 この例では、 www.petekeen.netとweb01.bugsplat.infoエントリが一致します。
したがって、通常は他のレコード( MXなど)が必要なので、 petekeen.netなどのルートドメインでCNAMEを実行することはできません。
他のサーバーへのリクエスト
DNS構成が破損していると想像してみましょう。 問題を修正したようですが、確認のためにキャッシュが更新されるまで待ちたくないようです。 digを使用するとdig次のように、デフォルトの代わりにパブリックDNSサーバーにリクエストを送信できます。
$ dig www.petekeen.net @8.8.8.8
IPアドレスまたはホストのある@記号により、 digはデフォルトのポートを介して指定されたサーバーに要求を行います。 4.2.2.2 では、GoogleのパブリックDNSサーバーまたはレベル3に近いパブリックサーバーを使用できます 。
典型的な状況
多くのWeb開発者に馴染みのある典型的な状況を見てみましょう。
wwwへのドメインリダイレクト
多くの場合、 iskettlemanstillopen.comドメインをwww.iskettlemanstillopen.comにリダイレクトする必要があります。 NamecheapやDNSimpleなどのレジストラは、このリダイレクトURLを呼び出します 。 Namecheap管理領域の例を次に示します。

@記号はiskettlemanstillopen.comのルートドメインを意味します。 このドメインのAレコードを見てみましょう。
$ dig iskettlemanstillopen.com ;; QUESTION SECTION: ;iskettlemanstillopen.com. IN A ;; ANSWER SECTION: iskettlemanstillopen.com. 500 IN A 192.64.119.118
このIPはNamecheapに属し、小さなWebサーバーがそこで回転し、HTTPレベルでアドレスhttp://www.iskettlemanstillopen.comリダイレクトしhttp://www.iskettlemanstillopen.com 。
$ curl -I iskettlemanstillopen.com curl -I iskettlemanstillopen.com HTTP/1.1 302 Moved Temporarily Server: nginx Date: Fri, 19 Jul 2013 23:53:21 GMT Content-Type: text/html Connection: keep-alive Content-Length: 154 Location: http://www.iskettlemanstillopen.com/
HerokuまたはGithubのCNAME
上記のスクリーンショットをご覧ください。 2行目にはCNAMEます。 この場合、 www.iskettlemanstillopen.comはHerokuで実行されているアプリケーションを指します。
$ heroku domains === warm-journey-3906 Domain Names warm-journey-3906.herokuapp.com www.iskettlemanstillopen.com
Githubにも同様のストーリーがありますが、リポジトリのルートに特別なファイルを作成し、 CNAMEという名前を付ける必要があります。 ドキュメントを参照してください。
ワイルドカード
ほとんどのDNSサーバーはワイルドカードをサポートしています。 たとえば、 *.web01.bugsplat.info指すワイルドカードCNAMEがあります。 次に、 web01上のホストはweb01をポイントし、新しいエントリを作成する必要はありません。
$ dig randomapp.web01.bugsplat.info ;; QUESTION SECTION: ;randomapp.web01.bugsplat.info. IN A ;; ANSWER SECTION: randomapp.web01.bugsplat.info. 300 IN CNAME web01.bugsplat.info. web01.bugsplat.info. 15 IN A 192.241.250.244
おわりに
DNSの基本的な理解ができたことを願っています。 すべての標準は、ドキュメントに記載されています。
DNSSEC標準を説明する4034やDNSと電子メールの関係を説明する5321など、さらに興味深いRFCがいくつかあります。 それらは一般的な開発のために読むのが面白いです。