NODATA
概要
NODATA は、DNS クエリに対してドメインは存在するがリクエストされたレコードタイプが存在しないことを示す応答です。独立したレスポンスコードではなく、RCODE = 0(NOERROR)かつ ANSWER SECTION が空の応答として表現されます。RFC 2308(1998年)でこの応答パターンの扱いが規定されています。
NODATA は NXDOMAIN と混同されやすい異なる応答です。NXDOMAIN は「ドメイン自体が存在しない」ことを示すのに対し、NODATA は「ドメインは存在するが、問い合わせたレコードタイプに該当するレコードがない」ことを示します。例えば example.com に A レコードは存在するが AAAA レコードが存在しない場合、AAAA クエリに対して NODATA が返ります。
再帰リゾルバーは NODATA 応答もネガティブキャッシュの対象とし、SOA レコードの MINIMUM フィールドと SOA TTL の小さい方を期間としてキャッシュします。新しい MX レコードを追加する前に NODATA がキャッシュされていると、メール配送に遅延が生じます。
仕組み
NODATA は、ドメインの存在とレコードタイプの不在を分けて扱う DNS の応答パターンです。
NODATA の応答構造
NODATA 応答は次の特徴を持ちます。
- RCODE は NOERROR(0)
- ANSWER SECTION が 空
- AUTHORITY SECTION に SOA レコードが含まれる
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45678
;; QUESTION SECTION:
;example.com. IN AAAA
;; ANSWER SECTION:
;(空)
;; AUTHORITY SECTION:
example.com. 300 IN SOA ns1.example.com. admin.example.com. (
2024010101 3600 900 604800 300 )
ANSWER SECTION が空であるため、一見するとエラーに見えますが、status: NOERROR であることがポイントです。ドメイン自体は存在しており、リクエストされたレコードタイプだけが存在しません。
NXDOMAIN との違い
NODATA と NXDOMAIN の違いを整理します。
| 項目 | NXDOMAIN | NODATA |
|---|---|---|
| RCODE | 3(NXDOMAIN) | 0(NOERROR) |
| ドメインの存在 | 存在しない | 存在する |
| ANSWER SECTION | 空 | 空 |
| AUTHORITY SECTION | SOA レコード | SOA レコード |
| ネガティブキャッシュ | 対象 | 対象 |
| 他のレコードタイプ | すべて存在しない | 存在する可能性がある |
NXDOMAIN が返ったドメインに A レコードを問い合わせても、MX レコードを問い合わせても、すべて NXDOMAIN が返ります。ドメイン自体が存在しないからです。
NODATA が返った場合は、他のレコードタイプが存在する可能性があります。example.com の AAAA クエリで NODATA が返っても、A クエリであれば A レコードが返ることがあります。
レコードタイプごとの NODATA
NODATA が返る典型的なケースを示します。
AAAA レコードがないドメインでは、IPv4 専用のサーバーに AAAA レコードが設定されていないため、AAAA クエリに NODATA が返ります。IPv6 しかサポートしない環境からアクセスすると名前解決に失敗します。
MX レコードがないドメインでは、ドメインがメールを受信しない場合に MX クエリで NODATA が返ります。メールサーバーは A レコードまたは AAAA レコードへのフォールバックを試みます(RFC 5321)。
TXT レコードがないドメインでは、SPF レコードや DMARC レコードが設定されていないドメインの _dmarc サブドメインに TXT クエリを送ると NODATA が返ります。メールサーバーは DMARC ポリシーがないものとして処理を進めます。
ワイルドカードと NODATA
ワイルドカードレコード(*.example.com)が存在する場合、存在しないサブドメインへのクエリは NXDOMAIN ではなくワイルドカードのレコードを返します。ただし、ワイルドカードはクエリされたレコードタイプと同じタイプのレコードしか返しません。
*.example.com に A レコードだけが設定されている場合、nonexistent.example.com の A クエリにはワイルドカードの A レコードが返りますが、MX クエリには NODATA が返ります。ワイルドカードに MX レコードが存在しないためです。
設定例
NODATA そのものを「設定」する項目ではありませんが、ネガティブキャッシュの期間を制御する SOA レコードの設定例を示します。
短いネガティブ TTL(推奨)
; ネガティブ TTL を 300 秒(5 分)に設定
example.com. 3600 IN SOA ns1.example.com. admin.example.com. (
2024010101 3600 900 604800 300 )
新しいレコードタイプを追加する可能性があるドメインでは、ネガティブキャッシュの期間を短くしておくことで、追加後の伝播を速められます。
長いネガティブ TTL
; ネガティブ TTL を 3600 秒(1 時間)に設定
example.com. 3600 IN SOA ns1.example.com. admin.example.com. (
2024010101 3600 900 604800 3600 )
変更が少なく、クエリ量の多いドメインでは長めに設定します。権威サーバーの負荷を減らす効果があります。
確認方法
NODATA 応答を dig で確認するには、存在するドメインに対して設定されていないレコードタイプを問い合わせます。
dig AAAA example.com
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45678
;; QUESTION SECTION:
;example.com. IN AAAA
;; ANSWER SECTION:
;(空)
;; AUTHORITY SECTION:
example.com. 300 IN SOA ns1.example.com. admin.example.com. (
2024010101 3600 900 604800 300 )
;; Query time: 12 msec
status: NOERROR だが ANSWER SECTION が空であることが NODATA の特徴です。AUTHORITY SECTION の SOA レコードは、ドメイン自体が存在することを示しています。
ANY クエリを使うと、ドメインに存在するレコードタイプを確認できます。
dig ANY example.com
ただし、権威サーバーやリゾルバーは ANY クエリへの応答を最小化することがあります(RFC 8482)。レコードタイプごとに個別に問い合わせる方が確実です。
外部の視点から確認したい場合は、Labee Dev Toolbox の DNS API を使います。
curl "https://labee.dev/api/dns?domain=example.com&type=AAAA"
{
"success": true,
"data": {
"domain": "example.com",
"records": {
"AAAA": null
}
},
"error": null,
"meta": { "responseTime": 38 }
}
records.AAAA が null であれば、外部から AAAA レコードが確認できない状態です。ドメイン自体が存在しない場合は他のレコードタイプも null になりますが、NODATA の場合は対象レコードタイプだけが null で他のタイプにレコードが存在します。
よくある問題
NODATA に関連するトラブルは、ネガティブキャッシュによる遅延と、NXDOMAIN との誤判断に集約されます。
新しい MX レコードを追加したのにメールが届かない
ドメインに MX レコードを追加する前に、メールサーバーがそのドメインの MX レコードを問い合わせて NODATA を受け取ると、ネガティブキャッシュが有効な間は「MX レコードが存在しない」と判断され続けます。メールサーバーはネガティブキャッシュが切れるまで MX レコードを再確認しないか、A レコードへのフォールバックを試みます。
新しいドメインでメールを受信する場合は、事前に MX レコードを設定してから利用を開始します。SOA の MINIMUM が長いと最大でその時間だけメール配送が遅延します。
NODATA を NXDOMAIN と誤判断する
クライアントアプリケーションが status: NOERROR で ANSWER SECTION が空の応答を「ドメインが存在しない」と誤判断することがあります。NODATA は「ドメインは存在するがリクエストされたタイプのレコードがない」ことを意味するため、他のレコードタイプを問い合わせれば結果が返る可能性があります。A レコードの問い合わせで NODATA が返った場合、AAAA や MX などの別タイプで再確認します。
DMARC レコードがないドメインに NODATA が返る
_dmarc.example.com に TXT レコードが設定されていない場合、TXT クエリに NODATA が返ります。メールサーバーは DMARC ポリシーがないものとして p=none を適用します。DMARC の設定を忘れている場合と意図的に未設定の場合の区別がつかないため、明示的に p=none を設定することが推奨されます。
IPv6 環境で AAAA レコードがないサイトにアクセスできない
IPv6 のみのネットワーク環境から、AAAA レコードがないドメインにアクセスすると名前解決で NODATA が返ります。A レコードは存在しても IPv6 ネットワークからは到達できません。デュアルスタック運用では A レコードと AAAA レコードの両方を設定し、どちらのネットワークからもアクセス可能にします。