[DNS][自分用メモ] 自宅環境にdnsdist 1.1.0を導入してみた。

2017-08-11 10:46:23AIX、UNIX、LinuxDNS, dnsdist, loadbalancer, performance, ロードバランサー, 設定

前々から気になっていたDNS firewall?やらロードバランサー機能を内包しているdnsdistが気になっていたので自宅環境に導入してみました。

トップにはこういうことが書いてあります。

dnsdist is a highly DNS-, DoS- and abuse-aware loadbalancer. Its goal in life is to route traffic to the best server, delivering top performance to legitimate users while shunting or blocking abusive traffic. /
http://dnsdist.org/

悪意のあるトラフィックを制御したり、ロードバランスしたり、悪意のある問い合わせをブロックしたり、色々なことができるようです。

とりあえず以下のバージョンのものを導入しました。

$ dnsdist --help
dnsdist 1.1.0

コンパイルするには、結構、関連するライブラリがあるので、公式が用意しているrepositoryから導入するのが一番いいと思います。

私は、手元で用意できた環境がaarch64な変則的な環境だったので、Ubuntuの公式のレポジトリからパッケージを持ってきてゴニョゴニョしていれました。

とりあえず完成した構成は以下のような感じになります。効率とかは一切考えていません。

PrimaryとかSecondaryとか書いてますが、あくまでクライアント側で設定する際の問題なので、特に大きな意味はありません。

各々3台の環境を用意して、それぞれにコンテンツDNSとキャッシュDNSを搭載している形になります。(コンテンツDNSにNSDを選択しているのは、自分にはどうしてもBINDを扱える気がしていないからです)

PrimaryとSecondaryに該当する環境に対して、dnsdistを導入しています。

-- Server related
newServer{address="192.168.1.223:9953", pool="resolver"}
newServer{address="192.168.1.224:9953", pool="resolver"}
newServer{address="192.168.1.248:9953", pool="resolver"}
newServer({address="192.168.1.223:10053", pool="auth"})
newServer({address="192.168.1.224:10053", pool="auth"})
newServer({address="192.168.1.248:10053", pool="auth"})
-- forwarding rule
authdomains = newSuffixMatchNode()
authdomains:add(newDNSName("kometch.local."))
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))
-- listening interface and port
addLocal("0.0.0.0:53", false)
addLocal("[::]:53", false)
-- access control
setACL({"192.168.0.0/16"})

コンテンツDNSをauthというpool単位にまとめ、キャッシュDNSをresolverという単位にまとめています。

内部ドメイン名として使用している"kometch.local“という問い合わせが、192.168.0.0/16の範囲のソースアドレスからの問い合わせが来た場合だけ、authというpoolに登録されているコンテンツDNSに問い合わせを行う形式です。

設定そのものは東さんの資料のままパクって大変参考にさせていただきました。

bind2other /
https://dnsops.jp/bof/20161201/bind2other.pdf

他にもサーバ単位に対して、重み付けをしてラウンドロビン的なこともしています。が、家庭内の問い合わせの数を考えると底までする必要はないです。そもそもロードバランスする必要もないですが。

キャッシュとコンテンツが分離していて、且つ、振り分けが自由にできることで、色々なパッケージを試せるのがいいかなぐらいです。

とりあえず、問い合わせのレイテンシやdropなどもdnsdist側で確認できますし、(もちろん、各DNSパッケージでも統計などは取れますが)各DNSパッケージに対して問い合わせが行く前にフィルタを噛ましたりできるのは、面白いことができると思います。

そろそろdnsdist 1.2.0が出そうな感じですが(Open-Xchangeカンファレンスがあるらしいので、たぶんその辺でしょう)、こちらについても色々な機能が更に実装されそうな感じなので、バージョンアップが出来たなら、さらに試してみようかと思います。

追伸:

ネットワークスイッチを噛ましているとはいえ、各環境への問い合わせのレイテンシに偏りがあるのが気になるところです。これってそれぞれのDNSパッケージ自体の性能ってことになるんでしょうか?

2019年9月28日:追記

今さらですが、Load balanceポリシーは以下のようなものがあります。

POINT

  • leastOutstanding
  • firstAvailable
  • wrandom
  • whashed
  • chashed
  • roundrobin

各パラメータの詳細については公式ドキュメントを確認してください。