Webサイトを開くとき、私たちはブラウザにドメイン名を含むURLを入力します。しかし、ネットワーク上で通信先を指定する際には、通常、IPアドレスという別の情報が使われます。
例えば、ブラウザが「example.com」という名前を手掛かりに、通信先のIPアドレスを調べる処理を名前解決と呼びます。この記事では、名前解決が必要な理由から、DNSによる問い合わせの流れ、確認方法までを具体例とともに説明します。
名前解決とは
名前解決とは、名前を手掛かりにして、その名前が表す対象や、処理に必要な情報を特定することです。ネットワークの話題では、ホスト名やドメイン名からIPアドレスを調べることを指す場合が多くあります。
IPアドレスは、ネットワーク上で通信先を指定するための番号です。IPv4では「192.0.2.10」のように表し、IPv6では「2001:db8::10」のように表します。これらは説明用の例であり、特定のWebサイトの実際の接続先を示すものではありません。
数字や記号の並びを毎回覚えて入力するのは大変です。そこで、私たちは覚えやすい名前を使い、コンピュータが通信に必要な情報を調べます。ICANNのDNS解説でも、ドメイン名とIPアドレスを結び付ける仕組みとしてDNSが紹介されています。
例えば「https://www.example.com/guide」というURLでは、それぞれの部分が異なる役割を持ちます。
| 部分 | 例 | 役割 |
|---|---|---|
| 方式 | https:// | Webサイトと通信する方法を示します。 |
| ホスト名 | www.example.com | 接続先を名前で指定します。この部分のIPアドレスを調べます。 |
| パス | /guide | 接続先のWebサーバー上で、どのページなどを要求するかを示します。 |
URL全体がDNSに渡されるわけではありません。通常はURLからホスト名を取り出して名前解決し、その結果を使って接続します。example.comはIANAが文書の例示用に用意しているドメインです。
DNSとは
DNS(Domain Name System)は、ドメイン名に関連する情報を分散して管理し、問い合わせられるようにした仕組みです。名前とIPアドレスの対応を調べられるため、「インターネットの住所録」にたとえられます。ただし、実際には世界中の名前と住所が一つの巨大な帳簿に記載されているのではなく、複数のサーバーが役割を分担しています。
DNSで扱う情報をDNSレコードと呼びます。IPアドレス以外の情報も管理でき、代表的な種類には次のものがあります。
| 種類 | 主な内容 |
|---|---|
| A | 名前に対応するIPv4アドレス |
| AAAA | 名前に対応するIPv6アドレス |
| CNAME | 名前を別の名前に対応付ける別名情報 |
| MX | そのドメイン宛てのメールを受け取るサーバーの情報 |
| TXT | ドメインに関連付けられた文字列。ドメインの所有確認などに使われます。 |
一つの名前に複数のIPアドレスが登録される場合もあれば、複数の名前が同じIPアドレスを使う場合もあります。また、接続する場所や時刻によって得られる答えが変わることもあります。名前とIPアドレスが常に一対一で固定されるわけではありません。
Webサイトを開くまでの流れ
「https://www.example.com/guide」を開く場面で、DNSを利用する一般的な流れを見てみましょう。
-
- ブラウザはURLからホスト名「www.example.com」を取り出します。
- 端末やブラウザに使える記憶がなければ、設定されたDNSリゾルバーに問い合わせます。リゾルバーは名前解決を担当する仕組みで、問い合わせを代行するDNSサーバーを指すこともあります。
- リゾルバーに答えのキャッシュ(一時的に保存した情報)がなければ、必要に応じてDNSサーバーをたどります。
- リゾルバーが得たIPアドレスを端末へ返し、ブラウザはそのアドレスへの接続を試みます。
- HTTPSによる安全な通信の準備が整うと、ブラウザはページを要求し、受け取った内容を表示します。
つまり、名前解決はページを取得する前の準備です。DNSがWebページの本文を送っているわけではありません。名前解決に成功しても、その後の通信やWebサーバーに問題があれば、ページは表示されません。
キャッシュがなく、最初から調べる場合の流れを簡単に示すと、次のようになります。
-
- ルートDNSサーバーに問い合わせ、主に「.com」を担当するDNSサーバーへの手掛かりを得ます。
- 「.com」のDNSサーバーに問い合わせ、「example.com」を担当する権威DNSサーバーへの手掛かりを得ます。
- 権威DNSサーバーに問い合わせ、管理されているレコードを取得します。
権威DNSサーバーとは、その範囲のドメインについて正式な情報を管理し、回答するサーバーです。上位のサーバーが最終的なIPアドレスをすべて知っているのではなく、次に問い合わせる先を案内します。これは理解のために整理した流れで、実際には途中の情報もキャッシュされるため、毎回ルートから問い合わせるとは限りません。詳しい動作はDNSの基本仕様RFC 1034に記載されています。
キャッシュは何のためにある?
同じ名前を何度も最初から調べると、問い合わせに時間がかかり、DNSサーバーへの負荷も増えます。そこで、得られた情報を一定時間保存して再利用します。これがキャッシュです。
DNSレコードには、キャッシュを保持できる時間の目安としてTTL(Time to Live)が設定されています。例えばTTLが300秒なら、通常、その情報は最大300秒間キャッシュに利用できます。保存場所はリゾルバーだけでなく、端末やアプリにもあります。
Webサイトの移転などでDNSの登録内容を変更しても、古い情報がキャッシュに残っていれば、利用者によって新しい接続先に切り替わるまでの時間が異なります。「設定を変えたのに、すぐに結果が変わらない」原因の一つです。
DNS以外にもある名前解決
名前解決はDNSだけで行われるわけではありません。例えば、多くのOSには、名前とIPアドレスの対応をローカルに記載するhostsファイルがあります。設定によっては、DNSへ問い合わせる前にこのファイルの記載が使われます。参照する順序はOSや設定、アプリによって異なります。Linuxではnsswitch.confの設定が参照先の選択に関わります。
また、家庭内や学校内のネットワークでは、機器を見つけるために、ローカルネットワーク向けの名前解決が使われることもあります。例えばmDNSは、対応する機器同士が近くのネットワークで名前を調べる仕組みです。「名前解決」という言葉は、使われる場所や対象に応じて、こうしたさまざまな方法を含みます。
さらに広い意味では、プログラム中の変数名「x」が、どの変数を指すかを決めることも名前の解決と呼ばれます。こちらはプログラムの書かれた範囲などを基に名前を対応付ける処理であり、DNSでIPアドレスを調べる処理とは別のものです。
自分のパソコンで確かめる
Windows、macOS、Linuxでは、端末からDNSに問い合わせるnslookupコマンドを利用できる環境があります。Windowsなら「コマンドプロンプト」、macOSなら「ターミナル」、Linuxなら端末を開いて、次のように入力します。
nslookup example.com
結果には、問い合わせ先のDNSサーバーや、得られたIPアドレスなどが表示されます。表示されるアドレスの数や値は環境や時期によって異なることがあります。nslookupが見つからない場合は、そのOSに対応したDNS関連ツールの導入が必要です。
Linuxでは、次のコマンドでOSの名前解決機能から得られる結果を確認する方法もあります。
getent ahosts example.com
getentはOSが設定された名前解決の仕組みを利用するため、hostsファイルなどが結果に反映される場合があります。nslookupはDNSへの問い合わせを調べる道具なので、両者の結果が違うこともあります。詳しくはgetentのマニュアルを参照してください。
名前解決に失敗するとどうなる?
名前に対応するアドレスが得られないと、ブラウザは名前から接続先を決められず、「サーバーのIPアドレスが見つかりません」などのエラーを表示することがあります。原因には、名前の入力ミス、DNSサーバーに接続できないこと、DNSレコードの設定ミスなどがあります。
問題を調べるときは、まずURLのつづりを確認し、別のサイトも開けるか試します。一つのサイトだけで起こるのか、複数のサイトで起こるのかを分けると、問題の範囲を絞れます。nslookupの結果も参考になりますが、DNSの問い合わせが成功しても、接続先のサーバーやネットワーク、HTTPS証明書などに別の問題があればページは開けません。逆に、このコマンドで失敗しても、アプリ固有の設定などにより結果が異なる場合があります。
学校や職場のネットワークでは、内部向けの名前を専用のDNSで解決することがあります。設定を変更すると内部サービスにつながらなくなる場合があるため、DNSサーバーの変更やhostsファイルの編集を行う前に管理者へ相談してください。
まとめ
名前解決は、名前から対象や必要な情報を調べる処理です。インターネットでは、DNSを利用してホスト名に対応するIPアドレスを取得し、そのアドレスを使って通信先への接続を試みます。
普段は意識せずに使える仕組みですが、サイトに接続できないときには、名前解決の段階で失敗しているのか、その後の通信で失敗しているのかを区別すると、原因を考えやすくなります。
