[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)