【図解】初心者にも分かるDNSの仕組み〜GoogleのIP確認, 逆引きの必要性, レコードの種類等〜

DNSとは

DNSとは、文字列をIPアドレスに変換(およびその逆変換)をするクライアント/サーバシステムです。

このDNSのメリットは以下の2つです。

  1. あるサーバへのアクセスをする際に、『IPアドレス』という、人間には覚えにくい番号の順列を覚える必要が無くなり、人間が覚えやすい『ドメインネーム』という意味の分かり易い文字列さえ覚えれば良くなる。
  2. 何らかの理由(例えばサーバを更改するなど)でサーバのIPアドレスを変更する場合であっても、DNSサーバの情報1つを変更すれば、全てのクライアントにその情報が伝搬され、今までと違うIPアドレスのサーバに対し、今までと同じドメインネームでアクセスできる

ドメインネームとは

インターネット上では、各ホストはIPアドレスで表現されますが、数字の羅列というのは人間にとっては意味を見出しにくく、 覚えにくいものです。そこで、IPアドレスを人間に分かり易い文字列に変換する仕組みを作りました。それが前述のDNSであり、人間に分かり易い文字列というのがドメインネーム(正式名称 FQDN: Full Qualified Domain Name)です。

ドメインネームはIPアドレスと同様、世界で一意である必要があるため、ICANNという組織が管理しています。

例えば、www.google.co.jpというドメインネームがありますが、jpというのはJPNICが管理しており、co.jpは日本の企業に対して割り当て られるドメインです(coは商業を意味するcommercialの略。.comドメインも、JPNICの管理外ですが、commercialを意味します)。

その他にも、networkを意味するne.jpドメイン、organizationを意味するor.jp、academic(学校法人等)を意味するac.jpドメインなどがあります。

取得する際には申請が必要ですが、申請したからといって必ず割り当てられるでもありませんし、学校法人だから必ずac.jpを取らなければならない、というわけではありません。例えば早稲田大学はac.jpではなく、waseda.jpドメインを取得しています。

DNSの機能、レコードについて

DNSサーバには、登録されている情報には『レコード(正式にはリソースレコード:RR)』という識別があります。レコードはDNSの機能によって分類されています。DNSでよく使われるレコード(機能)として、以下のものがあります。

  • Aレコード=インターネット上のホームページのURLからIPアドレスを調べる。(正引き)
  • MXレコード=メールアドレスの宛先から、宛先のメールサーバのIPアドレスを調べる。
  • NSレコード=上位層のDNSサーバから、下位層のDNSサーバを調べる。
  • PTRレコード=IPアドレスからドメインネームを調べる。(逆引き)

Aレコードの使われ方

一般的によく使われるレコードです。ブラウザでURLを入力した場合はAレコードの問い合わせが行われます。

上記の機能を、以下手順でWindowsのコマンドプロンプトからDNSを利用して確認してみましょう。

  • Windowsキー + R
  • cmd [Enter]

まず、Google の IPアドレスを調べてみましょう。コマンドプロンプトで以下のように打ちます。

nslookup www.google.co.jp

2つ表示されていますが、1つ目のIPアドレス「2404:6800:400a:806::2003」というのはIPv6のアドレスです。

そして2つ目のIPアドレス「216.58.196.227」がIPv4のアドレスです。

次に、www.yahoo.co.jp のIPアドレスを調べてみましょう

nslookup www.yahoo.co.jp

4つのアドレスが出てきましたが、これはサーバを負荷分散させているためです。いずれか1つをブラウザのURL欄に入力してみましょう。Yahoo!JAPANのサイトが見れるはずです。

このように、ドメインネーム(FQDN)からIPアドレスに変換することを「正引き」と言います。

MXレコードの使われ方

MXレコードはメール送信に使われます。メールアドレスの@以降の文字列(ドメイン)のMXレコードを問い合わせると、そのメールの送信先ホスト名とそのIPアドレス(Aレコード)を示してくれます。

例として「~~@yahoo.co.jp」宛にメールを送る際のメールサーバのIPアドレスを調べましょう。メールにおいては基本的に@以降のドメインネームによってメールサーバが決まります。

同じくコマンドプロンプトで「nslookup -type=mx yahoo.co.jp」と打ちます。

MX preferenceというのはメールサーバを利用する際の優先度です(MX preference値が小さいほど優先度が高いです) 。今回は全て10なのでどれか1つを選べばよいです。ここではmx2に送ることとしますが、mx2はホスト名なので、IPアドレスへ名前解決します。

例えば、abcd@yahoo.co.jp というメールアドレスにメールを送信すると、相手方のメールサーバに届き、abcdというアカウントがあれば、そのアカウントのメールボックスにメールが届くわけです。ただし、そのアカウントがない場合は、メールは破棄され、送信元にはエラーメールが通知されます。

NSレコードの例

NSレコードはそのドメインを管理しているDNSサーバがどこにあるかを示してくれます。主にサブドメインを管理するサーバを指定します。

例えば .co.jp は .jp のサブドメインですので、.jp の管理サーバには .co.jp の NSレコードが格納されます

NSレコードの具体例、詳細については、以下ページを参照して下さい。

