DNS の仕組みと、部分的な DNS 障害をトラブルシューティングする方法
AWS の顧客は、ドメインネームシステム (DNS) を使用して解決されるドメイン名を使用して、AWS のリソースに接続します。RFC 1034 で導入された DNS は、「DNS 解決」と呼ばれるプロセスで、覚えやすい名前 (たとえばwww.example.com) を 192.0.2.1 のような数値の IP アドレスに変換することによってユーザーをインターネットアプリケーションにルーティングするために使用されます。 権威あるネームサーバーは、ドメイン名を IP アドレスに解決し、その IP アドレスを DNS リゾルバーのチェーンを介してクライアント (ウェブサイトの閲覧を要求しているユーザーのコンピューターなど) に渡します。その後、クライアントはその IP アドレスを使用してウェブサイトがホストされているサーバーに接続し、サーバーがウェブサイトをクライアントに提供します。DNS が正しく機能していないと、DNS サーバーがドメイン名を解決できないため、ウェブサイトがホストされているサーバーの IP アドレスをクライアントに提供することができません。つまり、そうしたウェブサイトはインターネットからアクセスできなくなります。AWS は、Amazon Route 53 およびサードパーティのサービスプロバイダーを使用して、AWS のドメイン名が常に解決可能であるための予防措置を講じています。
DNS は大規模な分散階層型データベースです。つまり、各ドメインに、そのドメインのリソースレコードに関する質問に答える一連の権威あるネームサーバーが必要です。大部分のドメイン所有者はプロキシに委任して DNS サービスを提供しますが、この一連の権威あるネームサーバーはドメイン所有者の管理下にあります。
クライアントがドメイン名の IP アドレスを解決する必要がある場合、クライアントマシンはこのプロセスをリゾルバーに渡し、リゾルバーは IP アドレスを見つけてそれをクライアントに返します。このプロセスは、以下のように機能します。
- ルートネームサーバのリストで事前設定されているリゾルバーは、これらのルートネームサーバの 1 つをランダムに選択し、それに対してトップレベルドメイン (TLD) の権威あるネームサーバのリストを要求します。
- ルートネームサーバは、TLD に対する権威あるネームサーバのリストと、それらの IP アドレスを返します。
- リゾルバーは、手順 2 で返されたネームサーバーの 1 つをランダムに選択し、ドメインに対する権威あるネームサーバーのリストを要求します。
- TLD サーバは、そのドメインに対して権威あるネームサーバのリストで応答します。
- リゾルバーはランダムに 1 つを選択し、その権威あるネームサーバからリソースレコードの IP アドレスを要求します。
DNS プロバイダーは複数の地域からサービスを提供し、通常はキャッシュされた結果を活用して可用性を向上させています。これは、DNS リゾルバーに関する一時的な問題を回避するのに役立ちますが、悪い結果がキャッシュされた場合 (たとえば、ネガティブキャッシュのため) は回復が長くなる可能性もあります。外部 DNS の問題が、EC2 リージョン内の AWS ドメイン名の DNS 解決に影響しないようにします。
一般的な DNS の障害は、1 つ以上の権威あるネームサーバーが応答を停止したときです。次の権威あるネームサーバーのリスト (委任セットとも呼ばれる) を持つ仮想ドメインを考えてみましょう。
- ns-576.awsdns-08.net.
- ns-1086.awsdns-07.org.
- ns-1630.awsdns-11.co.uk.
- ns-47.awsdns-05.com.
- pdns1.ultradns.net.
- pdns6.ultradns.co.uk.
ネームサーバが利用できない場合は、それに向けられた DNS クエリに応答できません。クライアントが回答を受け取らなかった場合は、別の権威あるネームサーバでリクエストを試すことができます。権威あるネームサーバが応答しないか、予期しない情報で応答する場合、ローカルリゾルバーは SERVFAIL メッセージを返します。
Linux タイプのオペレーティングシステムを使用して DNS 障害をトラブルシューティングするには、dig コマンドを使用します。dig は、ホストの /etc/resolv.conf ファイルで設定されているクライアント DNS サーバーに対して検索を実行します。
$ dig www.amazon.com
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.49.amzn1 <<>> www.amazon.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13150
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; 質問セクション:
;www.amazon.com. IN A
;; 回答セクション:
www.amazon.com. 41 IN A 54.239.17.6
;; Query time: 1 msec
;; SERVER: 10.108.0.2#53(10.108.0.2)
;; WHEN: Fri Oct 21 21:43:11 2016
;; MSG SIZE rcvd: 48
上記の例では、回答セクションに、54.239.17.6 が www.amazon.com の HTTP サーバーの IP アドレスであることが示されています。
+trace 変数を追加すると、dig は DNS レコードの再帰的ルックアップを実行することもできます。
$ dig +trace www.amazon.com
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.49.amzn1 <<>> +trace www.amazon.com
;; global options: +cmd
. 518400 IN NS J.ROOT-SERVERS.NET.
. 518400 IN NS K.ROOT-SERVERS.NET.
. 518400 IN NS L.ROOT-SERVERS.NET.
…
;; 10.108.0.2#53(10.108.0.2) から 508 バイトを 31 ms で受信
com. 172800 IN NS a.gtld-servers.net.
com. 172800 IN NS b.gtld-servers.net.
com. 172800 IN NS c.gtld-servers.net.
…
;; 193.0.14.129#53(193.0.14.129) から 492 バイトを 93 ms で受信
amazon.com. 172800 IN NS pdns1.ultradns.net.
amazon.com. 172800 IN NS pdns6.ultradns.co.uk.
…
;; 192.33.14.30#53(192.33.14.30) から 289 バイトを 201 ms で受信
www.amazon.com. 900 IN NS ns-1019.awsdns-63.net.
www.amazon.com. 900 IN NS ns-1568.awsdns-04.co.uk.
www.amazon.com. 900 IN NS ns-277.awsdns-34.com.
…
;; 204.74.108.1#53(204.74.108.1) からd 170 バイトを 87 ms で受信
www.amazon.com. 60 IN A 54.239.26.128
www.amazon.com. 1800 IN NS ns-1019.awsdns-63.net.
www.amazon.com. 1800 IN NS ns-1178.awsdns-19.org.
…
;; 205.251.195.251#53(205.251.195.251) から 186 バイトを 7 ms で受信
また、ネームサーバだけを返すクエリを実行することもできます。
$ dig -t NS www.amazon.com
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.49.amzn1 <<>> -t NS www.amazon.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48631
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0
;; 質問セクション:
;www.amazon.com. IN NS
;; 回答セクション:
www.amazon.com. 490 IN NS ns-1019.awsdns-63.net.
www.amazon.com. 490 IN NS ns-1178.awsdns-19.org.
www.amazon.com. 490 IN NS ns-1568.awsdns-04.co.uk.
www.amazon.com. 490 IN NS ns-277.awsdns-34.com.
;; クエリ時間: 0 msec
;; SERVER: 10.108.0.2#53(10.108.0.2)
;; WHEN: Fri Oct 21 21:48:20 2016
;; MSG SIZE rcvd: 170
この例では、www.amazon.com には以下の 4 つの権威あるネームサーバーがあります。
- ns-1019.awsdns-63.net.
- ns-1178.awsdns-19.org.
- ns-1568.awsdns-04.co.uk.
- ns-277.awsdns-34.com.
これらのサーバーはいずれも、www.amazon.com のホスト名に関する質問に権威ある回答ができるはずです。dig は、特定のネームサーバーチェックを直接ターゲットにして、特定のドメインに対してすべての権威あるネームサーバーが正しく応答するか確認するために使用できます。
以下は、権威あるネームサーバーの 1 つ (ns-1019.awsdns-63.net) に対する www.amazon.com へのクエリの出力です。www.amazon.com が 54.239.25.192 で利用可能であることを知らせて応答します。
$ dig www.amazon.com @ns-1019.awsdns-63.net.
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.49.amzn1 <<>> www.amazon.com @ns-1019.awsdns-63.net.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31712
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 0
;; 警告: 再帰が要求されましたが、利用できません
;; 質問セクション:
;www.amazon.com. IN A
;; 回答セクション:
www.amazon.com. 60 IN A 54.239.25.192
;; 権威セクション:
www.amazon.com. 1800 IN NS ns-1019.awsdns-63.net.
www.amazon.com. 1800 IN NS ns-1178.awsdns-19.org.
www.amazon.com. 1800 IN NS ns-1568.awsdns-04.co.uk.
…
;; クエリ時間: 7 msec
;; SERVER: 205.251.195.251#53(205.251.195.251)
;; WHEN: Fri Oct 21 21:50:00 2016
;; MSG SIZE rcvd: 186
次の行は、ns-576.awsdns-08.net が amazon.com の権威あるネームサーバであることを示しています。
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 0
aa フラグの存在は、ネームサーバー ns-1019.awsdns-63.net がリソースレコード www.amazon.com に対する権威ある回答を与えたことを示します。
Windows ベースのオペレーティングシステムでは、nslookup ユーティリティを使用します。nslookup は、次の例のように、ホスト名に関連付けられた IP アドレスを返します。
C:\>nslookup www.amazon.com
Server: ip-10-20-0-2.ec2.internal
Address: 10.20.0.2
Non-authoritative answer:
Name: www.amazon.com
Address: 54.239.25.192
nslookup ユーティリティを使用してホスト名に対する権威あるネームサーバーを特定するには、-type=NS フラグを使用します。
C:\>nslookup -type=NS www.amazon.com
Server: ip-10-20-0-2.ec2.internal
Address: 10.20.0.2
Non-authoritative answer:
www.amazon.com nameserver = ns-277.awsdns-34.com
www.amazon.com nameserver = ns-1019.awsdns-63.net
www.amazon.com nameserver = ns-1178.awsdns-19.org
…
www.amazon.com に対する ns-277.awsdns-34.com が www.amazon.com に対するリクエストに正しく応答するか確認するには、次の構文を使用します。
C:\>nslookup www.amazon.com ns-277.awsdns-34.com
Server: UnKnown
Address: 205.251.193.21
Name: www.amazon.com
Address: 54.239.25.200
Amazon Route 53、VPC、DNS
サポートが必要ですか? AWS サポートセンターをご覧ください。
公開日: 2016 年 12 月 5 日