2026年6月9日

2026年6月9日

SOAレコードのTTLを削除する方法|TTLは消せない理由と、省略・既定値に戻す正しい手順

DNSのレコードにはどれもTTLが付くため、SOAレコードのTTLを「無し」にすることはできません。実際にできるのは、ゾーンファイルでSOAの行からTTLの数字を省いてゾーン全体の既定値($TTL)を使わせること、またはマネージドDNSで独自に変えたTTLを既定の値に戻すことです。この記事では、SOAに関係する2つのTTLの違いを整理したうえで、BINDのゾーンファイルとマネージドDNSのそれぞれで「TTLを削除したい」という目的をかなえる手順と、変更後の確かめ方を説明します。

「SOAのTTL」は2つある

SOAレコードの話でTTLというと、次の2つのどちらかを指しています。どちらを消したい(戻したい)のかで、やることが変わります。

  • SOAレコード自体のTTL: 他のレコードと同じく、キャッシュDNSがSOAレコードを保持してよい時間です。ゾーンファイルではレコードの名前の後ろ、IN の前に書きます
  • SOAの最後のフィールド(MINIMUM): 現在は「その名前やレコードは存在しない」という答えをキャッシュする時間(ネガティブキャッシュTTL)の上限として使われます(RFC 2308)

ネガティブキャッシュの保持時間は、この2つのうち短い方です。そのため、SOAレコード自体のTTLを変えると、「追加したレコードがしばらく見えない」状態がどれだけ続くかにも影響します。

もう1つよくある誤解が、「MINIMUMはゾーン全体の既定TTLだ」というものです。古い仕様(RFC 1035)ではそう読める書き方でしたが、RFC 2308で意味が変わり、既定TTLは $TTL で指定するようになりました。MINIMUMを消しても(そもそもフィールドは省略できません)、他のレコードのTTLは変わりません。

なぜTTLを「無し」にできないのか

DNSの応答では、すべてのレコードにTTLの値が入ります。ゾーンファイルの書式ではTTLを省略して書けますが、それは「値が無い」という意味ではなく、「別の場所で決めた値を使う」という意味です。BINDでの扱いは次のとおりです。

  • $TTL が書かれていれば、TTLを省略したレコードにはその値が使われる
  • $TTL が無い場合は、直前のレコードに明示したTTLが引き継がれる
  • $TTL が無く、最初のレコード(ふつうはSOA)にもTTLが無い場合、BINDはSOAのMINIMUMを既定値として使い、警告を出す

最後のケースでは、読み込み時に「TTLの指定が無いのでSOAのMINIMUMを使う」という趣旨の警告がログに出ます。動作はしますが意図が読み取りにくいため、$TTL を明示するのが一般的です。

BINDでSOAのTTLを省略する手順

作業の前に、ゾーンファイルをコピーしてバックアップを取ります。可能なら検証用のサーバーで同じ操作を試してから本番に反映します。

変更前は、SOAの行にTTLが明示されているとします。

$TTL 3600
@   86400  IN  SOA ns1.example.com. hostmaster.example.com. (
        2026101801 ; serial
        3600       ; refresh
        900        ; retry
        1209600    ; expire
        3600 )     ; negative cache TTL

この 86400 を削除し、シリアル番号を増やします。

$TTL 3600
@   IN  SOA ns1.example.com. hostmaster.example.com. (
        2026101802 ; serial
        3600       ; refresh
        900        ; retry
        1209600    ; expire
        3600 )     ; negative cache TTL

これでSOAレコードのTTLは $TTL の3600秒になります。注意したいのは、SOAの行で明示していたTTLが、その後ろのTTLを省略したレコードに引き継がれていた可能性があることです。$TTL がある場合は $TTL の値が使われますが、$TTL が無いゾーンでSOAのTTLを消すと、後続のレコードのTTLまで変わることがあります。消す前に、ゾーンの先頭に $TTL があるかを確かめてください。

編集したら、構文を検査してから再読み込みします。

