[OS X] DHCP で取得した DNS サーバを使いつつ dnsmasq を使う
検証や開発のために OS X ローカルで dnsmasq を使うとき、
- リゾルバの向き先を変えるためにいちいちネットワーク環境設定を開くのが面倒 (コマンドでもできるけど)
- 指定ドメイン名以外は通常通り名前解決したい
と思っている人のために。
TL;DR
/etc/resolver 配下に指定ドメイン名でファイルを作れば良い。
方法
指定ドメインのリゾルバを変更
設定
$ sudo mkdir /etc/resolver
$ sudo chown <USER>:wheel /etc/resolver
$ echo 'nameserver 127.0.0.1' > /etc/resolver/example.com
OS X では /etc/resolver 配下にドメイン名でファイルを作る (書式は resolv.conf と同じ) と、そのドメインの DNS サーバを変更することができる。
今回はローカルの dnsmasq に向けるので、nameserver 127.0.0.1
としている。
これによって通常通り /etc/resolv.conf を使いつつも、指定のドメインのみ 127.0.0.1 を使ってくれるようになる。
場所移動等で、DHCP で取得した DNS サーバが変わっても気にしないで良くなる。
いちいち sudo しなくて良いように、/etc/resolver のオーナーをログインユーザにしておくと良い。
確認
$ scutil --dns
...snip...
resolver #2
domain : example.com
nameserver[0] : 127.0.0.1
flags : Request A records, Request AAAA records
reach : Reachable,Local Address
...snip...
dnsmasq
インストール
$ brew install dnsmasq
設定
/usr/local/etc/dnsmasq.conf
listen-address=127.0.0.1
user=<USER>
conf-dir=/usr/local/etc/dnsmasq.d
resolv-file=/etc/resolv.conf
/usr/local/etc/dnsmasq.d/example.com
address=/www.example.com/10.0.0.101
resolv-file で /etc/resolv.conf を指定することで、指定のドメインの中でも dnsmasq にてマッチしなかったものは、/etc/resolv.conf の DNS サーバに問い合わせるようになる。
起動・自動起動設定
$ sudo cp -a /usr/local/opt/dnsmasq/homebrew.mxcl.dnsmasq.plist /Library/LaunchDaemons
$ sudo chown root:wheel /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
$ sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
再起動・リロード
$ pkill dnsmasq
user を指定しているので、ログインユーザで kill して再起動できる。(launchctl を叩くのは面倒)
さいごに
/etc/resolver 配下にファイルを置いてから、実際に dnsmasq に聞きに行ってくれるようになるまで 2,3 分のラグがある気がする。
- 初稿 (Mon Dec 8 20:24:07 JST 2014)