gdnsd

オープンソースのグローバルロードバランサー(GSLB)
ソースコード量が少なく、高速動作と脆弱性の発生しにくさが特長となっている。
ただし、ソースコードを減らす為にプログラムのロギング機能が省略されていたり、
細かいヘルスチェックはスクリプトを別途作成する必要がある為、
フル機能を使いこなすには知識・技術が必要なソフトウェアである。
 
gdnsdは通信事業者レベルでの採用実績がある。
また、ソースコードが少ない割には整理されている為、機能追加も比較的楽に出来る。

参考サイト

構築環境

  • 配布サイト
  • 公式ドキュメント
     
    ParameterDNS-ADNS-B
    OSopenSUSE Leap 42.3openSUSE Leap 42.3
    GIP1.1.0.11.1.0.2
    IP10.0.0.110.0.0.2
    A-RRns1.gslb.test.orgns2.gslb.test.org
    USERgdnsd
    VERSIONv2.4.0
    PREFIX/usr/lcoal/gdnsd-2.4.0
    CONFIG/usr/lcoal/gdnsd/etc/gdnsd/config
    ZONE/usr/lcoal/gdnsd/etc/gdnsd/zones/gslb.test.org
     
    ParameterSERVER-ASERVER-B
    IP192.168.0.1192.168.0.2
    A-RRsv1.gslb.test.orgsv2.gslb.test.org
    left,nowrap

インストール

  • 1. インストール
    gdnsdの最新機能を利用する為、今回はソースからビルドする。
    ソースビルド時でもバージョン管理が行える様に、
    prefix指定を変更した上でシンボリックリンクを張る事でプログラムの参照先を切り替える。
    # zypper install libev4 libev-devel ragel
    # wget https://github.com/gdnsd/gdnsd/archive/v2.4.0.tar.gz
    # tar zxvf gdnsd-2.4.0.tar.gz
    # cd gdnsd-2.4.0
    # autoreconf --install
    # ./configure --prefix=/usr/local/gdnsd-2.4.0
    # make
    # make install
     
  • 2. 起動準備
    gdnsdを動かす為の実行ユーザを作成した上で起動スクリプトも準備する。
    gdnsdはsystemd起動に最適化されている為、
    従来のinitスクリプトでは無くサービスファイルから起動を行う。
    # cd /usr/local
    # ln -s /usr/local/gdnsd-2.4.0 gdnsd
    # cd /etc
    # ln -s /usr/local/gdnsd/etc/gdnsd gdnsd
    # vi /usr/lib/systemd/system/gdnsd.service
    ---
    [Unit]
    Description=gdnsd Authoritative GSLB type DNS Server
    After=local-fs.target network.target remote-fs.target nss-lookup.target
    
    [Install]
    WantedBy=multi-user.target
    
    [Service]
    Type=notify
    NotifyAccess=all
    ExecStart=/usr/local/gdnsd/sbin/gdnsd -c /etc/gdnsd -f start
    ExecStop=/usr/local/gdnsd/sbin/gdnsd -c /etc/gdnsd stop
    
    ## Security Setting
    MountFlags=slave
    DevicePolicy=closed
    PrivateDevices=true
    PrivateTmp=true
    ProtectSystem=full
    ProtectHome=true
     
  • 3. コンフィグ
    gdnsdのコンフィグは、[${PREFIX}/etc/gdnsd/config]から固定参照で読み込んでいるので、
    上記設定に合わせてコンフィグを作成しないと、プログラムの起動に失敗する。
    今回はprefixをシンボリックリンクで[/usr/local/gdnsd]に変更している為、
    作成するコンフィグファイル名も[/usr/local/gdnsd/etc/gdnsd/config]になる。
    コンフィグファイルにはgdnsdのヘルスチェック条件も書く必要があるが、
    権威DNSサーバ機能のみ利用するならば、optionsのみ記載すればプログラムを起動出来る。
    なお、コンフィグのコメント接頭文字は『#(シャープ)』となる。
    # vi /usr/local/gdnsd/etc/gdnsd/config
    ---
    options => {
        username       => gdnsd,
        chaos_response => "GSLB",
        listen         => 0.0.0.0:53,
        http_listen    => 0.0.0.0:3506,
        log_stats      => 3600,
    #   tcp_threads    => 2,
    #   udp_threads    => 2,
    
        include_optional_ns    => true,
        disable_text_autosplit => false,
        zones_strict_data      => false,
        zones_strict_startup   => true,
        zones_rfc1035_auto     => false,
    
        state_dir              => /var/lib/gdnsd,
        run_dir                => /var/run/gdnsd,
        plugin_search_path     => /usr/local/gdnsd/lib64/gdnsd,
    }
     設定の解説
     
  • 4. ゾーンファイル
    DNSゾーンファイルは、権威DNSとしてレコードを登録したいORIGINと同じファイル名にする。
    例えば、[gslb.test.org]のゾーンを作成する場合、
    DNSゾーンファイルは[/usr/local/gdnsd/etc/gdnsd/zones/gslb.test.org]となる。
    ファイルの書式は基本的にBINDのゾーン記法と同じだが、
    ヘルスチェックを元にした可変レコードの箇所のみ、gdnsd特有の設定を行う必要がある。
    GSLBの特性上TTLを短くする必要がある為、ゾーンファイル内でTTLを明記して設定を切り替える。
    参考として、DNSゾーンファイルの例を構築例に従って作成してみる。
    # vi /usr/local/gdnsd/etc/gdnsd/zones/gslb.test.org
    ---
    $ORIGIN gslb.test.org.
    $TTL    3600
    @       IN  SOA  ns1.gslb.test.org.  root.gslb.test.org. (
                                            2018010101  ; serial
                                            3600        ; refresh
                                            1200        ; retry
                                            1209600     ; expire
                                            3600        ; minimum
                                         )
    
    ;; GLUE RECORD
    ;;
            IN  NS      ns1.gslb.test.org.
            IN  NS      ns2.gslb.test.org.
    ns1     IN  A       10.0.0.1
    ns2     IN  A       10.0.0.2
    
    ;; CONTENTS
    sv1     IN  A       192.168.0.1
    sv2     IN  A       192.168.0.2
    
    ;; GSLB
    ;;
    $TTL    10
    ;; この箇所にGSLBの可変レコードを記載
     
  • 5. 起動
    事前に作成したサービスファイルを用いてgdnsdを起動する。
    ログはsyslogのdaemonファシリティに出力されるので、起動しない時は該当ログを確認する。
    # systemctl unmask gdnsd
    # systemctl enable gdnsd
    # systemctl start gdnsd

