dnsdist を使って 内外の振り分けする DNS権威サーバを 構築しようとしたら ポート使ってるって エラーになった。
計画は こうだった。
1、bindから脱却する
2、DNS権威サーバに NSDを採用
3、リゾルバに unboundを採用
4、内向きと外向きで別にしたいのでdnsdistで 振り分け
5、それ以外は unboundで 解決させる
ubuntuのLTSの 16.04で dnsdist を aptで インストールしたら 1.0α だったので 17.04 にしてみた。 すると 1.1.0 になったので これで チャレンジしてみることにした。
最初の設定は ↓のような感じ
newServer({address="127.0.0.1:8053", pool="auth"})
newServer({address="127.0.0.1:8153", pool="local"})
newServer({address="127.0.0.1:8253", pool="resolver"})
authdomains = newSuffixMatchNode()
authdomains:add(newDNSName("example.com."))
allow_recursion = newNMG()
allow_recursion:addMask("10.0.0.0/8")
addAction(AndRule({SuffixMatchNodeRule(authdomains),NetmaskGroupRule(allow_recursion)}), PoolAction("local"))
addAction(SuffixMatchNodeRule(authdomains), PoolAction("auth"))
addAction(NetmaskGroupRule(allow_recursion), PoolAction("resolver"))
addAction(AllRule(), RCodeAction(5))
addACL("0.0.0.0/0")
addACL("::0/0")
addLocal("0.0.0.0:53")
addLocal("[::]:53")
sudo systemctl start dnsdist.service で 起動するとエラーが発生し、journalctl -xe で内容を確認した。
-- Unit dnsdist.service has begun starting up.
Jul 12 12:24:08 DNSmaster dnsdist[1868]: Configuration '/etc/dnsdist/dnsdist.conf' OK!
Jul 12 12:24:08 DNSmaster dnsdist[1868]: Configuration '/etc/dnsdist/dnsdist.conf' OK!
Jul 12 12:24:08 DNSmaster dnsdist[1881]: Added downstream server 127.0.0.1:10053
Jul 12 12:24:08 DNSmaster dnsdist[1881]: Added downstream server 127.0.0.1:20053
Jul 12 12:24:08 DNSmaster dnsdist[1881]: Fatal error: binding socket to 0.0.0.0:53: Address already in use
Jul 12 12:24:08 DNSmaster systemd[1]: dnsdist.service: Main process exited, code=exited, status=1/FAILURE
Jul 12 12:24:08 DNSmaster systemd[1]: Failed to start DNS Loadbalancer.
と bindできないという エラーになった。
netstat で しらべると
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:5355 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 :::5355 :::* LISTEN
udp 0 0 127.0.0.53:53 0.0.0.0:*
udp 0 0 0.0.0.0:5355 0.0.0.0:*
udp6 0 0 :::5355 :::*
127.0.0.53 が いるじゃないか。
おもわず 「誰だよ」と こえが 出てしまった。
調べてわかったのだが、systemdの一部として 提供されている リゾルバだった。設定も /etc/systemd/resolved にあり、 停止することもできるようだ。
(参考にしたページ
https://kledgeb.blogspot.jp/2016/06/ubuntu-1610-7-dnssystemd-resolved.html
http://nao-yu-ki-pc.blogspot.jp/2017/04/systemd-resolveubuntudns.html )
その正体こそ systemd-resolved だ。 ubuntu では 16.10から すべてのリリースで採用されたので ubuntu server でも 採用されたのだった。
標準提供される リゾルバが あるんだったら 利用しないてはないので 先ほどの設定ファイルを 次のように修正した。
newServer({address="127.0.0.1:8053", pool="auth"})
newServer({address="127.0.0.1:8153", pool="local"})
newServer({address="127.0.0.53:53", pool="resolver"})
authdomains = newSuffixMatchNode()
authdomains:add(newDNSName("example.com."))
allow_recursion = newNMG()
allow_recursion:addMask("10.0.0.0/8")
addAction(AndRule({SuffixMatchNodeRule(authdomains),NetmaskGroupRule(allow_recursion)}), PoolAction("local"))
addAction(SuffixMatchNodeRule(authdomains), PoolAction("auth"))
addAction(NetmaskGroupRule(allow_recursion), PoolAction("resolver"))
addAction(AllRule(), RCodeAction(5))
addACL("0.0.0.0/0")
addLocal("10.0.0.10:53")
さて、 この設定で うまいこと いくかな。