MacのDNSキャッシュを消去する方法
MacのDNSキャッシュを消去するには、アプリケーション › ユーティリティ から ターミナル を開き、次を実行します。
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
求められたらMacのログインパスワードを入力します。うまくいっても何も表示されません。Macを再起動してもキャッシュは消えます。AppleのDNSキャッシュに関する記事にも、Macを再起動すればキャッシュされた情報を更新できると書かれています。
このAppleの記事はアーカイブ扱いで、もう更新されていません。いちばん新しい項目はOS X Yosemite 10.10.4以降向けの sudo killall -HUP mDNSResponder で、dscacheutil -flushcache はSnow Leopard向けとして載っているコマンドです。Appleはこれより新しい版を出していないので、上の1行は両方を実行します。killall の部分はAppleが現行のリリース向けに挙げているもので、dscacheutil -flushcache はマニュアルページ(man dscacheutil)によるとディレクトリサービスのキャッシュを消去するものです。同じマニュアルには、極端な場合にだけ使うようにとも書かれていて、古いDNSの応答が残っているのはその「極端な場合」に当たります。Mole MacにDNSを消去する機能はなく、これはターミナルでやる作業です。
DNSキャッシュとは
アプリが example.com に接続するとき、macOSはまずその名前をIPアドレスに変換する必要があります。Macではこの名前解決を mDNSResponder が担います。マニュアルページ(man mDNSResponder)では、ほかのプロセスに代わってDNS問い合わせを行い、応答をキャッシュしておくデーモンだと説明されています。
キャッシュがあれば、同じ名前を引くたびに往復する手間が省けます。各応答はそのドメインのDNSレコードが許す時間だけ保持され、切れたら取り直されます。たいていは誰も気づかないままうまく回ります。問題になるのは、期限が切れる前にキャッシュの応答が古くなったときです。サイトが新しいサーバーへ移った、DNSサーバーを変えた、一度失敗した名前解決の結果が使い回され続けている、といった場合です。
killall -HUP mDNSResponder の -HUP は、killall が送るシグナルを指定しています。付けないと killall はTERMを送ります(man killall)。AppleはDNSキャッシュをリセットする方法としてHUPの形を挙げているので、このフラグを省いたり -9 に変えたりしないでください。
DNSの消去が役に立つ場面
| 状況 | 消去が効く理由 |
|---|---|
| Webサイトやサーバーが移転したのに、Macがまだ古いアドレスにつながる | キャッシュされた応答の期限がまだ切れていない |
| ネットワーク設定でDNSサーバーを変えた | 以前のサーバーから得た古い応答がまだキャッシュにある |
/etc/hosts を編集したのに変更が反映されない |
hosts のマニュアルページによると、このファイルはmDNSResponderが読むため、以前の応答をまだ持っていることがある |
| 1分前に名前解決に失敗したサイトが、ほかの機器ではつながるのにまだ失敗する | 失敗した名前解決の結果がキャッシュされていることがある |
役に立たない場面
消去で消えるのは、Mac自身のリゾルバのキャッシュだけです。よくある構成のいくつかでは、これは関係ありません。
- プロキシ。 通信がHTTPやSOCKSのプロキシを経由しているなら、名前解決はプロキシ自身が行うことがよくあります。現在のシステムのプロキシ設定は
scutil --proxyで確認できます。 - VPN。 VPNは独自のDNSサーバーを入れたり、一部のドメインだけをそこへ回したりできます。
scutil --dnsで使われているすべてのリゾルバが見えます。ドメインが書かれた補助的なリゾルバは、そのドメインにだけ使われます。社内のドメインが引けないなら、見るべきはVPNのDNSです。 - ブラウザ自身のキャッシュ。 ブラウザは自前の短命なDNS結果を持ち、開いている接続を使い回すことがあります。消去したら、タブを再読み込みするだけでなく、ブラウザを完全に終了して開き直してください。
- 上流のキャッシュ。 ルーターやDNSプロバイダも応答をキャッシュしています。Macを消去しても、それらに新しいレコードを早く取りに行かせることはできません。
- サイトが実際に落ちている か、そのネットワークでブロックされている。別のネットワークにある機器でもつながらないなら、原因はMacのDNSではありません。
ページが開けないのではなく遅いだけなら、DNSキャッシュがボトルネックであることはまれです。より可能性の高い原因はMacのWi-Fiが途切れるとどのアプリがネットワークを使っているかで扱っています。
Macが実際にどう名前解決しているか確かめる
アプリが受け取る応答を見るには、システムのリゾルバを使います。
dscacheutil -q host -a name example.com
dscacheutil のマニュアルページによると、-q は標準の呼び出しを通して問い合わせを行い、キャッシュの結果を返すか、最新のデータを取りに行きます。
次に、DNSサーバーに直接問い合わせます。
dig example.com
dig はmacOSのリゾルバを通りません。マニュアルページによると /etc/resolv.conf に書かれたサーバーを使い、macOSのそのファイルには、システム上のほとんどのプロセスが使うDNS解決ではこのファイルは参照されないという注記があります。dig が新しいアドレスを返し、dscacheutil が古いアドレスを返すなら、違いはMacのキャッシュかリゾルバの設定にあり、消去で直るはずです。どちらも古いアドレスを返すなら、上流でまだレコードが変わっていません。
MacがどのDNSサーバーを使っているかを見るには、次を実行します。
scutil --dns
手動で設定したサーバーは システム設定 › ネットワーク にあります。ネットワークサービスを選び、詳細、続けて DNS をクリックします(Apple)。
キャッシュを疑う前に/etc/hostsを確認する
/etc/hosts に書かれた名前は、DNSより優先されます。開発ツール、広告ブロッカー、古いチュートリアルがここに行を足し、そのまま残していることがあります。中身を見るには、次を実行します。
cat /etc/hosts
通常のファイルには、localhost 向けの数行と、# で始まるコメントしかありません。おかしな挙動をしているドメインが書かれていたら、その行がそう名前解決される理由です。元のファイルのコピーを残したうえで、sudo 経由で起動したエディタでその行だけを編集し、それからキャッシュを消去します。localhost の行は削除しないでください。
結果を確かめる
- 消去のコマンドを実行します。
- 問題のドメインで
dscacheutil -q host -a name example.comをもう一度実行し、アドレスを確認します。 - 問題のあったブラウザやアプリを終了して開き直します。
- それでもだめなら、
dig、scutil --dns、scutil --proxyと比べて、どの層が応答しているかを確かめます。
やってはいけないこと
- 定期的に、あるいは速くするための小技としてDNSを消去しない。キャッシュが温まっていれば名前解決は速く、空にすると次の数回が遅くなります。
/etc/hostsを削除したり、権限を変えたりしない。- VPNや管理プロファイルを使っている職場や学校のMacで、管理者に確認せずにDNSサーバーを切り替えない。社内の名前が引けなくなることがあります。
- 「DNSを試す」ためにプロキシやVPNの設定を変えない。まず、どの層が応答しているかを突き止めます。
よくある質問
MacのDNSキャッシュを消去するには?
ターミナルで sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder を実行し、パスワードを入力します。Macを再起動しても消えます。
現行のmacOSでDNSを消去するコマンドは?
Appleのアーカイブ記事は、OS X 10.10.4以降向けに sudo killall -HUP mDNSResponder を挙げていて、これより新しいものは公開されていません。先に sudo dscacheutil -flushcache も実行するのが一般的で、これはキャッシュされたデータを消すだけです。
MacでDNSを消去するとブラウザのキャッシュも消えますか?
いいえ。消えるのはmacOSのリゾルバのキャッシュだけです。ブラウザが自前のDNS結果や開いている接続を使い回さないよう、ブラウザを終了して開き直してください。
消去したのに、サイトがまだ古いアドレスにつながるのはなぜですか?
/etc/hosts、プロキシやVPN、そして dig が新しいアドレスを返すかを確認してください。上流でDNSレコードがまだ変わっていないなら、ローカルでいくら消去しても効きません。
MoleでDNSキャッシュを消去できますか?
いいえ。Mole MacにDNSを消去する機能はありません。上のターミナルのコマンドを実行するか、Macを再起動してください。