Windows ServerでDNSスカベンジングを安全に有効化したいなら、最初に押さえるべき結論はシンプルです。動的更新レコードを主対象にし、Refresh と No-refresh の合計を DHCP リース期間以上に合わせ、清掃を実行する DNS サーバーは原則 1 台に絞る。この考え方で進めると、古い A/PTR レコードを減らしつつ、必要な名前解決を壊すリスクを大きく下げられます。DNS スカベンジングは便利ですが、設定の意味を飛ばして「とりあえず ON」にすると、必要なレコードまで削除しかねません。 (Microsoft Learn)
特に危ないのは、既存ゾーンへ一括適用すること、dnscmd /ageallrecords で静的レコードまでまとめてタイムスタンプ化すること、そして Refresh と No-refresh を短くしすぎることです。Windows 系クライアントやサーバーは既定で 24 時間ごとに DNS 登録を更新するため、合計 24 時間未満は事故の起点になりやすく、誤削除が起きると別ユーザーがその名前を再作成して所有権が変わるリスクもあります。 (Microsoft Learn)
Windows ServerのDNSスカベンジングを安全に使う結論
| 判断軸 | 安全寄りの考え方 | 危険寄りの考え方 |
|---|---|---|
| 対象ゾーン | DHCP/DDNS 主体のクライアント系ゾーンから始める | サービス名や静的レコードが多いゾーンへ一括適用する |
| レコード | 動的登録された A/PTR を中心に掃除する | 既存の静的レコードまで一気に対象化する |
| 間隔 | Refresh + No-refresh を DHCP 最大リース以上に合わせる | 「早く消したい」だけで合計を短くする |
| 実行サーバー | AD レプリケーションが健全な 1 台に集約する | 複数の DNS/DC に同時に清掃をさせる |
| 導入順 | ゾーン有効化 → 待機 → 健全性確認 → サーバー有効化 | その場でサーバー側も ON にして手動実行する |
この判断軸が有効なのは、DNS スカベンジングがレコード・ゾーン・サーバーの 3 層で成立する仕組みだからです。さらに、Microsoft は Refresh と No-refresh の合計を DHCP 最大リース期間以上にすること、清掃サーバーは 1 台に寄せること、既存ゾーンでは段階的に導入することを前提に案内しています。 (Microsoft Learn)
DNSスカベンジングで消えるレコードと消えないレコード
Windows Server の DNS スカベンジングは、古い動的レコードを削除するための仕組みです。既定では DNS サーバーでもゾーンでも無効で、対象になるのは通常、DNS 動的更新で作成または更新されたレコードです。手作業で追加した静的レコードはタイムスタンプが 0 のため、そのままでは削除対象になりません。 (Microsoft Learn)
ここで見落としやすいのが、固定 IP のサーバーでも安心ではないことです。Windows ベースのマシンは静的 IP でも 24 時間ごとに DNS に再登録するため、動的登録された A/PTR ならスカベンジング対象になり得ます。つまり「固定 IP だから消えない」は誤解で、実際には登録方法とタイムスタンプの有無が重要です。 (Microsoft Learn)
逆に危険なのは、静的レコードにまとめてタイムスタンプを付けてしまう運用です。GUI の「古くなったらこのレコードを削除する」や Set-DnsServerResourceRecordAging は個別レコードに使えますが、dnscmd /ageallrecords をゾーン全体に実行すると、消したくない静的レコードまで対象になります。しかも ageallrecords で付けたタイムスタンプは元に戻せず、非 Windows DNS との混在環境では互換性にも注意が必要です。なお、NS、SOA、WINS レコードはこの処理の対象外です。 (Microsoft Learn)
間隔設計で失敗しない考え方
DNS スカベンジングで混同しやすいのが、No-refresh、Refresh、Scavenging period は別物だという点です。No-refresh はレコードのタイムスタンプ更新を抑制する期間で、AD への書き込みやレプリケーションを減らすためにあります。Refresh は、その後にクライアントがタイムスタンプを更新できる期間です。Scavenging period は、サーバーが古いレコードを見に行く周期で、既定では 7 日、最小値は 1 時間です。No-refresh と Refresh も既定はそれぞれ 7 日です。 (Microsoft Learn)
レコードが削除対象になる判定は、レコードのタイムスタンプ + No-refresh + Refresh で決まります。さらに、ゾーンには「zone can be scavenged after」という猶予があり、ゾーンでエージングを有効にした直後に即削除されるわけではありません。たとえば既定値の 7 日 + 7 日なら、レコードが「古い」と判定されるまでまず 14 日かかり、その後に次のスカベンジング周期で実際の削除が走ります。 (Microsoft Learn)
実務では、値そのものを暗記するより合計を合わせるほうが重要です。Microsoft は「標準設定はない」としたうえで、Refresh + No-refresh >= 最大 DHCP リース期間 を満たすことを条件にしています。また、Refresh 期間は複数回の再登録チャンスを確保できる長さにすべきで、Windows 系クライアントが 24 時間ごとに登録更新することを踏まえると、一般的な Windows 環境で合計 24 時間未満は避けたほうが安全です。 (Microsoft Learn)
「もっと早く古いレコードを消したい」と感じても、Refresh を削るのは慎重に考えるべきです。Microsoft の既存ゾーン向けセットアップ例でも、より効果的にスカベンジするなら No-refresh を下げ、Refresh は既定のままにする考え方が示されています。早く消すことより、再登録が安定して回る余地を残すことを優先したほうが、結果的に事故が少なくなります。 (Microsoft Learn)
サーバー設定とゾーン設定の落とし穴
DNS スカベンジングでよくある勘違いが、「サーバー側で設定したから全部のゾーンに効くはず」というものです。実際には、ゾーン側でエージングが有効になっていなければ清掃は行われません。さらに DNS Manager の Set Aging/Scavenging for All Zones は、既存ゾーンへ自動的に反映されるとは限らず、既存の AD 統合ゾーンに適用するチェックを入れないと、実質的には新規ゾーン用の既定値設定に近い動きになります。しかも、ゾーン単位の設定はグローバル設定より優先されます。 (Microsoft Learn)
AD 統合 DNS では、清掃を実行するサーバーは 1 台で足りるという考え方が実務向きです。ゾーン データはレプリケートされるため、複数サーバーで同時にスカベンジさせる必要はありません。むしろ 1 台に集約したほうが、Event ID 2501/2502 の確認先が明確になり、トラブル時の切り分けも楽です。必要なら ScavengeServers で、そのゾーンを清掃できる DNS サーバーの IP を限定できます。 (Microsoft Learn)
もう 1 つ重要なのが AD レプリケーションです。Microsoft のトラブルシューティングでも、レプリケーションに問題があるサーバーで清掃を動かすと、他サーバーではまだ有効なレコードを不必要に tombstone 化するリスクがあるため、ゾーンが最近レプリケートされているかを確認するよう案内しています。清掃は「登録が正常に回っている」ことが前提の仕組みであり、登録不全やレプリケーション不全の代用品ではありません。 (Microsoft Learn)
DNSスカベンジングが向く運用、慎重にすべき運用
DNS スカベンジングが向いているのは、DHCP/DDNS でクライアントが頻繁に入れ替わる環境です。たとえば PC、VDI、VPN 端末、検証用 VM が多いネットワークでは、古い A/PTR が溜まりやすく、動的登録レコードを自動整理できるメリットが大きくなります。DHCP、Netlogon、クラスター サービスなども DNS 更新を行うため、更新が安定している環境なら、スカベンジングは運用負荷の削減に効きます。 (Microsoft Learn)
一方で慎重に進めたいのは、手動作成したサービス名、VIP、業務システムの別名、ネットワーク機器名などが多いゾーンです。こうしたゾーンは静的レコードが中心で、誤って一括でタイムスタンプを付けるとリスクが一気に上がります。クライアント系ゾーンだけ先に有効化し、サーバー系・サービス系ゾーンは別管理にしたほうが、事故を避けやすいです。 (Microsoft Learn)
さらに、固定 IP サーバーが多い環境でも、DNS 登録が動的ならスカベンジ対象になります。特に「固定 IP だから静的レコードのはず」と思い込んで確認を省くと、Refresh/No-refresh を短くしたときに思わぬ削除が起きます。固定 IP の有無ではなく、そのレコードが誰によって、どう更新されているかを確認してください。 (Microsoft Learn)
Windows ServerでDNSスカベンジングを安全に有効化する手順
まずは現状を把握する
最初に確認したいのは、サーバー側とゾーン側の現在設定です。PowerShell なら次の 2 つが出発点になります。
Get-DnsServerScavenging
Get-DnsServerZoneAging -Name "contoso.com"
この 2 つでサーバーの清掃設定と、対象ゾーンのエージング設定を確認できます。レコード単位は DNS Manager で View > Advanced を有効にし、レコードのプロパティを開くと、タイムスタンプや「古くなったら削除」の状態を確認できます。 (Microsoft Learn)
対象ゾーンだけ先に有効化する
既存環境でいきなりサーバー側まで有効化するより、まずゾーンだけ有効化するほうが安全です。たとえば既定値ベースで試すなら、次のように設定します。
Set-DnsServerZoneAging -Name "contoso.com" -Aging $true `
-RefreshInterval 7.00:00:00 -NoRefreshInterval 7.00:00:00
清掃するサーバーを明示したいなら、ゾーン側で ScavengeServers を指定できます。
Set-DnsServerZoneAging -Name "contoso.com" -Aging $true `
-ScavengeServers 10.0.0.10
Set-DnsServerZoneAging はゾーンのエージング設定を管理し、ScavengeServers によってそのゾーンを清掃できる DNS サーバーを限定できます。 (Microsoft Learn)
Refresh + No-refresh の期間は待つ
既存ゾーンでは、ここですぐ削除が始まることを期待しないのが大事です。Microsoft の安全寄りのセットアップ例では、ゾーン側を有効化したあと、Refresh + No-refresh の期間を待ってから「その期間より古いレコードが残っていないか」を確認し、古いものがあれば動的登録の問題を先に直す流れが案内されています。既定値の 7 日 + 7 日で慎重に進めると、既存ゾーンの導入は 4〜5 週間かかることがあります。 (Microsoft Learn)
この待機期間に確認したいのは、「古いレコードが消えない」ことではなく、古いレコードが残る理由です。もし Refresh + No-refresh を超えるレコードが普通に残るなら、スカベンジング以前に DNS 再登録、所有者、AD レプリケーションのどこかに問題がある可能性が高いと考えてください。 (Microsoft Learn)
問題がなければサーバー側を 1 台だけ有効化する
安全確認が済んだら、清掃担当に決めた DNS サーバーでだけ自動スカベンジングを有効化します。
Set-DnsServerScavenging -ScavengingState $true `
-ScavengingInterval 7.00:00:00
Set-DnsServerScavenging はサーバー側のスカベンジング設定を変更するコマンドです。ここで重要なのは、複数台へ一斉に広げないことです。AD 統合ゾーンなら 1 台で十分で、ログ確認先も 1 か所に絞れます。 (Microsoft Learn)
最後に手動実行で動作を確認する
検証の最後に、手動でスカベンジを起動して動作を確認できます。
Start-DnsServerScavenging -Verbose
ただし、Start-DnsServerScavenging は安全弁を飛ばしません。サーバーとゾーンの両方で有効、ゾーンが開始済み、レコードにタイムスタンプあり、という条件を満たさないと実際の清掃は始まりません。動作確認は Event ID 2501/2502 を見れば追いやすく、より詳細には DNS 監査ログで削除対象や開始・終了イベントも確認できます。 (Microsoft Learn)
よくある失敗と対処
古いレコードが消えない場合は、ほとんどが設定漏れです。レコード・ゾーン・サーバーの 3 層のどこかが欠けている、既存ゾーンへ設定が反映されていない、タイムスタンプ 0 の静的レコードを見ている、zone can be scavenged after の時刻前、という順で疑うと切り分けやすいです。 (Microsoft Learn)
必要なサーバーの A/PTR が消える場合は、Refresh と No-refresh が短すぎるケースが典型です。Microsoft は、No-refresh と Refresh が両方とも 24 時間未満だとレコードを失う例を明示しており、さらに合計が DHCP 最大リース期間未満でも危険です。まずは間隔を戻し、サーバーが実際に DNS 登録を正常に更新できているかを確認してください。 (Microsoft Learn)
一部のレコードだけ更新されない場合は、所有者と登録経路を確認します。Microsoft のセットアップ例では、管理者が静的に作成したレコードをそのままスカベンジ対象にした場合、所有者の問題で更新が通らないことがあるため、いったん削除して ipconfig /registerdns で再登録し直す対応が案内されています。特に Secure Dynamic Update 環境ではここが盲点です。 (Microsoft Learn)
ログが追えず原因が分からない場合は、まず Event ID 2501/2502 を見ます。さらに DNS 監査ログでは、サーバー設定やゾーン設定の変更、動的更新、削除対象の確認ができます。監査ログは既定で有効で、変更追跡に向いています。パケット レベルの DNS debug logging もありますが、こちらは負荷が高いため常時運用向きではありません。 (Microsoft Learn)
代替策として有効な3つの考え方
静的レコード中心のゾーンは、無理にスカベンジングしない
業務システム名、VIP、固定機器名が多いゾーンでは、スカベンジングより定期棚卸しのほうが安全なことがあります。静的レコードはタイムスタンプ 0 のまま残せるので、消す判断を人間が持つほうが事故を防ぎやすいです。 (Microsoft Learn)
ゾーン単位ではなく、レコード単位でエージングする
「一部のワークステーション名だけ自動で掃除したい」というケースなら、ゾーン全体ではなく、レコード単位でエージングを始めるほうが安全です。PowerShell なら Set-DnsServerResourceRecordAging が使えます。
Set-DnsServerResourceRecordAging -ZoneName "contoso.com" -NodeName "pc-001"
この方法なら、消したくない静的レコードまでまとめて対象化せずに済みます。前提として、対象ゾーンではエージングが有効である必要があります。 (Microsoft Learn)
先に登録不全を直し、清掃はその後にする
もし既存ゾーンで古いレコードが大量に残っているなら、いきなり削除に進むより、なぜ再登録されていないのかを直すほうが先です。ipconfig /registerdns が通るか、レコード所有者は誰か、AD レプリケーションは正常か。この 3 点を押さえるだけでも、スカベンジング有効化後の事故率はかなり下がります。 (Microsoft Learn)
DNS スカベンジングは、DNS の「掃除機」というより、正常に更新される動的レコードだけを安全に刈り取る仕組みとして使うのが実務的です。まずはクライアント系ゾーンを 1 つ選び、現在の Refresh/No-refresh と DHCP 最大リースを確認し、ゾーンだけ有効化して待機してください。そのうえで再登録とレプリケーションに問題がないと確認できたら、清掃サーバーを 1 台だけ有効化する。この順番なら、Windows Server の DNS スカベンジングをかなり安全に導入できます。 (Microsoft Learn)

コメント