ステータス

gdnsdにはプログラムの稼働状況確認画面(ステータス画面)があり、
コンフィグで設定した[http_listen]パラメータをWebブラウザに入力し、
Webブラウザからgdnsdに接続して見る事が出来る。
 
確認出来る項目は下記の通り基本的な物は網羅している。
また、CSV/JSONを利用して別システムと連携する事も可能になっている。
ただし、gdnsdが処理したDNSクエリ自体は確認する事が出来ない。

  • DNSクエリの応答ステータス
  • gdnsdの応答クエリ統計情報
  • ヘルスチェック稼働状況
  • 統計情報のCSV/JSONファイル

 
ステータス画面はgdnsdの稼働状況を視認出来るので便利だが、
画面自体をユーザ・パスワード認証する事が出来ない。
よって、本番環境で利用する場合は、iptablesで接続元IP制限を掛けるか、
[http_listen => 127.0.0.1:3506] でローカルループバックアドレスで待ち受け、
フロントエンドは認証設定したリバースプロキシにするなど注意して利用する。

left,nowrap


ヘルスチェック

GSLBは下位サーバに対してヘルスチェックを行い、ステータスに応じた可変レコード応答が特徴となる。
負荷分散(ラウンドロビン)、冗長化(アクティブ・スタンバイ)など様々な構成を取る事が出来る。
gdnsdにもヘルスチェックが搭載されており、基本的なGSLBとして機能するようになっている。
また、標準のヘルスチェックで機能不足の場合、ヘルスチェックで外部コマンドを実行する事で、
環境に応じた機能拡張を行う事も出来る。
 
gdnsdのヘルスチェックを利用する時は、gdnsdのconfigファイルにヘルスチェック定義を設定した後、
DNSゾーンファイルで専用の可変レコードを設定する事により利用可能となる。
可変レコードはAレコードを定義するDYNAレコードと、CNAMEを定義するDYNCレコードの2種類が存在する。
ただし、利用出来る可変レコードはプラグイン毎に制限されている為、詳細は公式ドキュメントを確認する。
 
DYNA/DYNCレコードは ["プラグイン種別"!"応答レコード定義名"] で設定する。
DNSゾーンファイルには下記の様なレコードを追記する事となる。

www    10  DYNA  multifo!tcp_80
blog   10  DYNA  weighted!tcp_443
cname  10  DYNC  weighted!tcp_cname

 

  • ラウンドロビン
     設定内容
     
  • 重み付け応答
     設定内容
     
  • ping死活監視
     設定内容
     
  • NAT配下監視
     設定内容
     
  • アクティブ・スタンバイ
     設定内容
     
  • ソーリーサーバ
     設定内容

添付ファイル: filewiki_gdnsd_02.png 41件 [詳細] filewiki_gdnsd_01.png 22件 [詳細]