Mac OS X (Mountain Lion)でhostsファイルへの変更が有効にならないのでdnsmasqをインストールしてみた

この現象にずーっと悩まされていました。
Mac OS Xのとあるアップデート以降、”/etc/hosts”ファイルの変更が適用されなくなりました。正確には、”/etc/hosts”ファイルに書き込んだ内容が一切無視されている様子。
実はこれ、とても困る現象です。

SplitShire_IMG_5748
サイト構築する際、ローカルマシン(Mac OS X Mountain Lion)に環境を作って構築を始めます。
その時に、後で移行しやすいように、例えばこのブログであれば”local.openmedialabo.net”などというホスト名をローカルIPに割り当てます。
その割り当て情報を”/etc/hosts”に書き込んでいたのですが、あるタイミングから”/etc/hosts”に記述した設定が無視されていることが分かりました。
この現象でずーっと悩んでいたのですが、今回、Vagrantをインストールしてみた時に、いよいよ対処しないといけないなあ、と思ったのでdnsmasqで対処してみました。
(Vagrantについてはもう少し勉強してから書きます)

Xcodeをインストール

まずはXcodeをApp Storeからインストールします。
インストールしたら起動して利用規約に同意し、Command Line Toolsをインストールしておきましょう。
Command Line Toolsのインストールは簡単ですが、念のために下記を参照下さい。

homebrewをインストール

dnsmasqを簡単にインストールするためにhomebrewをインストールします。
既にインストール済みの方も多いかと思いますので、その場合は読み飛ばして下さい。
なお、ここでの作業はほぼターミナル(黒い画面)からとなります。
まずはインストールします。
[bash]# ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"[/bash]
もし上記コマンドでエラーが表示されたりする場合はXcodeやXcodeのCommand Line Toolsがインストールされているか確認して下さい。
インストールが終わったようなら、引き続きターミナルより下記コマンドを実行します。
[bash]# brew doctor[/bash]
homebrewがきちんとインストールされていれば
[bash]Your system is ready to brew.[/bash]
と表示されます。

dnsmasqをインストール

さて、ここからが多分本題です。
まずはdnsmasqをインストールします。
[bash]# brew install dnsmasq[/bash]
インストールが終わったら、設定ファイルの場所を探してみます。
[bash]# brew –prefix dnsmasq
恐らく次の行が表示されると思います
/usr/local/opt/dnsmasq[/bash]
設定ファイルをコピーしておきます。
その前にコピー先のディレクトリを生成します。
[bash]# sudo mkdir /usr/local/opt/dnsmasq[/bash]
先程、探した設定ファイルのフォルダ内にコピーすべき設定ファイルがありますので、下記コマンドでコピーします。
[bash]# sudo cp /usr/local/opt/dnsmasq/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf[/bash]
コピーしたら起動の設定を入れておきます。
Mac OS Xの場合、自動起動させるにはLaunchDaemonsという仕組みを使います。
[bash]# sudo cp /usr/local/opt/dnsmasq/homebrew.mxcl.dnsmasq.plist /Library/LaunchDaemons
# sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist[/bash]
これで起動しました。

dnsmasqが正常動作するように設定を変更していく

ここからが本番と言っても過言ではありません。
まず、”/etc/resolv.conf”をdnsmasq用にコピーします。
[bash]# sudo cp /etc/resolv.conf /etc/resolv.dnsmasq.conf[/bash]
コピーしたresolv.dnsmasq.confを書き換えます。
[bash]# sudo vi /etc/resolv.dnsmasq.conf
"nameserver"の記述があるかと思いますので、その前の行に下記を追加します。
order file, bind[/bash]
先程コピーした設定ファイルにresolv.confの場所を書き込みます。
[bash]# sudo vi /usr/local/etc/dnsmasq.conf
"resolv-file=という行を探して、コメント("#")を外します。そして下記のように書き換えます。
resolv-file=/etc/resolv.conf.dnsmasq[/bash]
次はMacの設定を変更します。
[システム環境設定]パネルを開いて、[ネットワーク]-[詳細]-[DNS]を開きます。
すると[DNSサーバ]という項目がありますのです、左下の[+]をクリックして、”127.0.0.1″と入力します。
[OK]ボタンをクリックし、その後、[ネットワーク]パネルで[適用]をクリックします。
ここまで変更したら、dnsmasqを再起動します。
ターミナルに戻り、下記コマンドを実行します。
[bash]sudo launchctl unload /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist[/bash]
“/etc/hosts”を書き換える度にdnsmasqの再起動が必要になります。
その場合は上記再起動コマンドを実行して下さい。

テストしてみます

念のためにDNSが正常に引けるか確認してみましょう。
まずはキャッシュを削除しておきます。こちらもターミナルで下記コマンドを実行して下さい。
[bash]# sudo dscacheutil -flushcache[/bash]
その後、私は下記で確認しています。
[bash]# dig www.yahoo.co.jp[/bash]
まあYahoo! Japanが引ければほぼ大丈夫だろう・・・と・・・。
他にも気になるところをいくつか引いてみるといいでしょう。
問題なくIPアドレスが返ってくれば大丈夫です。
もし返ってこなかったら・・・設定を見直して下さい。特に”/etc/resolv.dnsmasq.conf”の設定や、[システム環境設定]パネルのDNS設定辺りが怪しいと思います。
それでOKなら”/etc/hosts”に書き加えた設定を名前解決してみましょう。きちんと思い通りのIPが返ってくれば大丈夫です。
ハッキング対策などあるかとは思いますが、少々面倒ですよね・・・
この辺り、設定の自由が効いて、Linuxで培った知識が役に立つのもMac OS Xのいいところです。
[tmkm-amazon]B009X8GYTG[/tmkm-amazon]

Share this post