Macにdjbdnsを入れる


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に投げるように設定することで、要件を満たそうと思う。


```/bin/sh
% brew install djbdns
```

一緒にdaemontoolsも入る。(daemontoolsはdjb様のサービス管理ツール群)

## ユーザーを作る。
正直MacOSでユーザーを作る方法は良くわかってない。

```/bin/sh
% 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スクリプトに追加しておく。

```/bin/sh
% sudo mkdir -m 755 /service
% sudo ln -s /var/service/dnscache /service/
% sudo ln -s /var/service/tinydns /service/
```

launchctlに追加するためにplistがいる。 [親切な人がgistで公開していたのをいじる。](https://gist.github.com/bobpp/824501)

```
% 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`とかして動作確認