DNSはインターネットを知る上で重要な技術の一つです。
DNSは「ホスト名をもとにIPアドレスを教える」役割を担っています。
今回はそんなDNSについてできるだけわかりやすく説明してきます。
DNSとは?
DNS (Domain Name System)は「www.example.jp」のような完全修飾ドメイン名(FQDN)と「192.168.0.1」のようなIPアドレスを紐づけて管理するシステムのことを指します。
重要なことはPCの通信にはIPアドレスが必要ということです。ドメイン名は人間にはわかりやすいですが、コンピュータは数字のIPアドレスのほうが理解しやすいのです。
コンピュータがgoogleのホームページを表示するにはgoogleのコンピュータから情報をダウンロードしてくる必要があります。インターネット上にあるgoogleのコンピュータの住所はIPアドレスで書かれているので、ドメイン名をIPアドレスに変換する必要があります。
上の図でいきなり登場した「DNSサーバー」これがドメイン名をIPアドレスに変換する役割を持つサーバーです。
DNSを実際に体験してみましょう
windowsのコマンドプロンプトを立ち上げてみましょう。
コマンドに「nslookup www.yahoo.co.jp」と打ち込みますすると以下のようにwww.yahoo.co.jpのIPアドレス183.79.250.123が返ってきました。この値を返してくれたDNSサーバーはcdns01.kddi.ne.jpです。
Linuxでもnslookupコマンドは使えます。
DNSのレコードを確認するコマンド dig nslookupの使い方
DNSの仕組み
もう一度DNSの概要を見てみましょう。
以下の図のように、ユーザーのPCは打ち込まれたドメイン名(FQDN)からIPアドレスを知るためにDNSサーバーに問い合わせます。DNSサーバーはFQDN-IPアドレスの情報を返答します。IPアドレスを入手したユーザーPCはその情報をもとにWebサーバーを見つけ出してホームページをダウンロードします。
もしもインターネットにつながっているのにドメイン名でホームページが開けない場合はDNSサーバーに障害が起きている可能性があります。
www.example.jp⇔192.168.0.1というようなFQDNからIPアドレス、IPアドレスからFQDNというような変換をDNSにおける名前解決と言います。
DNSは大規模な分散ネットワーク
膨大な数のIPアドレス-ホスト名を紐づけて管理するのはとても大変です。もしも管理しているPCが一つなら世界中のPCからIPアドレスの問い合わせが来てパンクしてしまいます。それを回避するためにDNSは「分散システム」「キャッシュ」を使って対応しています。
これから先はDNSサーバーがどうやってIPアドレスとFQDNを管理しているのか?実際の動きを交えて解説していきます。
DNSサーバーの種類
DNS (domain name system)はFQDNをIPアドレスに変換する機能です。DNSサーバーはDNSの機能を提供するコンピュータです
このDNSサーバーは2つに分けられます。
- フルサービスリゾルバ(フルリゾルバ)
- DNSコンテンツサーバー(権威DNSサーバー、ネームサーバーなどとも呼ばれる)
です。
フルリゾルバはFQDNからIPアドレスを他のDNSサーバーに聞きまわるものであり、DNSコンテンツサーバーは自分が保持する情報をフルリゾルバに教える役割があります。
フルリゾルバやDNSコンテンツサーバーの詳細については後述します。
FQDN(完全修飾ドメイン名)とドメイン名はDNSの説明がされるにあたって同じ文脈でどちらも登場するので理解しにくいかもしれません。これはFQDNもドメイン名と呼ぶためです。www.google.comがFQDNの場合www.google.comもドメイン名であり、google.comもドメイン名と言えてしまいます。
そこでDNSの説明の時はホスト名という名前が登場します。ホスト名は上の例でいうと「www」の部分です。ホスト名は特定の機器等を指していてこれにIPアドレスが付与されています。ホスト名はFQDNの一番左側をさしていて、comの中のgoogleの中のwwwという機器にIPアドレスが付与していると考えます。逆に言えばIPアドレスが指しているものはホスト名ともいえるわけです。
ということでDNSではホスト名をIPアドレスに変換するというような言葉と説明が見られます。これはDNSはFQDNをIPアドレスに変換する、ドメイン名をIPアドレスに変換するなどとほぼ同じ内容を示しているので混乱しないようにしましょう。
ゾーンとは?DNSは分担して名前解決を行っている
世界中からIPアドレスの問い合わせが来るとパンクするので、複数のDNSサーバーが分担しています。
各DNSサーバーは全ての情報を持っているわけではなくそれぞれが担当する範囲の情報のみを扱っています。この範囲を「ゾーン」といいます。例えば「jp」担当、「.com」担当、「.co.jp」担当などのように分かれています。
ゾーンとは?
DNSコンテンツサーバーはそれぞれが委任された範囲(ゾーン)の名前解決を行います。
例えば「www.example.jp.」というFQDNがあります。
最も広い範囲のドメインは一番右のトップレベルドメイン「jp」です。しかし、さらにトップレベルドメインの右には通常は省略される「.」の部分がありこれを「ルートドメイン」と呼びます。www.example.jp.は
「. ルートドメイン」「トップレベルドメインjp」「example」「www」と分かれています。
ルートドメインが最も広い範囲であり、トップレベルドメインと続いていきます。まるで住所のようにゾーンが分かれてます。
上記のようにドメインの区切り事にエリアが別れているのが見てわかると思います。DNSサーバーはそのエリアごとに担当を決めています。
最も広い範囲を管理しているDNSサーバーは「ルートサーバー(DNSルートサーバー)」であり、DNSサーバーの頂点に存在しています。ルートサーバーは世界に13台しかありません。
このルートサーバーが全ての名前解決を行っているわけではありません。
ルートサーバーは「.jp」「.com」などのトップレベルドメインの管理を行っているDNSサーバーのFQDNとIPアドレスを管理しています。トップレベルドメイン以下の管理はそれ以下のDNSサーバー達に委譲しています。「jp」を管理するDNSサーバーや「com」を管理するDNSサーバーはそれ以下のドメインのDNSサーバーを管理しています。
このように階層になってDNSサーバーが存在することで処理を分散化することができます。クライアントDNSはルートサーバーから問い合わせていけば最終的にFQDNのIPアドレスの取得ができます。
次にクライアント(PC)がFQDNをIPアドレスに変換していく過程を解説していきます。
DNSが名前解決を行う仕組み フルリゾルバとDNSコンテンツサーバー
まずはIPアドレスを取得するまでの流れを示します
- 自分が持っているHostsファイルで調べる (Hostsファイル:FQDNとIPアドレス対応表)
- スタブリゾルバを使ってフルサービスリゾルバにFQDN-IPアドレスのキャッシュ情報が残っているか聞く
- キャッシュ情報がない場合はフルサービスリゾルバに外部のネームサーバー(権威DNSサーバー)に問い合わせてもらう
- ルートネームサーバーから順に名前解決を行う
- 得られたIPアドレスをスタブリゾルバに渡す
- クライアントはIPアドレスをスタブリゾルバから受け取る
というような流れになります。
1. Hostsファイルの閲覧
HostsファイルはFQDNとIPアドレスの対応表です。PC自身(ホスト)が持っているもので、Linuxでは「/etc/hosts」にあります。
hostsファイルで「IPアドレス FQDN」を登録しておけば、このhostsファイルの情報で名前解決を行ってくれます。試しにhostsファイルにwww.google.comのアドレスをヤフーのIPアドレスに紐づけてみます。
ウェブブラウザにwww.google.comのFQDNを入力すると、yahooのページがでてきます。異常を感知してページが表示されていません。
上の例は誤った情報を載せていますが、正しい情報をあらかじめHostsファイルに登録しておけば外部のDNSサーバーに問い合わせなくても名前解決ができます。LAN内の名前解決などに利用できます。
hostsファイルはかつてDNSが普及していない時代に利用されていたものの名残です。今では膨大な数のドメイン・IPアドレスがあるので現在のDNSの仕組みを使っています。
Hostsの書き方 localhost, localdomainとは? /etc/hostsの中身と書き換え!
2.フルサービスリゾルバにキャッシュ情報を聞く
クライアントPCはDNSスタブリゾルバという他のDNSに情報を要求するDNS機能を使ってフルサービスリゾルバにIPアドレスを問い合わせます。フルサービスリゾルバには最近FQDNからIPアドレスを取得した経験があれば情報が残っている(キャッシュ)可能性があるのでそれを取得します。キャッシュがない場合は、次の段階であるフルサービスリゾルバは外部のDNSコンテンツサーバーに問い合わせます。
スタブリゾルバに依頼してフルサービスリゾルバにキャッシュが残っているか確認する。なければフルサービスリゾルバが外部DNSコンテンツサーバーにIPアドレス問い合わせに行く
DNSキャッシュサーバーはフルサービスリゾルバのように外部DNSに問い合わせを行わずに紐づけ情報の一時保存のみを行うDNSです。
3.権威DNSサーバーに問い合わせ
フルサービスリゾルバが情報を持っていない場合、外部の権威DNSサーバーに問い合わせます。
問い合わせの順番は最も範囲の広いルートネームサーバーから問い合わせます。
ルートネームサーバーはサブドメインを管理するDNSサーバーのIPアドレス、ここでは.jpのアドレスを教えてくれます。フルリゾルバはその情報をもとに次はjp.ネームサーバーにそれ以下のドメインの情報を順番に取得していきます(下図)
www.example.jp.ならまずは「.」ルートサーバーからjpのゾーンを管理するDNSサーバーのIPアドレスを取得します。次に「jp」を管理するDNSサーバーからexample.jpを管理するDNSのIPアドレスを取得します。この流れを繰り返すと最終的にwww.example.jpのIPアドレスが入手できます。
4.クライアントに情報を返す
フルサービスリゾルバがネームサーバーから得たIPアドレスはスタブリゾルバを通してクライアント(ユーザーPC)に返します。
この時フルサービスリゾルバは紐づけされたFQDN ーIPアドレスの情報を設定された時間(TTL)の間キャッシュします。
これで名前解決が行われました。このようにFQDNからIPアドレスを取得することを「正引き」といいます。
DNSにまつわる用語解説・周辺情報
問い合わせの分類
再帰問い合わせ
スタブリゾルバはクライアントからDNSサーバーに問い合わせる役割を担うDNSクライアントです。
リゾルバの役割は2つあります。
1つはすでに名前解決したことがあるホスト名であればホスト名-IPアドレスが保存(キャッシュ)されているためそれを「ローカルネームサーバー(DNSフルサービスリゾルバ、DNSキャッシュサーバー)」から聞き出します。
2つはキャッシュが無い場合はローカルネームサーバーに名前解決を依頼します。
スタブリゾルバは外部のDNSサーバーには名前解決を依頼しません。このような問い合わせを「再帰問い合わせ」と呼びます。
反復問い合わせ
ローカルネームサーバー(フルサービスリゾルバ)はLAN内にあるゾーンを管理するネームサーバーでアクセスしたことがあるホスト名-IPアドレス情報をキャッシュしたり、外部のDNSサーバーにIPアドレスの問い合わせを行います。
フルサービスリゾルバは外部の権威DNSサーバーに問い合わせ、その結果をもとにサブドメインを管理する権威DNSサーバーへ問い合わせを反復して行い最終的にIPアドレス取得します。このようにフルサービスリゾルバ→権威DNSサーバーを反復して問い合わせるため「反復問い合わせ」といいます。
フルサービスリゾルバは問い合わせたホスト名-IPアドレス情報を一時的に保存(キャッシュ)してスタブリゾルバに返答し、スタブリゾルバはクライアントにIPアドレスを返信します。
こうしてホスト名からIPアドレスの名前解決が行われます。
レコード
各ゾーンのDNSサーバーが管理する情報をレコードといいます。レコードに載っている情報には複数の種類(レコードタイプ)があります。
代表的なレコードタイプには
- NSレコード:権威移譲の情報、どのドメインのDNSサーバー?
- Aレコード:IPアドレスとFQDN(ホスト名)の情報(正引き)
- MXレコード:指定したドメイン名宛てのメールサーバーのFQDN
- PTRレコード:ホスト名→IPアドレスのレコード
などがあります。
レコードは決まった形式で書かれています。
ドメイン名 TTL クラス レコードタイプ IPアドレスやドメイン名など
TTLはキャッシュ有効時間を表します。クラスはIN(INternetを表す)以外は基本登場しません。レコードタイプはNsなどと表示されます。レコードタイプによって表示される最後の列は変わりますが、AレコードならIPv4アドレスになります。
具体的にレコードタイプ別にみていきましょう。レコードを見るにはdigコマンドを使います。
NSレコードの中身
(TTL) IN NS (DNSサーバーのFQDN) 例:1800 IN NS ns.example.net
TTL(Time To Live)はキャッシュの保存期間のことで単位は[秒]
Aレコードの中身
AレコードはFQDNからIPアドレスを取得するためのレコードです。
(FQDN) (TTL) IN A (IPアドレス) 例:www.example.com 1800 IN A 202.242.168.111
MXレコードの中身
MXレコードは指定したFQDNのメールサーバーのFQDNとIPアドレスを取得するためのレコードです。
コマンド:dig MX gmail.com
MXレコードはgmail.comのメールサーバーのFQDNを指定 alt2.gmail-smtp-in.l.google.com.
Aレコードにはメールサーバーalt2.gmail-smtp-in.l.google.com.のIPアドレスが記載されています
MXレコードのFQDNの前についている20や40などの数値はプリファレンス値といい、数字が小さいものが優先的に利用されます。
実際の名前解決の場ではどのレコードを取得しているかというと、www.example.jpの場合、ルートネームサーバーやトップレベルドメインのネームサーバーに対してはwww.example.jpのIPアドレスを知らないのでサブドメインを管理するNSレコードを取得します。最後のネームサーバーはFQDNに紐づけされてたIPアドレスの情報を持っているのでAレコードを取得します。
DNSの実態
個人の場合は自分が契約しているISPのDNSサーバーを利用していると思います。また、何かしらの不調がある場合はgoogle public DNSのようなオープンなDNSを代替DNSサーバーとして利用できます。
代替DNSサーバーはセキュリティを強化するために利用されることもあります。DNSサーバーがリクエストされたドメイン名(URL)からIPアドレスを返信する際に、危険なサイトのURLの場合にはIPアドレスを返さなければ危険な接続からユーザーを保護できます。
DNSが悪意のある攻撃を受けて変更されると意図しないサイトに誘導される恐れがあります。そのためセキュリティは重要です。フルリゾルバをローカルに置くのも悪意のある攻撃にできるだけさらさないためといえます。
DNSの必要性
なぜDNSが必要なのでしょうか?
確かにグローバルIPアドレスは唯一無二であるため、それを使えばよいです。
そもそもグローバルIPアドレスが唯一無二のアドレスとなるなら、それをアドレスとして使えばよいじゃないか?と感じる方もいるかもしれません。
しかし、「202.168.1.1」のような抽象度の高いアドレスを覚えるのは難しいですよね?ですからホスト名のようなアルファベット・数字からなる名前が登場しました。
- 192.168.2.2→okaimono(ホスト名)
- 112.543.22.132→densya(ホスト名) – 数字は覚えにくいがホスト名は覚えやすい
ホスト名はコンピュータ名だと思ってください。人間でいえば氏名のようなものです。このホスト名とIPアドレスを紐づけて管理すればわざわざ覚えにくい数字のIPアドレスを覚えなくても通信できるようになります。しかし、ホスト名は単純すぎてすぐに飽和してしまいます。人間の名前も同じ氏名の人は日本全国にたくさんいます。
そこで、ドメイン名という住所のようなもので管理する方法を使います。東京都渋谷区桜丘町1-1の山田太郎のようにすることで分かりやすくしています。
住所の例をFQDNっぽく表現すると「山田太郎.1-1桜丘町.渋谷区.東京都.日本」で山田太郎がホスト名、1-1桜丘町.渋谷区.東京都.日本がドメイン名ですね。右に行くほど規模が大きくなります。
www.example.jpのwwwはホスト名、example.jpはドメイン名です。
- okaimono.com
- okaimono.jp
はどちらも同じホスト名ですが別のアドレスです。ホスト名だけよりもたくさん表現できますね。