Ubuntu
dns
NSD
systemd-resolved
dnsdist

127.0.0.53:53 って 誰が 使ってるの?

More than 1 year has passed since last update.

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 になったので これで チャレンジしてみることにした。

最初の設定は ↓のような感じ

/etc/dnsdist/dnsdist.conf
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 でも 採用されたのだった。

標準提供される リゾルバが あるんだったら 利用しないてはないので 先ほどの設定ファイルを 次のように修正した。

/etc/dnsdist/dnsdist.conf
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") 

さて、 この設定で うまいこと いくかな。