WindowsのDNS(名前解決)キャッシュのクリア方法やキャッシュさせない方法
2018/04/26
本エントリーの目次
うまく名前解決ができない!
開発やテストの目的で、DNSサーバーのAレコードなどの設定を変更。
そしてWindows PCからアクセスしようとすると、うまく新しい設定のとおりに名前解決してアクセスできない…。
なんてことが起こる場合があります。
これにはいくつかの原因が考えられますが、その中でもよく見かけるのが、Windows OSがローカルに保持しているDNSキャッシュです。
Windows OSを搭載したPCでは、肯定応答と否定応答のDNSキャッシュを保持しています!
Windows OSでは、Windows XPやWindows Server 2003など、かなり以前の世代のOSから、ローカルにDNSキャッシュを保持する仕組みを持っており、以下のような動作を行います。
- 名前解決のリクエストが発生。
- ローカルのDNSキャッシュを確認。
- DNSキャッシュに名前解決したい内容が保持されていれば、その内容を使用する。
保持されていない場合はDNSサーバーに問い合わせを行い、名前解決を実施。
その結果をDNSキャッシュに追加する。
こういった動作によりDNSキャッシュに存在するものはDNSサーバーに問い合わせをせず、DNSキャッシュの内容を使用するため、よりすばやく名前解決が可能です
またDNSサーバーへの問い合わせの頻度がかなり減るため、DNSサーバーの負荷軽減効果もあります。
初期設定では、肯定応答は86400秒(1日)の間キャッシュされる
DNSキャッシュには肯定応答だけではなく否定応答※もキャッシュされ、初期設定では前者は86400秒(1日)。
そして後者は900秒(15分)の間、DNSキャッシュに保持される仕様です。
※DNS応答が戻ってこないのではなく、そのレコードが存在しないという結果(否定)が戻ってくることを否定応答と言います。
そのためDNSサーバーでAレコードなどの設定を変更しても、名前解決の結果が既にクライアントPCのDNSキャッシュに保持されている場合、DNSキャッシュの内容を名前解決の結果として採用するため、新しい設定を使用してくれません。(というかDNSサーバーに問い合わせをしないので、クライアントPCは設定変更を知らない。)
その結果クライアントPCは、DNSの設定変更が反映されていないかのような振る舞いをしてしまうわけ。
これが、DNSサーバーの設定を変更したのに、うまく新しい設定のとおりに名前解決してアクセスできない…。
という問題の原因となるんです。
先にも書いたとおり、肯定応答は86400秒(1日間)の間DNSキャッシュに保持されます。
そのため丸一日経過すればDNSキャッシュは削除され、その後名前解決が発生すれば、再度DNSサーバーに問い合わせを実行。
このタイミングで初めてクライアントPCは、新しいDNSサーバーの設定を使用、キャッシュします。
とは言ったものの、クライアントPCが新しい設定を使用するまでに、丸一日も待てないですよね。
そこで今回は、WindowsのDNS(名前解決)キャッシュの表示・クリア(削除)方法やキャッシュさせない方法をご紹介します!
WindowsのDNSキャッシュの内容を表示する方法
まずは現在保持しているWindowsのDNSキャッシュの内容を表示する方法をご紹介しましょう。
これはコマンドプロンプト、またはPowerShellのコマンド操作で行います。
コマンドプロンプトを使う場合は、『ipconfig /displaydns』コマンドを使用します。
1 2 3 4 5 6 7 8 9 | C:\WINDOWS\system32>ipconfig /displaydns Windows IP 構成 win10.ipv6.microsoft.com ---------------------------------------- レコード名 . . . . . . . : win10.ipv6.microsoft.com 以下省略 |
またPowerShellでは『Get-DnsClientCache』コマンドを使用します。
1 2 3 4 5 6 | PS C:\WINDOWS\system32> Get-DnsClientCache Entry RecordName Record Status Section TimeTo Data L Data Type Live ength ----- ---------- ------ ------ ------- ------ ------ ---- win10.ipv6.microsoft.com win10.ipv6.microsoft.com CNAME Success Answer 255 8 onpremwindows.ipv6.microsoft.com.akadns.net |
キャッシュされていない場合の表示例
DNSキャッシュに名前解決の結果が一切キャッシュされていない場合、以下のように表示されます。
『ipconfig /displaydns』コマンドの場合:
1 2 3 4 5 6 7 | C:\WINDOWS\system32>ipconfig /displaydns Windows IP 構成 DNS リゾルバー キャッシュを表示できませんでした。 C:\WINDOWS\system32> |
『Get-DnsClientCache』コマンドの場合:
1 2 | PS C:\WINDOWS\system32> Get-DnsClientCache PS C:\WINDOWS\system32> |
WindowsのDNSキャッシュをただちにクリア(削除)する方法
WindowsのDNSキャッシュをただちに削除したい場合、以下の方法で行います。
コマンド操作でWindowsのDNSキャッシュをただちにクリアする方法
WindowsのDNSキャッシュの削除操作は、表示と同様にコマンドプロンプト・PowerShellのコマンド操作で実行可能です。
コマンドプロンプトを使う場合は、『ipconfig /flushdns』コマンドを使用します。
1 2 3 4 5 6 7 | C:\WINDOWS\system32>ipconfig /flushdns Windows IP 構成 DNS リゾルバー キャッシュは正常にフラッシュされました。 C:\WINDOWS\system32> |
『DNS リゾルバー キャッシュは正常にフラッシュされました。』と表示されれば、正常にDNSキャッシュが削除されています。
またPowerShellでは『Clear-DnsClientCache』コマンドを使用します。
1 2 | PS C:\WINDOWS\system32> Clear-DnsClientCache PS C:\WINDOWS\system32> |
こちらは実行が成功しても、特にメッセージは表示されません。
DNS Client(Dnscache)サービスを停止してWindowsのDNSキャッシュをただちにクリアする方法
DNS Clientサービス(サービス名:Dnscache)を停止、または再起動することで、WindowsのDNSキャッシュをただちに削除することもできます。
これはGUI操作で行うか、管理者権限で起動したコマンドプロンプト・PowerShellのコマンド操作で行います。
GUI操作で行う場合は、任意の画面を表示した状態で『Windows』キーを押しながら『R』キーを押下。
以下のような『ファイル名を指定して実行』画面が表示されたら、『名前』のテキストボックスにservices.mscと入力し、『OK』ボタンをクリックしてください。
するとサービスの一覧画面が表示されるので、『DNS Client』というサービスを探して選択。
右クリック → 『停止』または『再起動』をクリックしてください。
以上の操作でWindowsのDNSキャッシュは削除されています。
尚、DNS Clientサービス(サービス名:Dnscache)は、ActiveDirectoryのメンバーコンピューターとなっているWindows 10など一部の環境では、停止・再起動などの操作ができません。(ボタンが押せない。)
この場合には、コマンド操作でWindowsのDNSキャッシュをただちにクリアする方法を使用してください。
管理者権限で起動したコマンドプロンプトを使ってのDNS Clientサービスの停止と再起動は、それぞれ以下のコマンドで実行可能です。
1 2 3 4 5 6 | rem DNS Clientサービスの停止 net stop dnscache rem DNS Clientサービスの再起動 net stop dnscache net start dnscache |
参考:Windows アプリケーションを管理者権限で起動・実行する方法
管理者権限で起動したPowerShellを使用する場合は、以下のコマンドを使用します。
1 2 3 4 5 | #DNS Clientサービスの停止 Stop-Service "dnscache" #DNS Clientサービスの再起動 Restart-Service "dnscache" |
またDNS Clientサービス(サービス名:Dnscache)は、初期設定ではスタートアップの種類が『自動(トリガー開始)』となっており、停止してもその後に自動で起動します。
名前解決の結果をキャッシュさせないようにする方法
WindowsのDNSキャッシュをただちに削除する方法は、文字通りただちにDNSキャッシュを削除するものです。
そのため削除操作を実行後は、再度DNSキャッシュへのキャッシュ処理が始まります。
これを無効化し、一切DNSキャッシュに名前解決の結果を保存させたくない場合、方法は2つあります。
DNS Client(Dnscache)サービスを無効化し、名前解決の結果をキャッシュさせないようにする方法
DNS Client(Dnscache)サービスを停止し、スタートアップの種類を無効に変更することで、名前解決の結果をキャッシュさせないようにできます。
これはDNS Client(Dnscache)サービスを停止してWindowsのDNSキャッシュをただちに削除する方法の手順を参考に、サービスの一覧画面を表示。
DNS Client(Dnscache)サービスを選択して右クリック → 『プロパティ』 → 『停止』とクリック。
同画面で『スタートアップの種類』を『無効』に変更して、『OK』ボタンをクリックします。
または管理者権限でPowerShellを起動し、以下コマンドを実行します。
1 2 3 4 | #DNS Clientサービスの停止 Stop-Service "dnscache" #DNS Clientサービスのスタートアップの種類を無効に変更 Set-Service -Name 'dnscache' -StartupType 'Disabled' |
先にも書いたとおりDNS Clientサービス(サービス名:Dnscache)は一部の環境では、停止・再起動などの操作ができません。
この環境では『スタートアップの種類』を『無効』に変更することもできないため、レジストリの設定で名前解決の結果をキャッシュさせないようにする方法を使用してください。
レジストリの設定で名前解決の結果をキャッシュさせないようにする方法
肯定応答の結果は、レジストリエディターを起動して以下設定を行えば、DNSキャッシュに保存されなくなります。(厳密には1秒で削除される。)
- キー名:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DNSCache\Parameters
- 値の名前:MaxCacheTtl
- 値の種類:REG_DWORD / DWORD(32ビット)
- 値のデータ:1※Windows 10などの最新のOSでは0を指定可能です。
あるいは管理者権限で起動したコマンドプロンプトで、以下のコマンドを実行します。
1 | reg add "HKLM\SYSTEM\CurrentControlSet\Services\DNSCache\Parameters" /v MaxCacheTtl /t REG_DWORD /d 1 |
この操作により、クライアントのDNSキャッシュのTTLの最大値が1秒に設定されます。
そのためクライアント側のDNSキャッシュが無効になっているように振る舞います。(一時的にキャッシュに保存されるも、すぐに削除される。)
上記操作ではDNSキャッシュの肯定応答結果の保存時間(TTLの最大値)を1秒に設定しています。
これを1秒以外に設定したい場合は、値にその時間(秒)を指定してください。※デフォルトは86400秒(1日)。
尚、Windows XPやWindows Server 2003世代のOSよりも新しいバージョンのWindows OSであれば、MaxCacheTtlに0を指定可能です。
否定応答結果も同様にレジストリエディターで保存させないように設定可能です。
- キー名:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DNSCache\Parameters
- 値の名前:MaxNegativeCacheTtl
- 値の種類:REG_DWORD / DWORD(32ビット)
- 値のデータ:0
あるいは管理者権限で起動したコマンドプロンプトで、以下のコマンドを実行します。
1 | reg add "HKLM\SYSTEM\CurrentControlSet\Services\DNSCache\Parameters" /v MaxNegativeCacheTtl /t REG_DWORD /d 0 |
上記操作ではDNSキャッシュの否定応答結果の保存時間(TTLの最大値)を1秒に設定しています。
これを任意の時間に設定したい場合は、値にその時間(秒)を指定してください。※デフォルトは900秒(15分)。
参考:
Microsoft – Windows XP および Windows Server 2003 でクライアント側の DNS キャッシュを無効にする方法
Microsoft – TechNet MaxCacheTtl
nslookup、Resolve-DnsNameコマンドについて
DNSキャッシュに関連して、最後にnslookup、Resolve-DnsNameコマンドについてご紹介しておきましょう。
nslookupやResolve-DnsNameコマンドを使えば、DNSサーバーに問い合わせを行いDNSレコードの内容を取得することができます。
そのためDNSサーバーの動作や設定確認などの目的で使用すると良いでしょう。
ns.example.comというDNSサーバーに、example.comドメインの問い合わせを行う場合、それぞれ以下のように使用します。
nslookupコマンドの使用例:
nslookupコマンドを使用する場合は、コマンドプロンプトを起動して以下コマンドを実行してください。
1 | nslookup -querytype=all example.com ns.example.com |
Resolve-DnsNameコマンドの使用例:
Resolve-DnsNameコマンドを使用する場合は、PowerShellを起動して以下コマンドを実行します。
1 | Resolve-DnsName -Name example.com -Type all -Server ns.example.com |
以上、参考になさってくださーい!