Mac
dns

macでnslookupできるけどpingできない時の対処法

mac で nslookup できるけど ping できないことがあり、解決方法を調べたのでメモします。

結論

僕のケースでは、次のコマンドで直りました。

sudo killall -HUP mDNSResponder

症状

なにかコード書いて、いざ git push しようとするとエラーになることがしばしばありました。
再起動すればとりあえず直るんですが1時間に1回とか再起動するハメになり面倒です。

$ git push
ssh: Could not resolve hostname github.com: nodename nor servname provided, or not known
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

DNS の不具合かなーと思ったんですが DNS とは疎通できています。

$ nslookup github.com
Server:        8.8.8.8
Address:    8.8.8.8#53

Non-authoritative answer:
Name:    github.com
Address: 192.30.255.113
Name:    github.com
Address: 192.30.255.112

ただし git push の他に ping とか curl も動きません。

$ ping github.com
ping: cannot resolve github.com: Unknown host

調査内容

なぜ名前解決できるのに ping が疎通しないかを調べたところ、 nslookup や dig は DNS サーバに問い合わせるのに対し、 ping や curl は mDNSResponder に問い合わせるのが理由のようでした(Ask Different: DNS Resolution Fails for ping and curl, but not dig)。

解決方法としては mDNSResponder を再起動すればよいようです(Ask Different: DNS not resolving on Mac OS X)。このQ&Aには再起動方法として次のコマンドが提案されています。

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist

しかしこのコマンドを打つと Operation not permitted while System Integrity Protection is engaged というエラーメッセージとともに失敗します。

Qiita: El CapitanのSystem Integrity Protection(rootless)の解除方法 にはエラーを回避する方法が書かれていますが、同記事によると

System Integrity Protectionは、そもそもマルウェアからの攻撃をかわすためのセキュリティ機能のようなので不用意に設定をオフにするのは推奨されません。くれぐれも自己責任での実行をお願いします。

ということなのであまり気が進みません。

もう少し簡素な方法がないか調べたところ https://gist.github.com/mipmip/1844353 に mDNSResponder のプロセスにシグナルを送って再起動を行う方法があり、試してみたら症状から回復しました。

sudo killall -HUP mDNSResponder

本質的な原因は謎ですが、とりあえずこの対処療法で我慢中です。

関連記事