Linux応用コース3/11
DNSサーバーについて知ろう
DNSについて解説します。
DNSは、実際にサイトが表示されるまでの過程で活躍するシステムです。ご自身でWebアプリケーションを作成される際にも役立つ基礎的な知識となりますので、こちらの解説で理解を深めていきましょう!
ドメインとは
Domainとは「領地、領域、区域」という意味を持ち、国や組織などの単位で識別する領域のことです。
DNSでは、ドメインを木構造(ツリー構造)と呼ばれる階層構造で管理しています。その構造体全体を名前空間やドメイン名空間と呼びます。
名前空間
木をひっくり返したような形をしていることから、木構造と呼ばれる構造をしています。
各階層のドメインにはそれぞれDNSサーバーが配置されています。
木構造の一番上を木の根元と見なしてroot(ルート)と呼び、ルートに配置されているサーバーをルートDNSサーバーと呼びます。
ルートDNSサーバーは世界中に13台しか存在しません。このルートは、その一つ下の階層であるトップレベルドメインに配置されているDNSサーバーの情報を管理しています。
その下の階層にはセカンドレベルドメインが続いていて、この階層のサーバー情報は一つ上の階層であるトップレベルドメインのサーバーが管理しています。
このように、各DNSサーバーは自分のドメイン配下のドメインを管理し、それぞれが管理している範囲をゾーンと呼びます。
ゾーンの名前解決のための情報をゾーン情報、ゾーン情報が記述してあるファイルをゾーンファイルと呼びます。
DNSレコード
ゾーンファイル内の1行1行の情報をDNSレコードと呼びます。
※ レコード(record)とは「行」を意味する単語です。
DNSレコードの種類
ゾーン内の各レコードはいくつかの種類があります。
レコード名 | 役割 |
---|---|
Aレコード | ドメイン名に対応するIPアドレス(IPv4)を指定する行 |
AAAAレコード | ドメイン名に対応するIPアドレス(IPv6)を指定する行 |
PTRレコード | IPアドレスに対応するドメイン名を指定する行 |
CNAMEレコード | ドメイン名の別名を指定する行 |
SOAレコード | ゾーンに関するさまざまな情報を記述する行 |
NSレコード | ゾーン管理の委託先のサーバーを指定する行 |
MXレコード | ドメイン宛のメールのメールサーバーを指定する行 |
TXTレコード | テキスト情報を指定する行 |
SPFレコード | 送信ドメイン認証を行う(メールの送信元が本人であるかを証明する)ための行 |
SRVレコード | ドメインで提供されているサービスの詳細情報を記述する行 |
DNSレコードの設定を誤ると、ドメイン名とIPアドレスの名前解決が正しく行われず、Webサイトへアクセス出来なくなる事にもなります。レコードをすべて覚える必要はありませんが、Aレコード~SOAレコードは、DNSサーバーの設定を行う際に役立ちます。
ドメインの種類
ドメインにはいくかの種類があります。
- トップレベルドメイン(TLD)
一番右側の文字列です。.com
, .org
, .site
, .jp
など国や分野、用途を表す文字列になっています。ドメイン名空間では、ルートの一つ下の階層に配置されています。
- セカンドレベルドメイン(SLD)
右から2番目の文字列です。YouTube(www.youtube.com
)であれば.youtube
、Yahoo! Japan(www.yahoo.co.jp
)であれば、.co
がSLDです。
ドメイン名空間では、TLDの一つ下の階層に配置されています。
左側に続く.
で区切られた第3、第4の文字列にはそれぞれ、サードレベルドメイン、フォースレベルドメインという名前が付けられていきます。
ドメイン名とは
ドメイン名(Domain Name)は、URLの一部のことであり、IPアドレスに紐付けられている文字列のことです。
たとえば、YouTubeのURLhttps://www.youtube.com/
のうち、https://
のあとのホスト名*¹とドメイン名を合わせた部分(www.youtube.com/
)を FQDN*²と呼びます。
Webサイトを提供しているWebサーバーは、IPアドレス*³で識別されます。
しかしこのIPアドレスは人間にはなかなか分かりにくいため、文字列で表したのがドメイン名です。YouTubeのURLのうち youtube.com
がドメイン名です。
これによって、わたしたちはYouTubeのIPアドレスを知らずとも、youtube.com
でYouTubeを閲覧することができます。
※ ホスト名とは、インターネット上のコンピュータ(これを”ホスト”と呼びます)の名前です。上記の例のwww
という部分にあたります。ネットワーク上にコンピュータが一つしかない場合などは、ホスト名を省略することもできます。
※ FQDN(Fully Qualified Domain Name, 完全修飾ドメイン名)とは、サーバーを完全な形(「ホスト名」+「ドメイン名」)で表すドメイン名のことです。
※ IPアドレスとは、インターネット上にあるコンピュータの住所のようなものです。
詳細に関しましては『Envader > Linux基礎コース > IPアドレス/Macアドレス』の解説記事をご参照ください。
DNSとは
DNSは、ドメインネームシステム(Domain Name System)の略称で、インターネット上のドメインを管理するための仕組みです。ポート番号は53番です。
DNSサーバーとは
DNSサーバーはドメインを管理しており、名前解決という機能を提供するサーバーです。
名前解決は、ドメイン名をIPアドレスに変換する仕組みのことです。検索したWebページが画面に表示されるまでの流れを確認してみましょう。
たとえば、YouTubeを閲覧するために、ブラウザでURL(https://www.youtube.com/
)を入力して検索したとします。
すると、ブラウザは「このURLのドメイン名(youtube.com
)に紐付けられているIPアドレスを教えてください!」とDNSサーバーに問い合わせます。
すると、DNSサーバーは名前解決をして「そのドメイン名のIPアドレスは172.23.224.1
だよ!」というように、IPアドレスをブラウザに返します。
ブラウザはそのIPアドレスを受け取り、IPアドレス(Webサーバーの住所)に「YouTubeのホーム画面のページをください!」というリクエストを飛ばします。
リクエストを受け取ったサーバーは該当するページをブラウザに返して、ブラウザは受け取ったページを端末の画面に表示します。
つまり、DNSサーバーが名前解決をしてくれるからこそ、人間はドメイン名さえ分かっていれば見たいサイトにアクセスできるというわけです。
DNSサーバーの種類
DNSサーバーには大きく分けてキャッシュDNSサーバーと権威DNSサーバーの2種類があります。
キャッシュDNSサーバー
クライアント(ブラウザ)が最初に問い合わせるDNSサーバーです。
以前に権威DNSサーバーに問い合わせて取得したゾーン情報を一定期間キャッシュしています。
※「キャッシュする」とは、何かしらの情報を保持・管理していることです。
キャッシュしている情報が再度問い合わせられた場合には、権威DNSサーバーに問い合わせることなく、直接クライアントに情報を返します。
そのため、権威DNSサーバーの負荷を軽減させられたり、応答を返す速度が速まったりするといったメリットがあります。
対象のゾーン情報がない場合は、権威DNSサーバーに問い合わせます。
権威DNSサーバー
権威サーバーとは実際にドメインとIPアドレスの対応情報の一覧を保持しているDNSサーバーで、キャッシュDNSサーバーからの問い合わせを受けてIPアドレスを返します。
権威サーバーはドメインレベル毎の情報をもったサーバーが階層化されており、ドメインの問い合わせがあった場合はルートDNSサーバーから始まり、トップレベルドメイン群のDNSサーバー、セカンドレベルドメイン群のDNSサーバーへと下位のレベルドメインを辿っていくことで対応するIPアドレスを返す仕組みになっています。
【TIP-1】13台しかないルートDNSサーバーは なぜダウンしないの?
たとえば、www.yahoo.co.jp
のIPアドレスが知りたい場合、キャッシュDNSサーバーにco.jp
のゾーン情報があるとします。この場合には、SLDの権威DNSサーバーに最初に問い合わせることになります。
もしくは、yahoo.co.jp
のゾーン情報を保持しているという場合であれば、サードレベルドメインの権威DNSサーバーに最初に問い合わせることになります。
つまり、キャッシュされているゾーン情報によって、最初に問い合わせるべきDNSサーバーは変わってきます。
多くの場合、何かしらのキャッシュがあるため、わざわざルートDNSサーバーに問い合わせることはありません。世界に13台しかなくてもルートDNSサーバーがダウンしないのはこのためでもあります。
【TIP-2】正引きと逆引き
名前解決の方法には、正引きと逆引きの2つがあります。
- 正引き:ドメイン名からIPアドレスに変換する方法。
- 逆引き:IPアドレスからドメイン名に変換する方法。
この2つによって、ドメイン名とIPアドレスの両方から変換できます。
nslookupコマンドとは
nslookup
は、DNSサーバーに任意のドメイン名の名前解決を問い合わせるためのコマンドです。正引きも逆引きも両方できます。
resolv.conf
resolv.conf
ファイルは/etc/resolv.conf
のようにetc配下にある名前解決の設定を行うファイルです。resolv.conf
内のnameserver
に記述されたDNSサーバーに名前解決の問い合わせを行います。nameserver
を複数定義することもでき、その際の名前解決の順番は上から記述された順に問い合わせが行われ、一つ目のDNSサーバーへ問い合わせを行い、名前解決ができなかったら二つ目のDNSサーバーへ問い合わせを行い名前解決を行います。DNSサーバーを複数台指定することで、一つ目のDNSサーバーが障害を起こして名前解決できない場合、それ以降のDNSサーバーで対応できるので冗長化のために設定します。
resolv.conf例
resolv.conf
で指定できる項目にはnameserver
、domain
、search
があります。
前述したようにnameserver
にはDNSサーバーを指定し、最大3台まで指定できます。domain
には自動補完してくれるドメイン名が指定できます。例えばdomain
にexample.com
と指定し、ssh接続の際にssh envader
と入力すると、ssh envader.example.com
と自動で補完され、同様の結果を得ることができます。search
も役割はdomain
と同じですが、複数のドメインを指定することができます。
domain example.com
nameserver 8.8.8.8 #GoogleのDNSサーバー
nameserver 2001:ce8:181:60ab:c225:a2ff:fe3f:eab4
nameserver 192.168.0.1
nslookupコマンドの実行方法には、非対話モードと対話モードがあります。
非対話モード
コマンドのあとには、ドメイン名、もしくは、IPアドレスを指定します。DNSサーバーの指定は省略しても構いません。
指定しない場合は、/etc/resolv.confファイルに記載されているDNSサーバーに問い合わせます。
nslookup [ドメイン名/IPアドレス] [DNSサーバーのIPアドレス]
ファイルの中のnameserver
の後ろには、問い合わせるDNSサーバーのIPアドレスが表示されます。
cat /etc/resolv.conf
nameserver [IPアドレス]
それでは、実際にnslookupコマンドを使って、Yahoo! Japanのドメイン名の名前解決をしてみましょう。(Yahoo! Japanのドメイン名はyahoo.co.jp
です。)
nslookup yahoo.co.jp
# こちらは、使用したDNSサーバーのIPアドレスです。
Server: [IPアドレス]
Address: [IPアドレス]#53
# こちらが応答(名前解決の結果)です。
Non-authoritative answer:
Name: yahoo.co.jp
Address: 182.22.16.251
Name: yahoo.co.jp
Address: 183.79.217.124
Name: yahoo.co.jp
Address: 183.79.250.123
Name: yahoo.co.jp
Address: 183.79.250.251
Name: yahoo.co.jp
Address: 183.79.219.252
Name: yahoo.co.jp
Address: 182.22.25.252
Name: ns01.yahoo.co.jp
Address: 118.151.254.133
Name: ns02.yahoo.co.jp
Address: 118.151.254.149
Name: ns11.yahoo.co.jp
Address: 124.83.255.37
Name: ns12.yahoo.co.jp
Address: 124.83.255.101
次に、DNSサーバーを指定してみましょう。問い合わせるDNSサーバーとして Google Public DNS 8.8.8.8
を指定し、98.139.183.24
というIPアドレスからドメイン名を調べてみます。
※ Google Public DNSとは、Googleが提供するパブリックDNSです。パブリックDNSとは、インターネットに接続しているすべての人が利用できるDNSサーバーです。Google Public DNSのIPアドレスは8.8.8.8
、もしくは、8.8.4.4
です。一般的には優先DNSサーバーである8.8.8.8
の方がよく使われます。
nslookup 98.139.183.24 8.8.8.8
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
24.183.139.98.in-addr.arpa name = ir2.fp.vip.bf1.yahoo.com.
Authoritative answers can be found from:
nameに結果が表示されています。ir2.fp.vip.bf1
がホスト名でyahoo.com
がドメイン名ですね。
対話モード
対話モードを起動するには、nslookup
コマンド、もしくは、その後にnslookup - [DNSサーバーのIPアドレス]
という形で実行します。
すると、入力待ち状態になるので >
のあとにドメイン名かIPアドレスのどちらかを入力して〈Enterキー〉を押すことで、名前解決の問い合わせができます。
対話モードを終了するには、exit
を実行するか、「Ctrl+D」(Macならcommand+D)を押します。
nslookup
>
-----------------------------------------------------------------------------------
# もしくは、
nslookup - [DNSサーバーのIPアドレス]
>
実際に、nslookupコマンドでApple(apple.com
)のIPアドレスを問い合わせてみます。
nslookup
> apple.com
Server: [IPアドレス]
Address: [IPアドレス]#53
Non-authoritative answer:
Name: apple.com
Address: 17.178.96.59
Name: apple.com
Address: 17.172.224.47
Name: apple.com
Address: 17.149.160.49
# 対話モードを終了します。
> exit
【TIP-3】hostコマンドとdigコマンド
hostコマンド
hostコマンドは、ドメイン名からIPアドレス、逆にIPアドレスからドメイン名を確認したい場合にDNSサーバーに名前解決の問い合わせをするコマンドです。特定のDNSサーバーを指定することもできますが、デフォルトでは/etc/resolv.conf
のDNSサーバーに問い合わせを行います。
ドメイン名からIPアドレスを確認する場合、host ドメイン名
と入力し、逆にIPアドレスからドメイン名を確認する場合はhost IPアドレス
と入力します。
% host envader.plus #ドメイン名からIPアドレスを確認
envader.plus has address 34.111.64.3 #envader.plusのIPアドレスは34.111.64.3
% host 34.111.64.3 #IPアドレスからドメイン名を確認
% host envader.plus 8.8.8.8 #GoogleのDNSサーバーを使用した問い合わせ
問い合わせるDNSサーバーの変更
名前解決の際に使用するDNSサーバーをデフォルトのものではなく、特定のDNSサーバーを使用することもできます。特定のDNSサーバーを使用しての問い合わせを行う場合はhost (ドメイン名/IPアドレス) DNSサーバー
と入力します。
% host envader.plus 8.8.8.8 #GoogleのDNSサーバーを使用した問い合わせ
hostコマンド主なオプション
オプション | 説明 |
---|---|
-a | DNSに登録されているレコードのすべてを検索し,結果を詳細表示する。 |
-v | 詳細な情報を表示 |
-d | デバックモード。 詳細な情報を表示する。 |
-r | 指定されたDNSサーバー内の情報のみ検索 |
-4 | 問い合わせにIPv4のみを使用 |
-6 | 問い合わせにIPvのみを使用 |
digコマンド
dig
コマンドはhost
コマンド、nslookup
コマンドと同じように、名前解決の問い合わせを行うコマンドです。正引きも逆引きも両方できます。host
コマンドに比べ詳細な情報を得ることができ、nslookup
コマンドとは違って、DNSサーバーのレスポンスをほとんどそのままの形式で表示します。
そのため、見やすく加工したnslookup
コマンドの出力ではなく、もっと生の出力内容を確認したいという場合にはdig
コマンドがうってつけです。
# Yahoo! JapanのIPアドレスを問い合わせます。
dig yahoo.co.jp
; <<>> DiG 9.16.1-Ubuntu <<>> yahoo.co.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62796
;; flags: qr rd ad; QUERY: 1, ANSWER: 10, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;yahoo.co.jp. IN A
;; ANSWER SECTION:
yahoo.co.jp. 0 IN A 183.79.250.123
yahoo.co.jp. 0 IN A 183.79.250.251
yahoo.co.jp. 0 IN A 183.79.217.124
yahoo.co.jp. 0 IN A 182.22.25.252
yahoo.co.jp. 0 IN A 183.79.219.252
yahoo.co.jp. 0 IN A 182.22.16.251
ns01.yahoo.co.jp. 0 IN A 118.151.254.133
ns02.yahoo.co.jp. 0 IN A 118.151.254.149
ns11.yahoo.co.jp. 0 IN A 124.83.255.37
ns12.yahoo.co.jp. 0 IN A 124.83.255.101
;; Query time: 40 msec
;; SERVER: [使用したDNSサーバーのIPアドレス]#53(使用したDNSサーバーのIPアドレス)
;; WHEN: Wed Feb 09 08:50:41 JST 2022
;; MSG SIZE rcvd: 264
また、nslookup
コマンドはキャッシュDNSサーバーをターゲットとしているため、権威DNSサーバーなどの他のサーバーに問い合わせた場合、レスポンスの内容が不十分なことがあります。
それに対しdig
コマンドは、権威DNSサーバーをターゲットとしているため、権威DNSサーバーの動きを調べたいときには向いています。
プライマリDNSサーバーを確認する
プライマリDNSサーバー、セカンダリDNSサーバーによる冗長化
コンテンツDNSサーバーは、ドメインの名前解決を行うサーバーなので、仮にコンテンツDNSサーバーに障害が発生するとそのドメインへのアクセスを行うことができません。このような事態を防ぐために、基本的にはコンテンツサーバーを複数台用意します。メインのコンテンツDNSサーバーをプライマリDNSサーバー、その他をセカンダリDNSサーバーと呼びます。管理者はプライマリDNSサーバーのゾーン情報のみ設定を行うと、プライマリDNSサーバーからセカンダリDNSサーバーへと自動的に同期されます。
プライマリDNSサーバーの確認
プライマリDNSサーバーの確認はdig ドメイン名 soa
と入力します。
dig envader.plus soa
;; ANSWER SECTION:
envader.plus. 3448 IN SOA ns-cloud-c1.googledomains.com. cloud-dns-hostmaster.google.com. 1 21600 3600 259200 300
まとめ
DNSの仕組みや、nslookup
コマンドについて学習しました。
今回は覚えることがたくさんあって混乱されたかもしれません。その場合は、もう一度この記事を読み直してみましょう。初めて読んだときよりもすんなり内容が理解できるはずです。
これを機にご自身でDNSについて調べたり、コマンドを叩いてみたりしながらさらに理解を深めていきましょう。
この記事がDNSを理解する上で少しでもお役に立てたなら幸いです。
問題を解くためには、十分な画面サイズのPC環境をご利用下さい。