WindowsでDNSキャッシュをクリアする方法(ipconfig /flushdns)
Windows 10やWindows 11でDNSをフラッシュするには、コマンド プロンプトかターミナルを開いてipconfig /flushdnsを実行します。PowerShellならClear-DnsClientCacheでも同じで、Microsoftのコマンドレット リファレンスにも、これを実行するのはipconfig /flushdnsを実行するのと同じだと書かれています。
フラッシュで消えるのは1つの層、つまりWindowsのDNSクライアント キャッシュだけです。ルーター、DNSプロバイダー、ブラウザー独自のDNSキャッシュ、ネットワーク アダプターには何もしないので、直るのは古くなった名前解決くらいです。この記事では、その層が本当に原因になるのはどんなときか、中身の見方、よく一緒に使われる重めのリセット コマンド、そしてそれぞれが何を変えるのかを順に見ていきます。
DNSクライアント キャッシュに入っているもの
アプリがexample.comに接続する前に、Windowsはその名前をIPアドレスに変換する必要があります。DNS Clientサービスは一度受け取った応答を保持しておき、同じ名前を引くたびにネットワークへ問い合わせなくて済むようにしています。Microsoftのipconfigリファレンスによると、このキャッシュにはローカルのHostsファイルから事前に読み込まれたエントリと、このコンピューターが最近解決した名前のレコードの両方が入っていて、サービスは「構成済みのDNSサーバーに問い合わせる前に」これを使います。
各レコードは、そのドメインのDNSサーバーが付けた有効期間(TTL)のあいだ保持され、切れると取り直されます。失敗も同じようにキャッシュされます。同じリファレンスには/flushdnsで「ネガティブ キャッシュ エントリを破棄」できるとあり、これは名前が存在しないという応答のことです。一度開けなかったサイトが、ほかの端末からは見られるのに1台のPCだけでずっと開けないままになるのはこのためです。
何も変えずにキャッシュの中身を見るには:
ipconfig /displaydns
PowerShellで1つの名前に絞るなら:
Get-DnsClientCache -Entry example.com
Get-DnsClientCacheはレコードの種類、状態(Success、NotExist、NoRecords)、TTLで絞り込めるので、長いipconfigの一覧より読みやすくなります。本来つながるはずの名前にNotExistが出ていれば、それはキャッシュされた失敗です。
DNSのフラッシュが効く場面
| 状況 | フラッシュが効く理由 |
|---|---|
| サイトやサーバーが新しいアドレスに移ったのに、このPCは古いほうにつながる | 古いレコードがまだローカル キャッシュから期限切れになっていない |
| 設定でDNSサーバーを変えた | 前のサーバーからの応答がまだキャッシュに残っている |
| hostsファイルを編集したのに変更が反映されていないように見える | キャッシュにはhostsファイルから事前に読み込まれたエントリと、その名前の以前の応答が入っている |
| VPNやプロキシをオン・オフしたのに、一部の名前がまだ反対側に解決される | 別の経路で取得したレコードがまだキャッシュに残っている |
| ローカル開発用のドメインの向き先を変えた | キャッシュされた応答、またはキャッシュされた「存在しない」が使い回されている |
| ある名前がこのPCでは開けないのに、同じネットワークのスマートフォンでは開ける | 失敗した名前解決がネガティブ エントリとしてキャッシュされている可能性がある |
どの場合も対処は同じで、フラッシュしてから、Windowsが今どう解決するかを確かめ(後述の確認の節を参照)、アプリでもう一度試します。ブラウザーはタブを再読み込みするだけでなく、いったん終了して開き直してください。理由は次の節にあります。
DNSをフラッシュしても直らない場面
名前に応答する場所はいくつもあり、Windowsのキャッシュはその1つにすぎません。フラッシュが触るのもそこだけです。
- プロバイダーかサイト自体が落ちている。 どのサイトも開けない、あるいは同じネットワークのほかの端末でも開けないなら、問題は上流にあります。フラッシュしても何も変わりません。
- ルーターやDNSプロバイダーが古いレコードを持っている。 彼らも応答をキャッシュしています。ローカルでフラッシュしても、向こうが新しいレコードを早めに取りに行くことはなく、向こうのコピーが期限切れになるのを待つしかありません。
- ブラウザーが自分で名前を解決している。 Chromeのヘルプページによると、セキュアDNSは既定で自動モードでオンになっていて、Chromiumベースのブラウザーは独自のホスト リゾルバー キャッシュを持っています。Chromiumのnet-internalsページには「Host resolver cache」の下に「Clear host cache」ボタンがあります(ソース)。Chromeなら
chrome://net-internals/#dns、Edgeならedge://net-internals/#dnsを開いてクリックします。同じページのSocketsセクションには「Flush socket pools」もありますが、Chromiumはこれに「May break pages with active connections」と注記しているので、使うなら大事なタブを先に閉じておきましょう。 - DNSサーバーの設定そのものが間違っている。 間違った応答を返すか、まったく応答しないサーバーをWindowsが向いているなら、フラッシュしても同じサーバーにもう一度聞くだけです。設定 › ネットワークとインターネット › Wi-Fi › 既知のネットワークの管理(またはイーサネット)で確認し、使っているネットワークを選んで、IP割り当ての横の「編集」を開きます。Microsoftのネットワーク設定のページでは、自動 (DHCP)はルーターやアクセス ポイントからDNSサーバーのアドレスを受け取るとしたうえで、これを推奨しています。VPNを使う会社のPCでは、ここを変えると社内の名前が引けなくなることがあるので、先にそのPCの管理者に確認してください。
- ページが開けないのではなく遅いだけ。 名前解決がキャッシュされるのは、再利用が速いからこそです。ダウンロードが遅い、動画がカクつくといった症状がDNSのせいであることはまれで、キャッシュを空にすると次の何回かの名前解決はむしろ少し遅くなります。
キャッシュをフラッシュ・確認するコマンド
コマンド プロンプトかターミナルで:
ipconfig /flushdns
ipconfig /displaydns
PowerShellで:
Clear-DnsClientCache
Get-DnsClientCache
Microsoftのどちらのリファレンスにも、これらに管理者権限が必要だとは書かれておらず、Mole for Windowsも通常の、昇格していないプロセスから同じフラッシュを実行しています。管理されたPCでアクセス エラーが返ってきたら、ターミナルかコマンド プロンプトを管理者として実行し、そこでコマンドを実行してください。フラッシュはディスク上の何も削除せず、再起動も要りません。キャッシュはアプリが名前を引き直すうちにまた埋まっていきます。
高速化のつもりでフラッシュをスケジュールしたり、スタートアップ スクリプトに入れたりするのはやめましょう。温まったキャッシュこそが速い経路で、フラッシュが役に立つのは特定のレコードが間違っているときだけです。
キャッシュを疑う前にhostsファイルを確認する
hostsファイルに書かれた名前は、DNSより優先されます。Microsoftのhostsリセットの記事では、そのフォルダーを%WinDir%\System32\Drivers\Etc、通常はC:\Windows\System32\drivers\etcとしています。ファイル名は拡張子なしのhostsです。同じ記事によると、既定のファイルには#で始まるコメント行と、localhostのループバック対応付けしかありません。
開発ツールや広告ブロッカー、古いチュートリアルがここに行を足して、そのまま残していくことがあります。おかしな動きをしているドメインがこのファイルに載っていれば、そう解決される理由はその行です。変更するなら、まずコピーを残し(Microsoftの記事では古いファイルをHosts.oldに名前変更しています)、管理者として実行したエディターで必要な行だけを編集して、.txt拡張子を付けずに保存し、ipconfig /flushdnsを実行して、事前に読み込まれた古いエントリをキャッシュから消します。ファイルを削除したり、アクセス許可を変えたりはしないでください。
重めのリセットと、それぞれが変えるもの
MicrosoftのWi-Fiのトラブルシューティング記事では、次のコマンドをまとめて、管理者のコマンド プロンプトでこの順に実行するよう案内しています:
netsh winsock reset
netsh int ip reset
ipconfig /release
ipconfig /renew
ipconfig /flushdns
やっていることはまったく違い、DNSに関係するのは最後の1つだけです:
ipconfig /releaseはDHCPのリリースを送り、ipconfigリファレンスによると、アドレスを自動取得するよう設定されたアダプターのTCP/IPを無効にします。/renewで新しいアドレスを取得するまでオフラインになるので、リモート デスクトップのセッション越しにこれだけを実行するのは避けてください。ipconfig /renewはDHCPに新しい構成を要求します。アドレスを自動取得するよう設定されたアダプターでしか使えません。netsh winsock resetはWinsockカタログをクリーンな状態に戻し、カスタムのレイヤード サービス プロバイダーを取り除きます(netsh winsock)。VPNクライアントやセキュリティ ツールの中にはこのプロバイダーを入れるものがあるので、実行後はそれらのアプリを確認しましょう。netsh int ip resetはレジストリのTCP/IPとDHCPのパラメーター キーを上書きします。MicrosoftのTCP/IPリセットの記事によると、TCP/IPを削除して再インストールするのと同じ効果があります。管理者権限と再起動が必要で、記事のサンプル ログでは静的IPアドレス、ゲートウェイ、DNSサーバーがリセットされています。どれかを手動で設定しているなら、先に書き留めておいてください。- ネットワークのリセット(設定 › ネットワークとインターネット › ネットワークの詳細設定 › ネットワークのリセット)は、すべてのネットワーク アダプターとその設定を削除し、PCの再起動後に既定値で再インストールします。MicrosoftのWi-Fi記事は、VPNクライアント ソフトウェアやHyper-V仮想スイッチの再インストールと再設定が必要になる場合があること、既知のネットワークがパブリック ネットワーク プロファイルに設定される場合があることを注意しています。
症状が「ある名前が古いアドレスに解決される、または解決されない」だけなら、どれも必要ありません。フラッシュとDNSサーバー、hostsファイルの確認で説明がつかなかったあとに、接続全体が壊れているときの手順として使ってください。
直ったか確認する
- キャッシュだけに問い合わせて、Windowsがその名前に何を保持しているかを見ます:
powershell
Resolve-DnsName example.com -CacheOnly
Resolve-DnsNameに-CacheOnlyを付けると「ローカル キャッシュだけを使ってこのクエリを解決」します。フラッシュ直後と、アプリで再試行したあとにもう一度実行すれば、どの応答がキャッシュされたかがわかります。
- 通常どおり解決し、次にhostsファイルを飛ばしてもう一度解決して、結果を比べます:
powershell
Resolve-DnsName example.com
Resolve-DnsName example.com -NoHostsFile
2つの応答が違えば、原因はhostsファイルの行です。
- DNSサーバーに直接聞きます。nslookupリファレンスでは、2番目の引数が問い合わせ先のサーバーで、省略するとnslookupは既定のDNSネーム サーバーを使います。
cmd
nslookup example.com
nslookup example.com 1.1.1.1
設定済みのサーバーが古いアドレスを返し、別のサーバーが新しいアドレスを返すなら、古いレコードはまだ上流でキャッシュされていて、待つのが解決策です。どちらも古いアドレスを返すなら、レコードはまだ変わっていません。
- 問題のあったブラウザーやアプリを終了して開き直し、ChromeかEdgeならホスト キャッシュもクリアします。
Moleでできること
Mole for Windowsの最適化には、ネットワークと検索のグループに「DNSキャッシュをクリア」があります。WindowsのDnsFlushResolverCache関数を呼び出し、ipconfig /flushdnsと同じWindowsのDNSクライアント キャッシュをクリアするもので、管理者の確認なしで実行されます。Windowsのヘルプページに最適化のほかのメンテナンスと並べて載っていて、Windowsの最適化がしていることでは各タスクがどの症状に対応するかを説明しています。
Moleのネットワーク修復はこれで全部です。WinsockやTCP/IPのリセット、アドレスのリリースや更新、ネットワーク アダプターの再インストールはせず、VPN接続、静的アドレス、hostsファイル、ブラウザー独自のホスト キャッシュにも触れません。それらには上のコマンドを使ってください。名前が引けないのではなくブラウザーが遅いと感じてここに来たのなら、ブラウザーのストレージについてはWindowsキャッシュガイドで扱っています。
よくある質問
Windows 11でDNSをフラッシュするには?
コマンド プロンプトかターミナルでipconfig /flushdnsを、またはPowerShellでClear-DnsClientCacheを実行します。どちらもすぐに反映され、再起動は不要です。
DNSをフラッシュするとChromeやEdgeのDNSキャッシュも消えますか?
消えません。chrome://net-internals/#dnsかedge://net-internals/#dnsを開いて「Clear host cache」をクリックし、ブラウザーを開き直してください。
DNSキャッシュをフラッシュしても安全ですか?
安全です。消えるのはキャッシュされた名前解決の結果だけで、Windowsは次の要求で取り直します。よく並べて紹介されるnetsh int ip resetやネットワークのリセットのようなリセット コマンドは変更範囲がずっと広く、静的な設定やVPNアダプターが消えることがあります。
フラッシュしたのにサイトが古いアドレスに行くのはなぜ?
hostsファイル、ブラウザー独自のキャッシュ、そして設定済みのDNSサーバーにnslookupで聞いてもまだ古いアドレスが返るかを確認してください。サーバーやルーターがまだ古いレコードを持っているなら、そのコピーが期限切れになるまではローカルのフラッシュでは変えられません。