dnsdist

DNSに特化したリバース・フォワード兼用ロードバランサー。
バックエンド死活監視、ポリシールーティング、QoS制御などのLSLBが備える機能を実装している。
設定ファイルはLua言語で記述するので、環境に合わせてスクリプト主体の細かい制御も出来る。
DNSクエリ処理に限定すると、dnsdistはクエリ・フォワード動作に特化している為、
バックエンドに権威DNS・キャッシュDNSなどを構築する必要がある。
 
アプリケーションは単一バイナリ動作なので、機能を盛り過ぎるとバイナリが70MB程まで大きくなる。
必要な機能を抜粋して自前でソースビルドを行うと、バイナリ容量と使用メモリ容量の削減が出来る。

参考サイト

インストール

  • 1. ソースビルド
    ソースビルドだと様々なディストリビューションで動作して汎用性が高いのでソースビルドする。
    今回はopenSUSEでビルドを行っているが、CentOS/Debianでも同様の手順でビルド出来る。
    下記のビルドオプションはフル機能を有効化している為、不必要な機能を削除するとバイナリが更に軽くなる。
    # zypper install libedit-devel libsodium-devel systemd-devel fstrm-devel protobuf-devel boost-devel re2-devel
    # wget "https://downloads.powerdns.com/releases/dnsdist-1.3.3.tar.bz2"
    # tar jxvf dnsdist-1.3.3.tar.bz2
    # cd dnsdist-1.3.3
    # ./configure --prefix=/usr/local/dnsdist-1.3.3 \
                  --enable-dns-over-tls             \
                  --enable-dnscrypt                 \
                  --enable-fstrm                    \
                  --enable-re2                      \
                  --enable-systemd                  \
                  --with-ebpf                       \
                  --with-lua                        \
                  --with-net-snmp                   \
                  --with-protobuf                   \
                  --with-systemd                    \
                  --with-systemd-modules-load
    # make
    # make install
    # ln -s /usr/local/dnsdist-1.3.3 /usr/local/dnsdist
     
  • 2. 起動準備
    dnsdist専用ユーザで動作させる為、実行ユーザの作成とサービスファイルの準備を行う。
    さらに、今回はDNSクエリログのローカル出力を有効化する為、ログディレクトリ作成、ログローテート設定も実施する。
    バージョン1.5以上の環境でsystemd-notifyを使う環境では、ユーザ・グループ指定が出来なくなった。
    この制御は、systemdでchroot同等の制御をしている事からエラーメッセージを出力する仕様に変わったため。
    エラーを回避するにはユーザ・グループ指定を止めるか、systemd-simpleに変更する必要がある。
 ディレクトリ作成
 サービスファイル
 起動オプション
 ログローテート

コンフィグ

構築例ではdnsdistのコンフィグを "/etc/dnsdist/dnsdist.conf" としている為、
下記コンフィグ例も同じファイルに設定を行う。
dnsdistの設定は単純な為、単にDNSロードバランサーとして稼働させるならば、
「DNSクエリ・クエリタイプ・接続元IPアドレス・パケット制御」の4項目を抑えれば設定出来る。
 
複数のポリシーを組み合わせる時は、MatchingPackets(Selectors)の "AndRule/NotRule/OrRule" 条件、
バックエンドのサーバ設定は、Servers/Poolsの "newServer/getServer" を利用する。
その他、細かい設定内容は公式ドキュメントの下記3項目を読めば大体判る。

  • Configuration Reference
  • Loadbalancing and Server Policies
  • Packet Policies
     
     単純ロードバランサー