# 構文とSOAの値を検査(警告やエラーが出たら反映しない)
sudo named-checkzone example.com /etc/bind/zones/db.example.com

# 対象ゾーンだけ再読み込み
sudo rndc reload example.com

named-checkzone が OK と新しいシリアル番号を表示すれば、構文上の問題はありません。セカンダリを運用している場合は、シリアル番号を増やしたことでゾーン転送が行われ、セカンダリのSOAのTTLも変わります。

PowerDNSのようにデータベースでゾーンを管理するDNSサーバーでは、ゾーンファイルの書式ではなく、レコードごとにTTLを持つ形になっています。この場合は pdnsutil edit-zone example.com などでSOAのTTLを目的の値に書き換えます。「省略」という操作は無く、値を決めて入れることになります。

マネージドDNSの場合

Amazon Route 53 や Cloudflare などのマネージドDNSでは、SOAレコードはサービスが自動で作成し、利用者が削除することはできません。TTLやSOAの一部のフィールドを編集できるかどうかは、サービスやプランによって異なります(2026年10月現在)。

  • 編集できるサービス: 以前に変えたTTLを既定の値に戻すのが「削除」に相当します。既定値はサービスの資料に載っていることが多いので、作成直後の別のゾーンと見比べるのも手です
  • 編集できないサービス: そもそもTTLを変えられないため、利用者側で消す・戻す作業はありません。ネガティブキャッシュの長さが問題になっている場合は、サポートに相談します

レンタルサーバーやドメイン会社の付属DNSでは、SOAが画面に表示されないことも多くあります。その場合も、表示されていないだけでSOAレコードとTTLは存在しています。

変更後の確認

権威サーバーに直接問い合わせると、TTL欄には設定した値そのものが表示されます。

# 権威サーバーが返すSOAのTTLを確認(2列目がTTL)
dig @ns1.example.com example.com SOA +norecurse +noall +answer

# 全権威サーバーのシリアル番号がそろったかを確認
dig example.com +nssearch

一方、公開DNSに問い合わせたときのTTL欄は「キャッシュがあと何秒残るか」です。変更前のTTLでキャッシュされていた答えは、その時間が過ぎるまで古いTTLのまま残ります。公開DNSで新しい値になったかを確かめるのは、変更前のTTLの分だけ時間を置いてからにします。

ネガティブキャッシュの長さも、あわせて確かめておくと安心です。存在しない名前を問い合わせ、AUTHORITYセクションに出るSOAのTTLを見ます。

dig @ns1.example.com no-such-name.example.com A +norecurse

ここで表示されるTTLが、SOAレコードのTTLとMINIMUMのうち短い方になっていれば、意図どおりに動いています。

TTLを決め直すときの目安

TTLを消したい理由が「長すぎて変更が反映されにくい」ことであれば、省略して既定値に任せるよりも、目的に合った値を明示した方が後から読みやすくなります。SOAレコード自体のTTLは、ゾーンの既定TTLと同じ数十分〜1時間程度にしておく例が多く見られます。サブドメインの追加が多い運用では、ネガティブキャッシュが長いと困るため、SOAのTTLとMINIMUMの両方を数分〜1時間程度に抑えておくと扱いやすくなります。

まとめ

  • SOAレコードのTTLは「無し」にはできない。できるのは省略して $TTL を使わせるか、既定の値に戻すこと
  • SOAにはレコード自体のTTLとMINIMUM(ネガティブキャッシュTTL)があり、ネガティブキャッシュには両方の短い方が使われる
  • BINDでは $TTL があることを確かめてからSOAの行のTTLを消し、シリアル番号を増やして named-checkzone と rndc reload を行う
  • マネージドDNSではSOAは削除できず、TTLを編集できるかはサービスやプランによる
  • 変更後は権威サーバーで設定値を、公開DNSでは古いTTLが切れた後の値を確かめる

お気軽にご相談ください

お見積りへ お問い合わせへ
▲