DNS ゾーンファイル検証ツール
ゾーンファイルは表のように見えて、プログラムのように振る舞います。行が空白で始まるというだけの理由で直前のレコードのオーナー名を引き継ぎ、末尾にドットのない名前には現在のオリジンが黙って付き、`www IN CNAME example.com` は example.com.example.com. になります。ファイルの途中にある $ORIGIN や $TTL は、その下すべての意味を変えます。括弧で複数行に書かれたレコードは、どう字下げしても 1 レコードです。このツールは RFC 1035 第 5 章の定義どおりにファイルを解析します。引用符付き文字列、コメント、バックスラッシュのエスケープ、括弧による継続、BIND 8 形式の TTL 単位、オーナー名の継承規則をすべて扱ったうえで、そのファイルが実際に記述しているゾーンを表示します。オーナー名は完全修飾で、TTL はサーバーが実際に返す値で、タイプごとの件数とともに並びます。 解析に加えて、パーサーが行う理由のない検査も走ります。末尾のドットが抜けてオリジンが付いてしまう名前、RFC 1034 が禁じ多くのサーバーが読み込み自体を拒否する「CNAME と他レコードの同名共存」、自分自身に戻る CNAME の連鎖、ゾーン内にありながらアドレスレコードのない MX・NS・CNAME の宛先、TTL が 0 のレコード、重複したレコード、黙って捨てられるオリジン外の名前、日付形式でないシリアル、打ち間違いを何日もキャッシュに残すほど長いネガティブキャッシュ TTL を、それぞれ該当行とともに知らせます。解析に失敗した場合も、行番号とその行の内容を示します。 ただし、このツールはゾーンの内容が事実かどうかは判断できません。ネットワークに問い合わせないので、書いたアドレスがそのホストの実際のアドレスか、委任先のネームサーバーが本当に応答するか、貼り付けた TXT が事業者の期待する値と一致するかはわかりません。動いているゾーンではなくファイルを検査するため、データベースから生成されるレコード、問い合わせ時に展開されるワイルドカード、別ゾーンにある CNAME の宛先も視野の外です。実際の応答は DNS ルックアップのツールで確かめ、こちらはファイルを読み込ませる前、ドット 1 つがまだ何の代償も要求しないうちに使ってください。
下の表のオーナー名はすべて完全修飾に展開してあり、TTL はサーバーが実際に返す値です。
レコード
14
名前
7
タイプ
8
指摘
5
ファイル末尾での $ORIGIN
example.com.
デフォルト TTL
3600 ($TTL から)
プライマリ DNS サーバー
ns1.example.com.
MNAME です。セカンダリが転送を受けるマスターであり、NOTIFY の送信元でもあります。
管理者メールアドレス
hostmaster@example.com
ドメイン名の形で書かれた RNAME で、最初のラベルがアドレスのローカル部です。
シリアル
2026090301
この数値が増えたときだけセカンダリがゾーンを転送します。32 ビットのシリアル演算で比較されます。
Refresh
7200 (2h)
NOTIFY が届かなかった場合にセカンダリがシリアルを確認し直す間隔です。
Retry
3600 (1h)
更新に失敗したセカンダリが再試行するまでの待ち時間です。
Expire
1209600 (2w)
この時間だけ転送に成功しないと、セカンダリはそのゾーンへの応答をやめます。
ネガティブキャッシュ TTL
300 (5m)
RFC 2308 以降、このフィールドは NXDOMAIN 応答をキャッシュする上限であり、ゾーンの既定 TTL ではありません。
- エラー行 19末尾のドットがないため、オリジンが後ろに付きますexample.com → example.com.example.com.
- エラー行 20末尾のドットがないため、オリジンが後ろに付きますshops.myprovider.net → shops.myprovider.net.example.com.
- 警告行 19宛先はこのゾーン内にありますが、アドレスレコードがありませんCNAME → example.com.example.com.
- 警告行 20宛先はこのゾーン内にありますが、アドレスレコードがありませんCNAME → shops.myprovider.net.example.com.
- 警告行 21TTL が 0 なので、このレコードは一切キャッシュされませんold.example.com. A
| オーナー | TTL | クラス | タイプ | データ |
|---|---|---|---|---|
| example.com. | 3600 | IN | SOA | ns1.example.com. hostmaster.example.com. 2026090301 7200 3600 1209600 300 |
| example.com. | 3600 | IN | NS | ns1.example.com. |
| example.com. | 3600 | IN | NS | ns2.example.com. |
| example.com. | 3600 | IN | A | 192.0.2.10 |
| example.com. | 3600 | IN | AAAA | 2001:db8::10 |
| example.com. | 3600 | IN | MX | 10 mail.example.com. |
| example.com. | 3600 | IN | TXT | "v=spf1 mx -all" |
| example.com. | 3600 | IN | CAA | 0 issue "letsencrypt.org" |
| ns1.example.com. | 3600 | IN | A | 192.0.2.1 |
| ns2.example.com. | 3600 | IN | A | 192.0.2.2 |
| mail.example.com. | 3600 | IN | A | 192.0.2.3 |
| www.example.com. | 3600 | IN | CNAME | example.com.example.com. |
| shop.example.com. | 3600 | IN | CNAME | shops.myprovider.net.example.com. |
| old.example.com. | 0 | IN | A | 192.0.2.9 |
すべてブラウザー内で処理します。ファイルはアップロードされず、ネットワーク参照も行いません。
使い方
- ゾーンファイルを貼り付けます。内容はブラウザー内にとどまり、アップロードも名前解決も行いません。
- ファイルが $ORIGIN で始まるならオリジン欄は空のままで構いません。そうでない場合は、サーバー設定に書かれたゾーン名をそのまま入力します。同じファイルでもオリジンが違えば意味が変わります。
- 解析に失敗したら、行番号とその下に表示される行を確認します。エラーはパーサーが諦めた位置に出るため、閉じ忘れた引用符や括弧では実際の間違いより 1 行後になることがあります。
- SOA パネルを確認します。管理者アドレスはメールアドレスの形に直して表示され、各タイマーは秒数と読みやすい表記が並びます。
- 指摘は上から順に片付けます。エラー・警告・参考の順に並び、それぞれの行番号から問題のレコードにすぐ戻れます。
よくある質問
- CNAME がなぜ example.com.example.com. になるのですか。
- 宛先の末尾にドットがなかったからです。マスターファイルでは、ドットで終わらない名前はすべて現在のオリジンからの相対名であり、パーサーには "example.com" が完全修飾名のつもりなのか、ゾーン内の example.com というホストなのかを知る手立てがありません。この規則は CNAME だけでなくすべての名前フィールドに適用され、MX・NS・SRV の宛先や SOA のプライマリサーバーにも同じようにオリジンが付きます。ゾーンの外を指す名前には必ずドットを打ち、ゾーン内の名前はラベルだけで書く習慣が事故を防ぎます。
- $TTL のないファイルはエラーですか。
- 必ずしもそうではありません。RFC 1035 には $TTL ディレクティブ自体がなく、RFC 2308 がこれを追加して必須としましたが、dnspython を含む多くのパーサーは今も TTL のないレコードに SOA の minimum を使います。SOA が最初のレコードなら SOA 自身の TTL も minimum から来ます。逆に SOA も $TTL も現れる前に TTL のないレコードが出てくると、引き継ぐ値がないので本当のエラーになります。このツールはこの代替を参考として知らせ、実際に使われた値を示します。
- 同じ名前・タイプのレコードで TTL が違う場合、どちらが優先されますか。
- 厳密にはどちらでもありません。同じ名前とタイプのレコードは 1 つの RRset を作り、RRset は 1 つの TTL で応答されます。ファイルが複数の値を与えると、ローダーは最小値を残し、ログに警告も出しません。結果として 60 秒のレコードの隣にある 86400 秒のレコードも 60 秒になり、たいていは書いた人の意図と正反対です。このツールは表に実際に効く TTL を示し、値が上書きされた行を指摘します。
- ゾーン外の名前のレコードが表にないのはなぜですか。
- そのレコードがゾーンに入らないからです。ローダーはオーナー名がゾーンオリジンと同じかその下にあるレコードだけを保持し、それ以外はゾーン外データとして拒否ではなく黙って捨てます。正引きゾーンに貼り付けた PTR レコードや、$ORIGIN 行のあとに残った前のオリジン基準のレコードが、ファイルは正常に読み込まれるのに消えてしまうのはこのためです。このツールは捨てられる名前を指摘として並べ、少なくとも見えるようにします。
- TXT レコードは 255 文字を超えられますか。
- レコード全体は超えられますが、その中の 1 つの文字列は超えられません。DNS の character-string は長さを 1 オクテットで表すため 255 が上限で、それより長い引用符付き文字列は切り詰めではなく構文エラーになります。長い DKIM や SPF の値は 1 レコードの中で "前半" "後半" のように分けて書けば、サーバーが間に何も入れずに連結します。リゾルバーは断片をそのままアプリケーションに渡すので、任意の位置で切っても復元できますが、順序が正しいことが前提です。
- 構文が正しければ DNS は正しく動きますか。
- いいえ。解析が通ったのは構文が正しいという意味で、ここでの追加検査も内部の整合性の一部を見ているにすぎません。親ゾーンが自分のネームサーバーへ委任しているか、そのサーバーがこの版を読み込んだか、アドレスに到達できるか、上げたシリアルがセカンダリの持つ値より本当に大きいかは、ファイルからはわかりません。特にシリアルの比較は 32 ビットの巡回演算なので、日付を打ち間違えて値が小さくなると、数字が十分に一周するまでセカンダリが古いゾーンに留まることがあります。
関連ツール
DNS レコードリファレンス
DNS レコードタイプの検索可能なチートシート — A・AAAA・CNAME・MX・TXT・NS・SOA・PTR・SRV・CAA・DNSSEC・SVCB / HTTPS — 例付き。
TXT レコードスプリッター(255 バイトチャンク)
長い SPF、DKIM、または DMARC TXT レコードを、DNS プロトコルが要求する 255 バイトチャンクに分割 — BIND、汎用ゾーンファイル、Cloudflare、または Route 53 構文を出力。
DKIMレコード ビルダー & パーサー
DKIM の DNS TXT レコードを構築・解析 — 公開鍵と selector・鍵タイプ・ハッシュ・フラグを指定すれば、フルレコードと255文字超用の分割版まで生成。
CAA レコードビルダー (DNS 認証局権限制限)
CAA (Certificate Authority Authorization) DNS レコードを生成 — 信頼する CA だけがドメインの TLS 証明書を発行できるよう制限。
静的ライブラリ(.a)インスペクター
.a アーカイブをブラウザで読み取り、メンバーのサイズと日付、各オブジェクトが定義・要求するシンボル、シンボルインデックスが古くなっていないかを表示します。
TZif(zoneinfo)ファイル解析ツール
コンパイル済み zoneinfo ファイルをブラウザで開き、ヘッダー、時刻タイプ、全遷移、うるう秒、POSIX TZ フッターまで解析します。