slackみたいなサブドメインでグループを切り分けるサイトなんかをローカル環境でシコシコ作るには、とりあえずは/etc/hosts
を使うのだけど、時間が経つとカオス化してくる。そうなってくると、オレオレdnsが欲しくなってくるので、意を決して立ててみた。
Mac OSのバージョンは10.10.5
DNSにはミニマリストdjb様のdjbdnsが楽ちんなので採用。BINDはよく知らない。BINDってよくハッキングされてるよね(小並感)
(djbdnsは2001年で開発が止まっており、IPv6とかには対応していません。あくまで簡便に開発環境を作るための目的で使い、本番用とでは別のDNS(Amazon Rout53とか)を使ったほうが良いかと思います)
目標
-
*.localdev
は127.0.0.1を返すようにする。 - それ以外は、普通にネットが使えるように
セットアップ
djbdnsはキャッシュサーバのdnscacheと、コンテンツサーバのtinydnsに別れた作りになっている。
今回はdnscacheが特定ドメインへのリクエストをtinydnsに投げるように設定することで、要件を満たそうと思う。
% brew install djbdns
一緒にdaemontoolsも入る。(daemontoolsはdjb様のサービス管理ツール群)
ユーザーを作る。
正直MacOSでユーザーを作る方法は良くわかってない。
% sudo dscl . create /Groups/djbdns PrimaryGroupID 151
% sudo dscl . create /Users/dnsrun UniqueID 151
% sudo dscl . create /Users/dnsrun PrimaryGroupID 151
% sudo dscl . create /Users/dnsrun UserShell /bin/false
% sudo dscl . create /Users/dnsrun NSHomeDirectory /nohome
% sudo dscl . create /Users/dnslog UniqueID 152
% sudo dscl . create /Users/dnslog PrimaryGroupID 151
% sudo dscl . create /Users/dnslog UserShell /bin/false
% sudo dscl . create /Users/dnslog NSHomeDirectory /nohome
% sudo dscl . create /Groups/djbdns GroupMembership dnsrun dnslog
% sudo defaults write /Library/Preferences/com.apple.loginwindow HiddenUsersList -array-add dnsrun dnslog
tinydnsの設定
*.localdevのみに応答させるように設定。
tinydnsとdnscacheが同一サーバで動くことになるので、lo0に127.0.0.2
でaliasを作り、tinydnsはそっちを見るように変更する。
% sudo /sbin/ifconfig lo0 alias 127.0.0.2 netmask 0xff000000
% sudo tinydns-conf dnsrun dnslog /var/service/tinydns 127.0.0.1
% sudo echo '127.0.0.2' > /var/service/tinydns/env/IP
/var/service/tinydns/root/data
にlocaldevドメインの設定を書いたら、make
.localdev::600::
+*.localdev:127.0.0.1
dnscacheの設定
% sudo mkdir -m 755 /var/service
% sudo dnscache-conf dnsrun dnslog /service/dnscache 127.0.0.1
% sudo echo '127.0.0.2' > /var/service/dnscache/root/servers/localdev
動作確認
手動で起動させる。以下2行をscreenなり、別のターミナルなりで打ってそれぞれを起動
% cd /var/service/tinydns && sudo run
% cd /var/service/dnscache && sudo run
% env DNSCACHEIP=127.0.0.1 dnsqr a mogera.hogehoge.localdev
1 mogera.hogehoge.localdev:
57 bytes, 1+1+0+0 records, response, noerror
query: 1 mogera.hogehoge.localdev
answer: mogera.hogehoge.localdev 86400 A 127.0.0.1
% env DNSCACHEIP=127.0.0.1 dnsqr a www.google.com
1 www.google.com:
288 bytes, 1+16+0+0 records, response, noerror
query: 1 www.google.com
answer: www.google.com 293 A 202.224.62.94
answer: www.google.com 293 A 202.224.62.109
answer: www.google.com 293 A 202.224.62.99
answer: www.google.com 293 A 202.224.62.93
answer: www.google.com 293 A 202.224.62.88
answer: www.google.com 293 A 202.224.62.104
answer: www.google.com 293 A 202.224.62.84
answer: www.google.com 293 A 202.224.62.98
answer: www.google.com 293 A 202.224.62.89
answer: www.google.com 293 A 202.224.62.118
answer: www.google.com 293 A 202.224.62.114
answer: www.google.com 293 A 202.224.62.123
answer: www.google.com 293 A 202.224.62.103
answer: www.google.com 293 A 202.224.62.108
answer: www.google.com 293 A 202.224.62.113
answer: www.google.com 293 A 202.224.62.119
いい感じのような気がする。
サービス化
必要なときだけtinydns&dnscacheを起動するのも良いんだけど、いちいちシステムのDNS設定を変更するのも面倒なので、サービス化させる。
/sbin/ifconfig lo0 alias 127.0.0.2 netmask 0xff000000
をtinydnsのrunスクリプトに追加しておく。
% sudo mkdir -m 755 /service
% sudo ln -s /var/service/dnscache /service/
% sudo ln -s /var/service/tinydns /service/
launchctlに追加するためにplistがいる。 親切な人がgistで公開していたのをいじる。
% sudo cp com.github.mxcl.homebrew.daemontools.plist /Library/LaunchDaemons/
% sudo /usr/sbin/chown root:wheel /Library/LaunchDaemons/com.github.mxcl.homebrew.daemontools.plist
% sudo launchctl load /Library/LaunchDaemons/com.github.mxcl.homebrew.daemontools.plist
ネットワーク設定でDNSを127.0.0.1に。
適当にdig
とかして動作確認