SOA レコード(Start of Authority)
概要
SOA レコード(Start of Authority) は、DNS ゾーンの管理情報を定義するレコードです。RFC 1035(1987年)で規定されており、レコードタイプ番号は 6 です。すべての DNS ゾーンには必ず 1 つの SOA レコードが存在し、ゾーンの頂点(Apex)に配置されます。
SOA レコードには、ゾーンのプライマリーネームサーバー、管理者の連絡先、ゾーンデータのバージョン番号(シリアル番号)、セカンダリーサーバーがゾーン転送を行うタイミングの制御値が含まれます。DNS ゾーンの「メタデータ」とも言える存在で、ゾーン転送やネガティブキャッシュの挙動に直接影響します。
仕組み
SOA レコードは 7 つのフィールドで構成され、シリアル番号によるゾーン転送制御とネガティブキャッシュの管理を担います。
レコードの構造
SOA レコードは 7 つのフィールドで構成されます。
example.com. IN SOA ns1.example.com. admin.example.com. (
2026041101 ; serial
3600 ; refresh
900 ; retry
1209600 ; expire
300 ; minimum
)
| フィールド | 説明 |
|---|---|
| MNAME | プライマリーネームサーバーのホスト名 |
| RNAME | ゾーン管理者のメールアドレス。@ を . に置き換えた形式で記述する(admin.example.com. は admin@example.com) |
| Serial | ゾーンデータのバージョン番号。変更のたびにインクリメントする |
| Refresh | セカンダリーサーバーがプライマリーに問い合わせてゾーンの更新を確認する間隔(秒) |
| Retry | Refresh の問い合わせが失敗した場合のリトライ間隔(秒) |
| Expire | セカンダリーサーバーがプライマリーに到達できない場合、ゾーンデータを有効とみなす最大期間(秒)。この期間を超えるとセカンダリーはゾーンデータを破棄し、応答を停止する |
| Minimum | ネガティブキャッシュの TTL(秒)。RFC 2308 で再定義された |
シリアル番号の運用
シリアル番号はゾーン転送のトリガーとして機能します。セカンダリーサーバーは Refresh 間隔ごとにプライマリーの SOA レコードを取得し、シリアル番号が手元のものより大きければゾーン転送(AXFR または IXFR)を開始します。
一般的なシリアル番号の形式は YYYYMMDDnn です。2026041101 は「2026年4月11日の 1 回目の変更」を意味します。1 日に複数回変更する場合は末尾の nn をインクリメントします。RFC 1982 ではシリアル番号の比較にシーケンス空間演算を使い、32 ビット整数のラップアラウンドにも対応しています。
ゾーン転送の制御
SOA レコードの Refresh / Retry / Expire の 3 つの値がゾーン転送のスケジュールを決定します。
Refresh が 3600 の場合、セカンダリーサーバーは 1 時間ごとにプライマリーのシリアル番号を確認します。プライマリーが応答しなければ Retry(上記では 900 秒 = 15 分)間隔で再試行します。プライマリーへの到達不能が Expire(上記では 1209600 秒 = 14 日間)続くと、セカンダリーはゾーンデータを無効とみなして応答を停止します。
RFC 1912 では、Refresh を 1200〜43200 秒、Retry を Refresh の 1/3 程度、Expire を 1209600〜2419200 秒(14〜28 日)に設定することを推奨しています。
ネガティブキャッシュと MINIMUM フィールド
RFC 1035 の当初の定義では MINIMUM フィールドはゾーン全体のデフォルト TTL でしたが、RFC 2308(1998年)で役割が変わりました。現在の MINIMUM フィールドは、存在しないドメイン名に対する NXDOMAIN 応答のキャッシュ時間(ネガティブキャッシュ TTL)を制御します。
dig で存在しないサブドメインを問い合わせると、AUTHORITY SECTION に SOA レコードが返ります。このとき SOA レコードの MINIMUM フィールドの値がネガティブキャッシュの TTL になります。RFC 2308 ではネガティブキャッシュ TTL の上限を 3 時間(10800 秒) に制限することを推奨しています。
設定例
ゾーンの更新頻度やサービスの可用性要件に応じて、Refresh・Retry・Minimum の値を調整します。
一般的なゾーンの SOA レコード
$TTL 3600
example.com. IN SOA ns1.example.com. hostmaster.example.com. (
2026041101 ; serial - YYYYMMDDnn 形式
3600 ; refresh - 1 時間
900 ; retry - 15 分
1209600 ; expire - 14 日
300 ; minimum - ネガティブキャッシュ 5 分
)
頻繁に更新するゾーン
CDN やロードバランサーのように短い TTL で運用するゾーンでは、Refresh と Minimum を短く設定します。
example.com. IN SOA ns1.example.com. dns-admin.example.com. (
2026041101 ; serial
600 ; refresh - 10 分
300 ; retry - 5 分
1209600 ; expire - 14 日
60 ; minimum - ネガティブキャッシュ 1 分
)
Cloudflare のデフォルト SOA
Cloudflare DNS を利用する場合、SOA レコードは自動的に設定されます。
example.com. IN SOA hans.ns.cloudflare.com. dns.cloudflare.com. (
2345678901 ; serial
10000 ; refresh
2400 ; retry
604800 ; expire
1800 ; minimum
)
確認方法
dig で SOA レコードを確認するには次のコマンドを使います。
dig SOA example.com
出力の ANSWER SECTION にゾーンの管理情報が表示されます。
;; ANSWER SECTION:
example.com. 3600 IN SOA ns1.example.com. hostmaster.example.com. 2026041101 3600 900 1209600 300
各フィールドは左から MNAME、RNAME、Serial、Refresh、Retry、Expire、Minimum の順です。
ネガティブキャッシュの動作を確認するには、存在しないサブドメインを問い合わせます。
dig nonexistent.example.com
;; status: NXDOMAIN
;; AUTHORITY SECTION:
example.com. 300 IN SOA ns1.example.com. hostmaster.example.com. 2026041101 3600 900 1209600 300
AUTHORITY SECTION に SOA レコードが返り、NXDOMAIN ステータスが表示されます。SOA の MINIMUM フィールドの値(上記では 300)が、そのネガティブ応答のキャッシュ時間です。
外部の視点からも確認したい場合は、Labee Dev Toolbox の DNS API を使うと、外部の視点から見た結果を取得できます。
curl "https://labee.dev/api/dns?domain=example.com&type=SOA"
レスポンスは次の形式で返ります。
{
"success": true,
"data": {
"domain": "example.com",
"records": {
"SOA": [
{
"mname": "ns1.example.com",
"rname": "hostmaster.example.com",
"serial": 2026041101,
"refresh": 3600,
"retry": 900,
"expire": 1209600,
"minimum": 300
}
]
}
},
"error": null,
"meta": { "responseTime": 38 }
}
records.SOA 配列の各要素に MNAME から MINIMUM までの 7 フィールドが含まれます。rname フィールドは . 区切りのまま返るため、最初の . を @ に読み替えるとメールアドレスになります。
よくある問題
SOA レコードの設定ミスは、ゾーン転送の停止やネガティブキャッシュの長期化としてドメイン全体に影響します。
シリアル番号を巻き戻してしまった
シリアル番号を手動で編集して以前より小さい値にすると、セカンダリーサーバーは「変更なし」と判断してゾーン転送を行いません。結果として、プライマリーの変更がセカンダリーに反映されなくなります。修正するには、現在のセカンダリーのシリアル番号より大きい値をプライマリーに設定します。
Expire が短すぎてセカンダリーが応答を停止する
プライマリーサーバーの障害が長引いた場合、Expire が短いとセカンダリーがゾーンデータを破棄して応答を停止します。Expire を 14 日(1209600 秒)以上 に設定しておくと、プライマリーの復旧作業に十分な時間を確保できます。
RNAME のメールアドレスが届かない
RNAME フィールドはメールアドレスを . 区切りで記述します。admin@example.com は admin.example.com. になりますが、メールアドレスの @ より前にドットが含まれている場合はバックスラッシュでエスケープする必要があります。first.last@example.com は first\.last.example.com. と記述します。
ネガティブキャッシュ TTL が長すぎて新しいレコードが引けない
MINIMUM を 86400(24 時間) のように長い値に設定すると、新しくサブドメインを追加しても、以前に NXDOMAIN がキャッシュされたリゾルバーからは最大 24 時間アクセスできません。MINIMUM は 300〜1800 秒 程度に設定するのが実用的です。