【図解】DNSクエリの仕組み、通信フロー 〜コンテンツ、キャッシュ、フルリゾルバ、フォワーダ、ルートヒント~
【図解】DNSクエリの仕組み、通信フロー 〜コンテンツ、キャッシュ、フルリゾルバ、フォワーダ、ルートヒント~
一般的なDNSクエリ/レスポンスの通信フロー ホームネットワークの構成例 ホ...

PTRレコードの例

IPアドレスからドメインネームに変換することを「逆引き」と言います。Aレコードの例で表示された4つのIPアドレスをnslookup で逆引きしてみます。

それぞれに対してサーバのホスト名が出てきました。

逆引きの必要性、用途とメリット/デメリット、セキュリティ

逆引きは正直あまり必要性はありません。正引きと整合性を取らないと通信に支障をきたす、ということもありません(最後に示すようにセキュリティ機能として使っている場合を除く)。

ではどのようなシーンで使われるのかというと、例えば tracert ではデフォルトで応答したIPアドレスを逆引きしてホスト名を表示する設定になっています。これにより通過するIPがどのドメインに所属する、何という名前の機器なのか、というのを見ることができます。

以下の例では 118.238.227.1 というIPアドレスは nuro.jp が保有していることが分かります。(逆引きのレコードが無いIPについては『4th octet,3rd octet,2nd octet,1st octet.in-addr.arpa』という表示になります。)

このように、逆引きはそのIPがどのドメインに所属するのか、もしくは何という名前の機器なのかを表示し、人間に直感的なヒントを与えるというメリットがあります。ですが、その分表示を遅くするというデメリットもあります。

上図の下半分では tracert に -dオプションを付けて実行していますが、これにより逆引き変換しないため、応答も早くなります。

また、逆引きはセキュリティ機能として使われることもあります。例えばメールサーバとして有名な postfix ではスパムメール防止のために、SMTP接続してきた送信元IPの逆引きの問い合わせを行い、逆引き結果を得られた場合のみメールを転送する、という仕組みがあります。

その他のレコード

その他のレコードとしては以下があります。

SRV レコード

あるサービスを使う際の問合せ先を示します。例えば ActiveDirectory では SRV レコードにケルベロス認証やLDAP問合せのサービスを使う問合せ先として、ドメインコントローラを指定しています。ドメイン参加している機器はログイン時にこのSRVレコードを引き、結果ドメインコントローラにケルベロス認証を要求します。

TXT レコード

TXTレコードは汎用的な補足情報を載せます。例えばメール偽装を防ぐ DKIM 等はこのレコードを使っています。 DKIM 等のメール偽装防止技術については以下を参照下さい。

【図解】DKIM, SPF/SenderIDの仕組みと違い 〜なりすまし(メールスプーフィング)対策の送信元ドメイン認証技術〜
【図解】DKIM, SPF/SenderIDの仕組みと違い 〜なりすまし(メールスプーフィング)対策の送信元ドメイン認証技術〜
そもそも送信元メールアドレス偽装は簡単 メール送信はご存知の通り、SMTPプロ...

OPTレコード

OPTレコードは正式には『OPT擬似リソースレコード』と呼ばれており、DNSパケットの中でもレコードを示す位置には定義されておらず、拡張領域に存在します。

このOPTレコードは 512バイトより大きいサイズのUDPを使ったDNSパケットを扱うEDNS0』というDNSバージョンをサポートするかどうかを問合せするために使われます。

この背景には歴史があります。1981年に公開された RFC791 で『IPv4 は 576バイトまでのパケットは必ず受信すること』というリクエストがあり、それを踏まえRFC883では『UDPを使ったDNSパケットのサイズは512バイトまで』という上限が設けられました。

しかし時代は移り、情報は大容量に、通信は超高速になり『UDPを使ったDNSのサイズが512バイトまで』という制約(いわゆる『512バイトの壁』)が邪魔になりました。特にセキュリティ技術の DNSSECIPv6 に関する名前解決はおおよそ 512バイトでは収まらないことが分かりました。

そこでルールを変更し、512バイト以上の UDP による DNS を許容する動きが出たのですが、その際に互換性を保つために、EDNS0に対応したDNSクライアントはこのOPTレコードで要求先DNSサーバに対して『EDNS0に対応しているか』を聞く動作を行うことにしました。

なお、DNSSEC や IPv6 の問い合わせはこのEDNS0をサポートすることが必須となっています。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

Comment

  1. 通りすがり より:

    インターネットの仕組みを知りたくて
    DNSについて調べていました。

    他のサイトは文字だけは多いんだけど
    内容が良くかからなかったり、
    人に伝えるのが上手くない文章だったり
    そもそも書き手が理解出来ていない、誤解しているのだろうなぁ
    と思える内容ばかりで苦痛だったのですが

    こちらは核心を突いた内容と
    分かりやすくて適量な図解と文章のおかけで
    物凄く分かりやすかったです。

    管理人さんはきっと良いエンジニアさんなんだと思います。

    • nesuke より:

      コメントありがとうございます。このような言葉を頂けるのが本当に嬉しいですし励みになります。
      正直、図を作るのが大変だったりするので、文章だけで説明してしまおうかな、と考えてしまうこともあるのですが、私が目指すところ『本質を分かり易く解説する技術サイト』を実現すべく、襟を正し、これからも頑張りたいと思います。