Macでdnsmasqを使ってお手軽名前解決

最近興味があってBoxenを調べています。BoxenはMacで開発するための
環境をよしなに整えてくれるツールなんですが、その中で気になったのが下記のヤツ

dnsmasq w/ .dev resolver for localhost

via https://github.com/boxen/our-boxen

はて?dnsmasqで.dev resolver for localhostてどんな事してくれるんじゃろかい?

何してくれんの?

端的に言うと

  • dnsmasqでローカル向けにDNSサーバを立てる
  • .dev のドメインはローカル(127.0.0.1)で名前解決できるようにする

あぁ上に書いてある説明どおりですね。ていう事をやってくれます。

もう少し噛み砕くと、ローカルでの開発用に hoge.dev, fuga.devみたいなドメインが欲しくなった時って、/etc/hostsに一個一個定義してたりしましたが、もうこんな事しなくてもいいんですぜ旦那。「*.dev」のドメインであれば、勝手に127.0.0.1に向く用にできまっせ。という話

# /etc/hosts

127.0.0.1   hoge.dev
127.0.0.1   fuga.dev

ではboxenが自動でやってくれるような事をわざわざ手動でやってみます。アナログ最高。ヒャッハー!!!!

ちなみにboxenのpuppetのヤツはここです。

dnsmasq のインスコ

$ brew install dnsmasq

設定ファイルの用意

# 設定ファイルのコピペ
$ cp $(brew list dnsmasq | grep /dnsmasq.conf.example$) /usr/local/etc/dnsmasq.conf

# 自動起動の設定ファイルコピペ
$ sudo cp $(brew list dnsmasq | grep /homebrew.mxcl.dnsmasq.plist$) /Library/LaunchDaemons/
$ sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist

dnsmasq.confの設定変更

# /usr/local/etc/dnsmasq.conf

# wildcardでの名前解決を許す?
bind-interfaces 
# launch deamonで動かすために常にforgroundで起動
keep-in-foreground  
#  /etc/resolve.confを見ない
no-resolv 

#  *.dev ドメインへのアクセスは全てlocalに。
address=/dev/127.0.0.1 
#  名前解決する時にローカルを見るためには自動的にloopbackしてくれんので、明示的に設定するとかなんとか?
listen-address=127.0.0.1 

/etc/resolver/devの設置

  • Macは特定のドメインDNSだけを切り替える事ができる
  • /etc/resolver配下にそのドメインと同じ名前でファイルを設置するればおk
  • 書式は /etc/resolve.confと一緒
# /et/resolver/devを作成
$ sudo mkdir -p /etc/resolver
$ sudo touch /etc/resolver/dev

# 中身はこの一行のみ
nameserver 127.0.0.1

DNSのキャッシュクリア

一応キャッシュのクリア

$ dscacheutil -flushcache

確認

ここまで作業は終わりあとは確認

# *.dev のドメインは全て127.0.0.1が返ってくればOK
$ ping -c 1 hoge.dev
$ ping -c 1 hoge.fuga.dev
$ ping -c 1 hoge.fuga.piyo.dev

# 他の名前解決に支障がないか一応確認
$ ping -c 1 www.google.com

余談

  • /etc/hostsを弄る必要が無くなったのは良い。
  • dev以外に対応するドメインを増やしたかったら? 例えば *.hogeみたいな。
    • /usr/loca/etc/dnsmasq.conf に "address=/hoge/127.0.0.1" の行を追加
    • /etc/resolver以下にhogeファイルを置けば良い。
  • もうちょっと修行しないとオジサンダメです。