以前から遊び用に構築している自宅のDNS環境ですが、さらに構成を変更してみました。
あくまで遊びと検証を兼ねているので、最適化されているわけではありません。
recursive serverは単体ではなく、containerの形でUnbound、PowerDNS recursor、Knot resolver、stubby、dnscrypt-proxyなどで構成されています。
Authoritative Serverも単体ではなく、NSDとKnot DNSで構成されています。以前にも書いた通り、PowerDNSについては、別途DBを用意する必要があるので、今のところ構成からは外しています。
MaraDNSとかrust DNSとかもあるんですけど、イマイチ設定が分からず。勉強中です。
DNSのロードバランスだけを考えるのであれば、本来dnsdistだけで用件は満たせるのですが、NginxについてはあくまでNginxのUDPロードバランス機能が使いたかっただけです。
Nginxでドメインでの振り分けについては、結局、これといった解決方法が思い浮かばなかったので、recursiveとAuthoritativeの機能ごとに待ち受けポートを用意し、そこに対して前段のdnsdistで振り分ける、という構成にしています。
server {
listen 1153 udp reuseport;
listen [::]:1153 udp reuseport;
listen 1153 reuseport;
listen [::]:1153 reuseport;
include /etc/nginx/proxy.conf;
proxy_pass auth_backends;
}
server {
listen 1053 udp reuseport;
listen [::]:1053 udp reuseport;
listen 1053 reuseport;
listen [::]:1053 reuseport;
include /etc/nginx/proxy.conf;
proxy_pass recursor_backends;
}
dnsdistでドメイン毎に振り分ける設定は、DNS関連の情報でいつもお世話になっている、東さんのスライド情報を参考にしています。
https://dnsops.jp/bof/20161201/bind2other.pdfnewServer({address="127.0.0.1:1153", pool="auth"})
newServer({address="127.0.0.1:1053", pool="resolver"})
authdomains = newSuffixMatchNode()
authdomains:add(newDNSName("example.com."))
authdomains:add(newDNSName("example.jp."))
allow_recursion = newNMG()
allow_recursion:addMask("192.168.0.0/16")
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")
まぁ機能分離出来て良いのではないかなと。
dnsdist:
- 問い合わせドメイン毎の振り分け
- spam/botフィルター
- アクセス制御
- 接続ポリシー制御
- ロードバランス機能は使わず
Nginx:
- ロードバランス機能のみ
まぁ、dnsdistについては、接続先のNginxを複数にすることで可用性を上げられますが今のところはしていません。
複数段になることでレイテンシーへの影響はあるでしょうが、自宅環境だからそこまで気にせず。
そのうち、ちゃんとdnsperfで性能測定はしておこうとおもいます。
課題:
直接、DNSとは関係が無いのですが、Nginxが所属するネットワークを、containerがあるbridgeインターフェースに接続した形で、dnsdistからlogを確認すると、Nginxのポートがフラッピングしているように見えるんです。
Marking downstream 192.168.88.254:1153 as 'up'
Marking downstream 192.168.88.254:1153 as 'down'
Marking downstream 192.168.88.254:1153 as 'up'
Marking downstream 192.168.88.254:1153 as 'down'
Marking downstream 192.168.88.254:1153 as 'up'
Marking downstream 192.168.88.254:1153 as 'down'
Marking downstream 192.168.88.254:1153 as 'up'
Marking downstream 192.168.88.254:1153 as 'down'
Marking downstream 192.168.88.254:1153 as 'up'
Marking downstream 192.168.88.254:1153 as 'down'
Marking downstream 192.168.88.254:1153 as 'up'
Marking downstream 192.168.88.254:1153 as 'down'
Marking downstream 192.168.88.254:1153 as 'up'
Marking downstream 192.168.88.254:1153 as 'down'
Marking downstream 192.168.88.254:1153 as 'up'
netstatコマンドなどで確認しても開放されているように見えるし、いちおうKernelパラメータで、以下のパラメータなどは有効にしているつもりなのですが・・・
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.eth0.forwarding = 1
net.ipv4.ip_forward = 1
net.ipv4.conf.docker0.route_localnet = 1
確認している環境は以下の通り。
$ docker version
Client:
Version: 18.09.0
API version: 1.39
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:52:51 2018
OS/Arch: linux/arm64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.0
API version: 1.39 (minimum version 1.12)
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:17:01 2018
OS/Arch: linux/arm64
Experimental: true
とりあえず、--network=host
にして、ホストPC側の制御にすると問題が発生しなくなります。というわけで、iptablesの問題なのかなと思いつつ、どのあたりから手を付ければいいのか・・・
このあたりの解決できる情報をお持ちの方、どうぞご教授ください。