DNSトラブルシューティング · 2 min read · Oct 03, 2025
一般的なDNS設定ミスのトラブルシューティング
一般的なDNS設定ミスのトラブルシューティング
DNS (ドメインネームシステム) は、インターネットを利用するほとんどの人には知られていないかもしれませんが、インターネットを駆動する目に見えない力です。これがなければ、誰もが数字やIPアドレスを見ていることになるでしょう。ドメイン名の意味は、DNSのおかげで今日存在しています。
はじめに
DNSを一行で説明する最も簡単な方法は、ドメイン名をIPアドレスにマッピングすることです。誰かがIEやFirefoxにドメイン名を入力すると、ブラウザはISP(インターネットサービスプロバイダー)のリゾルバーからIPアドレスを要求するDNSリクエストを転送し、リゾルバーはルートサーバーに連絡し、数ミリ秒のうちにIPアドレスを体系的に取得します。
DNSとその動作を理解することは、最も難しいコンピュータ工学のテーマの一つであり、経験豊富なネットワーク管理者でさえ、DNSゾーンファイルの作成に関しては苦労することがあります。
この記事を進める前に、以下の最も重要なポイントを覚えておいてください。そうしないと、少しも理解できないでしょう。
覚えておくべきポイント
- Aレコードには常にIPアドレスが含まれている必要があります(ホストをIPにマッピング)
Aレコードを指定する際は、右側にIPアドレスを含める必要があります。AレコードはDNSにおいて非常に重要であり、これがなければホスト名をIPにマッピングする意味がありません。これを忘れないでください!
CNAME(エイリアス)にはホスト名を含める必要があります。ここにIPはありません。
NSおよびMXレコードにはホスト名を含める必要があります。IPは許可されていません。
DNSゾーンファイルでドメイン名を指定する際は、必ず最後にドットを使用してください。このドットは非常に重要で、これを忘れるとDNS設定で悪夢を見ることになります。
例えば
example.com. IN NS ns1.example.com.
なぜドットが必要かというと、ルートサーバーからクエリを開始することを示すからです(ドットで示されます)。
- MXレコード(メールサーバー用)にはホスト名を含める必要があり、IPは含めてはいけません。
一般的なDNS用語とその意味
(i) グルーレコード
グルーレコードは、NSレコードに関連付けられたAレコードで、NSレコードのネームサーバーに「ブートストラップ」情報を提供します。(RFC 1912 セクション 2.3を参照)
domain.com. IN NS ns1.domain.com. domain.com. IN NS ns2.domain.com.
ns1 IN A 11.33.55.77 ns2 IN A 22.44.66.88
上記の例では、各NSレコードをIPアドレス(Aレコード)にマッピングして、ネームサーバーをIPにバインドしています(つまり、グルーしています)。
(ii) LAMEネームサーバーの委任
非権威的な回答を返すネームサーバーは通常、「LAME」と呼ばれます。すべてのドメインには少なくとも2つのネームサーバーが必要であり、各ネームサーバーに問い合わせた場合、ドメインゾーン情報があれば権威ある回答が得られます。そうでなければ、それは「LAME委任」です。RFC 1912 セクション 2.8を参照してください。
LAME委任の例は次のとおりです。
domain.com IN NS ns1.domain.com domain.com IN NS ns2.example-server.net
ns1.domain.comはドメインに関するゾーン情報を持つように設定されていますが、ns2.example-server.netは正しく設定されておらず、ドメインに関する情報を持っていません。したがって、ns1は権威ある回答を返しますが、ns2は返さず、正しく設定されるまで「LAME」となります。
より深く理解するために、digツールを使用してexample.comを調べてみましょう。
- まず、example.comのネームサーバーを見つけます:
dig example.com NS;; ANSWER SECTION: example.com. 158240 IN NS a.iana-servers.net. example.com. 158240 IN NS b.iana-servers.net.
- 2つのネームサーバーを受け取ったので、各ネームサーバーに権威ある回答を返すかどうかを尋ねます。権威がある場合、受信した回答のヘッダーに「aa」フラグが設定されます(「aa」は権威ある回答です)。
dig @b.iana-servers.net example.com NS
dig @a.iana-servers.net example.com NS
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60896
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;example.com. IN NS
;; ANSWER SECTION:
example.com. 172800 IN NS a.iana-servers.net.
example.com. 172800 IN NS b.iana-servers.net.
フラグを見てください。
flags: qr aa rd
回答に「aa」が設定されているので、example.comの両方のネームサーバーは権威ある回答を提供します。LAME委任の場合、権威ある回答は得られません。
注意:
CNAME(エイリアス)をNSレコードと一緒に使用しないでください。これは多くのリゾルバーを混乱させ、ループを引き起こし、しばしば「LAME」委任につながります。
domain.com. IN NS ns1.domain.com. domain.com. IN NS ns2.domain.com. domain.com. In CNAME ns9.example-server.net
したがって、NSレコードと一緒にCNAMEを使用しないでください。
(iii) ステルスネームサーバー
ステルスネームサーバー(または隠れたネームサーバー)は、ドメイン内のネームサーバーに対してルートレベルで不一致または矛盾するネームサーバーです。
これを説明するために、親サーバーにNSレコードについて問い合わせると、次のようになります。
ns0.domain.com ns2.domain.com ns3.domain.com
しかし、ドメインのネームサーバーに問い合わせると、NSレコードは同じではなく、次のようになります。
ns0.domain.com ns2.domain.com ns.example-dns.net
ns.example-dns.netとns3.domain.comは隠れているため、両方とも「ステルスネームサーバー」です。これには問題はありませんが、ルートレベルとDNSサーバーの両方にステルスネームサーバーを持たないことをお勧めします。
ルートサーバーレベルでNSレコードを調べるには、digコマンドを使用できます。
dig +trace @K.root-servers.net example.com NSドメインのネームサーバーの1つに問い合わせるには、
dig @ns0.domain.com example.com NS2つのクエリ間でNSの不一致を探してください。ルートレベルでネームサーバーが欠けている場合は、ドメインレジストラに欠けているネームサーバーを追加してください。ドメインレベルでネームサーバーが欠けている場合は、ドメインのゾーンファイルにネームサーバーを追加し、すべてのセカンダリネームサーバーを更新してください。
(iv) オープンDNSサーバー
DNSサーバーを「オープン」に実行することは大きなセキュリティリスクです。なぜなら、内部および外部のネットワークからの再帰的なクエリに応答するからです。つまり、誰でもあなたのサーバーにIPアドレスを問い合わせることができ、あなたのDNSサーバーがそれに応答します。
これを説明するために、example.comのためにbindを実行している2つのネームサーバーがあります。
ns1.example.com ns2.example.com
ns1.exampleに外部ドメインgoogle.comを解決するように依頼し、回答セクションにIPアドレス(Aレコード)が表示される場合、それは「オープンDNSサーバー」であることを意味します。
dig @ns1.example.com google.com
dig @ns2.example.com google.com;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 12107
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;google.com. IN A
;; Query time: 32 msec
回答セクションやIPアドレスがないため、両方のネームサーバーはオープンDNSサーバーではありません。
bind8以降を実行している場合は、オプション内で「recursion no」を設定するだけで、DNSサーバーが再帰的なクエリに応答しないようにできます。
options { …. recursion no; }
(v) ゾーン転送(AXFRリクエスト)
ゾーン転送は、セカンダリネームサーバーがマスターまたはプライマリネームサーバーからドメインの最新かつ更新されたゾーン情報を取得するために行われます。ゾーン転送は、セカンダリネームサーバーにのみ利用可能であり、オープンな世界には公開されるべきではありません。これは大きなセキュリティリスクであり、攻撃者にネットワークの内部をさらけ出す可能性があります。
example.comのゾーン転送をリクエストするには、まずマスターネームサーバーに問い合わせる必要があります。以下の例をdigで確認してください。
dig @ns1.example.com example.com出力に完全なゾーンファイルが表示される場合は、ゾーン転送を無効にする必要があります。ほとんどの場合、接続失敗または拒否されることが表示され、ゾーン転送が許可されていないことを意味します。これは良いことです。
ゾーンファイル作成における一般的なDNSエラー
1. NSレコードを指すCNAMEがない
domain.com. IN NS ns1.domain.com. domain.com. IN NS ns2.domain.com. domain.com. In CNAME ns9.example-server.net —–> 間違い
CNAMEをNSと一緒に配置すると、すべてのネームサーバーが失敗し、LAME委任が発生します。そうしないでください!
RFC1912 2.4およびRFC2181 10.3を参照してください。
2. 同じサブネット(/24)または同じサーバー上でDNSサーバーを実行しない
DNSの目的は、ネームサーバーが異なる地理的場所に分散されることであり、1つのDNSが失敗した場合に他のDNSが機能することです。両方のネームサーバーを同じサーバーまたはサブネットで実行することは非常に一般的な慣行ですが、障害耐性を提供しません。サーバーが失敗すると、ネームサーバーも失敗し、サイトが読み込まれなくなります。
ns1 IN A 75.33.22.xx —–> 同じサブネット /24 ns2 IN A 75.33.22.xx —–> 同じサブネット /24
3. 適切なグルー
常にAレコードを使用してNSレコードにIPアドレスを追加してください。これを怠ると、ネームサーバーの1つが失敗します。
domain.com. IN NS ns1.domain.com. domain.com. IN NS ns2.domain.com.
ns1 IN A 1.2.3.4 —–> グルー ns2 IN A 2.4.6.9 —–> グルー
RFC1912を参照してください。
4. 重複したMXレコードがない
domain.com. IN MX mail.domain.com. domain.com. IN MX mail.domain.com —-> 重複
5. UDPおよびTCP接続の両方に対してポート53を許可する
ファイアウォールを使用している場合は、DNSのTCPおよびUDPリクエストのためにポート53をブロックしないようにしてください。デフォルトでは、DNSルックアップはUDPプロトコルを使用し、ゾーン転送および通知はTCPプロトコルのポート53を使用します。
ポート53 UDP = DNSリクエスト
ポート53 TCP = ゾーン転送
6. CNAMEはMXホストと共存できません。
MXレコードを指すCNAMEまたはエイリアスを指定しないでください。
domain.com. IN MX 10 mail.domain.com. mail IN CNAME domain.com. ———-> 間違い
代わりにAレコードを使用してIPアドレスに直接マッピングしてください。
mail IN A 11.33.55.77 —> 正しい
RFC1912を参照してください。
7. MXレコードにはIPアドレスを含めてはいけません
domain.com. IN 10 MX mail.domain.com. —-> 正しい
domain.com. IN 20 MX 11.22.33.44 —–> 間違い
これを正しく行う方法は、MXホストをAレコードにグルーすることです。
domain.com. IN MX 10 mail.domain.com. —–> 正しい
mail IN A 11.33.55.77 ———-> 正しい
8. NSレコードにはIPアドレスを含めてはいけません
常にNSレコードでドメインのネームサーバーを指定してください。それは名前であり、IPアドレスではありません。
domain.com. IN NS dns0.domain.com. —–> 正しい
domain.com. IN NS 75.xx.xx.xx ———–> 間違い
メール配信のための逆DNS
適切なメール配信のために、以下のアンチスパム手法は、メールがユーザーの受信トレイに配信されることを確認するために非常に重要です。ほとんどの公共のメールサービスプロバイダー(Yahoo、Hotmail、Gmailなど)は、これらのパラメータを使用してメールがスパムかどうかを判断します。
(i) メールサーバーの逆IPをDNSにPTRで設定する(専用IPが必要)
(ii) DNSにSPFレコードを設定する
(iii) ドメインキーを設定する
共有ホスティングプランを使用している場合、ほとんどのメールがユーザーの受信トレイのスパム/バルクフォルダに入ることを何度も見てきました。したがって、専用サーバーを使用してください。
メールサーバーIPの逆IPを設定する
逆IPを設定するには、最初にホスティングプロバイダーにリクエストを送信し(彼らがIPアドレスを所有しているため)、メールサーバーに逆IPを設定するように依頼する必要があります。それが完了したら、ドメインゾーンファイルにPTRを使用して行を追加する必要があります。
逆IPルックアップをテストするには:
host 逆DNSの出力が表示されます。
SPFレコードを設定する
SPFレコードは、DNSゾーンファイルのTXTレコードを使用して設定されます。以下に示すようになります。設定と構成の詳細については、http://openspf.orgを訪問してください。
domain.com. IN TXT “v=spf1 a mx ip4:11.33.55.77 -all”
digを使用してSPFレコードを照会するには:
dig domain.com TXTドメインキー
基本的に、生成された公開鍵とともにアンダースコアを使用してTXTの下に配置された2つのレコード(セレクターありおよびなし)を含みます。
「sel」はセレクターであり、セレクター名であることができます。
BIND9を使用してドメインのDNSネームサーバーを設定する方法
Linuxコンソールに移動し、次のコマンドを入力します。
yum install bindドメインの新しいゾーンファイルを作成し、サンプルゾーンファイルを挿入します(以下を参照)。domain.com、シリアル、およびメールパラメータを変更する必要があります。
nano /var/named/domain.com.db
/etc/named.confを開き、次の行を配置します:
zone “domain.com” { type master; file “/var/named/domain.com.com.db”; };
ファイルへの変更を保存し、bindを再起動します。
service named restart BIND用のサンプルDNSゾーンファイル
このファイルを使用して、BIND9でドメインとネームサーバーを設定します:
;=================================================================
;サンプルBIND DNSゾーンファイル
;任意のドメイン用(domain.comをあなたのサイトに変更するだけ)
;================================================================
; 開始する前に、ドットとシリアルのインクリメントを忘れないでください
$TTL 14400
$ORIGIN domain.com.
; SOAレコード
; プライマリネームサーバーns1.domain.comを指定
; シリアルは更新ごとにインクリメントする必要があります
@ 14400 IN SOA ns1.domain.com. webmaster.domain.com. ( 2009092902 ; YYYYMMDDXX形式のシリアル(XXはインクリメント)
10800; リフレッシュ秒
3600; リトライ
604800; 有効期限
38400; 最小
); ; Aレコードで指定されたウェブサイトのIPアドレス
IN A xx.xx.xx.xx
; 最低2つのDNSネームサーバー名
IN NS ns1.domain.com.
IN NS ns2.domain.com.
; すべてのネームサーバーとその対応するIP(グルー)をマッピング
ns1 IN A xx.xx.xx.xx
ns2 IN A xx.xx.xx.xx
; CNAMEレコードを使用して、ここに任意のサブドメインとwwwエントリを指定
www IN CNAME domain.com.
ftp IN CNAME domain.com.
server IN CNAME domain.com.
webmail IN CNAME domain.com.
; MXレコードを設定(優先度付きメール交換)
domain.com. IN MX 10 mail.domain.com.
; メール用のAレコードを設定
mail IN A xx.xx.xx.xx;====================================
著者について
バラクリシュナン氏は、インターネット起業家であり、PHPプログラミングとLinuxアプリケーションに興味を持つLinux管理者です。彼は自分のブログサイトcorpocrat.comまたはTwitterページで連絡を取ることができます。
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。