Linux/Source/gdnsd
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
ns-lab
nowsky system-lab
DigiLoog
Linux
Windows
開始行:
*gdnsd [#p9c99800]
オープンソースのグローバルロードバランサー(GSLB)
ソースコード量が少なく、高速動作と脆弱性の発生しにくさが...
ただし、ソースコードを減らす為にプログラムのロギング機能...
細かいヘルスチェックはスクリプトを別途作成する必要がある...
フル機能を使いこなすには知識・技術が必要なソフトウェアで...
gdnsdは通信事業者レベルでの採用実績がある。
また、ソースコードが少ない割には整理されている為、機能追...
~
*参考サイト [#h651c013]
-[[gdnsd:+http://gdnsd.org/]]
-[[GitHub gdnsd:+https://github.com/gdnsd]]
-[[gdnsdでかんたんGSLB:+https://qiita.com/jh1vxw/items/7c...
~
*構築環境 [#f4cf0e44]
-[[配布サイト:+https://github.com/gdnsd/gdnsd/releases/]]
-[[公式ドキュメント:+https://github.com/gdnsd/gdnsd/wiki]]
#block
|LEFT:80|LEFT:180|LEFT:180|c
|CENTER:~Parameter|CENTER:~DNS-A|CENTER:~DNS-B|h
|&color(#2020ff){OS};|openSUSE Leap 42.3|openSUSE Leap 42...
|&color(#2020ff){GIP};|1.1.0.1|1.1.0.2|
|&color(#2020ff){IP};|10.0.0.1|10.0.0.2|
|&color(#2020ff){A-RR};|ns1.gslb.test.org|ns2.gslb.test.o...
|&color(#2020ff){USER};|>|gdnsd|
|&color(#2020ff){VERSION};|>|v2.4.0|
|&color(#2020ff){PREFIX};|>|/usr/lcoal/gdnsd-2.4.0|
|&color(#2020ff){CONFIG};|>|/usr/lcoal/gdnsd/etc/gdnsd/co...
|&color(#2020ff){ZONE};|>|/usr/lcoal/gdnsd/etc/gdnsd/zone...
|LEFT:80|LEFT:180|LEFT:180|c
|CENTER:~Parameter|CENTER:~SERVER-A|CENTER:~SERVER-B|h
|&color(#2020ff){IP};|192.168.0.1|192.168.0.2|
|&color(#2020ff){A-RR};|sv1.gslb.test.org|sv2.gslb.test.o...
#block(next)
#ref(Linux/Source/gdnsd/wiki_gdnsd_01.png,45%,left,nowrap)
#block(end)
~
*インストール [#g603a033]
-&size(16){&font(b){1. インストール};};
gdnsdの最新機能を利用する為、今回はソースからビルドする。
ソースビルド時でもバージョン管理が行える様に、
prefix指定を変更した上でシンボリックリンクを張る事でプロ...
# zypper install libev4 libev-devel ragel
# wget https://github.com/gdnsd/gdnsd/archive/v2.4.0.tar...
# 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
-&size(16){&font(b){2. 起動準備};};
gdnsdを動かす為の実行ユーザを作成した上で起動スクリプトも...
gdnsdはsystemd起動に最適化されている為、従来のinitスクリ...
なお、v3.0.0から起動オプションが変わった為、アップグレー...
#region(&color(#ff0000){v2.4.0 起動コマンド};)
# 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 ns...
[Install]
WantedBy=multi-user.target
[Service]
Type=notify
NotifyAccess=all
ExecStart=/usr/local/gdnsd/sbin/gdnsd -c /etc/gdnsd -f s...
ExecStop=/usr/local/gdnsd/sbin/gdnsd -c /etc/gdnsd stop
## Security Setting
MountFlags=slave
DevicePolicy=closed
PrivateDevices=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
#endregion
#region(&color(#ff0000){v3.0.0 起動コマンド};)
# cd /usr/local
# ln -s /usr/local/gdnsd-3.0.0 gdnsd
# cd /etc
# ln -s /usr/local/gdnsd/etc/gdnsd gdnsd
# echo '# Type Path Mode UID GID Age Argu...
# echo 'd /var/run/gdnsd/ 0700 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 ns...
[Install]
WantedBy=multi-user.target
[Service]
Type=notify
NotifyAccess=all
ExecStart=/usr/local/gdnsd/sbin/gdnsd -c /etc/gdnsd -l s...
ExecStop=/usr/local/gdnsd/bin/gdnsdctl -c /etc/gdnsd -l ...
ExecReload=/usr/local/gdnsd/bin/gdnsdctl -c /etc/gdnsd -...
## Security, daemon management
User=gdnsd
UMask=0022
RuntimeDirectory=gdnsd
RuntimeDirectoryMode=0700
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
## Security Setting
MountFlags=slave
DevicePolicy=closed
PrivateDevices=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
#endregion
-&size(16){&font(b){3. コンフィグ};};
gdnsdのコンフィグは、&color(#ff0000){[${PREFIX}/etc/gdnsd...
上記設定に合わせてコンフィグを作成しないと、プログラムの...
今回はprefixをシンボリックリンクで[/usr/local/gdnsd]に変...
作成するコンフィグファイル名も&color(#ff0000){[/usr/local...
コンフィグファイルにはgdnsdのヘルスチェック条件も書く必要...
権威DNSサーバ機能のみ利用するならば、optionsのみ記載すれ...
v3.0.0で一部の設定項目が廃止となった為、エラーが出た場合...
# 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 => 1,
udp_threads => 1,
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/gdn...
}
#region(&color(#ff0000){設定の解説};)
全オプションはgdnsdの[[公式ドキュメント:+https://github.c...
最低限の動作を行う場合、下記オプションを参考に設定を行う。
|LEFT:200|CENTER:50|CENTER:50|LEFT:600|c
|CENTER:~OPTIONS HASH|CENTER:~v2.4.0|CENTER:~v3.0.0|CENTE...
|&color(#2020ff){username};|○|×|gdnsdの実行ユーザ。グルー...
|&color(#2020ff){chaos_response};|○|○|CHクラスの応答内容&...
|&color(#2020ff){listen};|○|○|gdnsdの待ち受けIPアドレス・...
|&color(#2020ff){http_listen};|○|×|gdnsdヘルスチェック画...
|&color(#2020ff){log_stats};|○|×|DNSクエリの統計ログ出力...
|&color(#2020ff){tcp_threads};|○|○|リスナーアドレスに対し...
|&color(#2020ff){udp_threads};|○|○|リスナーアドレスに対し...
|&color(#2020ff){include_optional_ns};|○|×|DNSのAuthority...
|&color(#2020ff){disable_text_autosplit};|○|○|TXTレコード...
|&color(#2020ff){zones_strict_data};|○|○|DNSゾーンファイ...
|&color(#2020ff){zones_strict_startup};|○|○|gdnsd起動時に...
|&color(#2020ff){zones_rfc1035_auto};|○|×|DNSゾーンファイ...
|&color(#2020ff){state_dir};|○|○|gdnsdのデーモン起動情報...
|&color(#2020ff){run_dir};|○|○|gdnsdのPIDファイル保存フォ...
|&color(#2020ff){plugin_search_path};|○|×|プラグインの保...
#endregion
-&size(16){&font(b){4. ゾーンファイル};};
DNSゾーンファイルは、権威DNSとしてレコードを登録したいORI...
例えば、[gslb.test.org]のゾーンを作成する場合、
DNSゾーンファイルは&color(#ff0000){[/usr/local/gdnsd/etc/...
ファイルの書式は基本的にBINDのゾーン記法と同じだが、
ヘルスチェックを元にした可変レコードの箇所のみ、gdnsd特有...
GSLBの特性上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 ; se...
3600 ; re...
1200 ; re...
1209600 ; ex...
3600 ; mi...
)
;; 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の可変レコードを記載
-&size(16){&font(b){5. 起動};};
事前に作成したサービスファイルを用いてgdnsdを起動する。
ログはsyslogのdaemonファシリティに出力されるので、起動し...
# systemctl unmask gdnsd
# systemctl enable gdnsd
# systemctl start gdnsd
~
*ステータス [#e92c864c]
gdnsdのヘルスチェック確認はメジャーバージョンによって変化...
v2.4.2までは、同梱するHTTPサーバを用いたGUI確認となるが、
v3.0.0以降は、コマンドで出力したJSON形式の実行結果を見る...
#region(&color(#ff0000){v2.4.0 ステータス確認};)
#block
v2.4.0にはプログラムの稼働状況確認画面(ステータス画面)が...
コンフィグで設定した[http_listen]パラメータをWebブラウザ...
Webブラウザからgdnsdに接続して見る事が出来る。
確認出来る項目は下記の通り基本的な物は網羅している。
また、CSV/JSONを利用して別システムと連携する事も可能にな...
ただし、gdnsdが処理したDNSクエリ自体は確認する事が出来な...
-DNSクエリの応答ステータス
-gdnsdの応答クエリ統計情報
-ヘルスチェック稼働状況
-統計情報のCSV/JSONファイル
ステータス画面はgdnsdの稼働状況を視認出来るので便利だが、
画面自体をユーザ・パスワード認証する事が出来ない。
よって、本番環境で利用する場合は、iptablesで接続元IP制限...
&color(#ff0000){[http_listen => 127.0.0.1:3506]}; でロー...
フロントエンドは認証設定したリバースプロキシにするなど注...
#block(next)
#ref(Linux/Source/gdnsd/wiki_gdnsd_02.png,45%,left,nowrap)
#block(end)
#endregion
#region(&color(#ff0000){v3.0.0 ステータス確認};)
v3.0.0ではコマンドラインで確認する形になる。
出力データはJSON型となるが、項目はv2.4.0のGUI画面同等の内...
-バージョン確認
# /usr/lcoal/gdnsd/bin/gdnsdctl -c /etc/gdnsd status
---
info: version 3.0.0 running at PID 10000
-daemonステータス
# /usr/lcoal/gdnsd/bin/gdnsdctl -c /etc/gdnsd stats
---
{
"uptime": 3933,
"stats": {
"noerror": 381,
"refused": 0,
"nxdomain": 0,
"notimp": 0,
"badvers": 0,
"formerr": 0,
"dropped": 0,
"v6": 0,
"edns": 69,
"edns_clientsub": 0,
"edns_do": 64,
"edns_cookie_formerr": 0,
"edns_cookie_ok": 0,
"edns_cookie_init": 5,
"edns_cookie_bad": 0
},
"udp": {
"reqs": 381,
"recvfail": 0,
"sendfail": 0,
"tc": 0,
"edns_big": 0,
"edns_tc": 0
},
"tcp": {
"reqs": 0,
"recvfail": 0,
"sendfail": 0,
"conns": 0,
"close_c": 0,
"close_s_ok": 0,
"close_s_err": 0,
"close_s_kill": 0,
"proxy": 0,
"proxy_fail": 0
}
}
-ヘルスチェックステータス
# /usr/lcoal/gdnsd/bin/gdnsdctl -c /etc/gdnsd states
---
{
"metafo/XXX/active": {"state": "NA", "real_state...
"metafo/XXX/standby": {"state": "NA", "real_stat...
"***.***.***.***/XXX": {"state": "UP", "real_sta...
"***.***.***.***/XXX": {"state": "UP", "real_sta...
}
#endregion
~
*ヘルスチェック [#g6be9422]
GSLBは下位サーバに対してヘルスチェックを行い、ステータス...
負荷分散(ラウンドロビン)、冗長化(アクティブ・スタンバイ)...
gdnsdにもヘルスチェックが搭載されており、基本的なGSLBとし...
また、標準のヘルスチェックで機能不足の場合、ヘルスチェッ...
環境に応じた機能拡張を行う事も出来る。
gdnsdのヘルスチェックを利用する時は、gdnsdのconfigファイ...
DNSゾーンファイルで専用の可変レコードを設定する事により利...
可変レコードは&color(#ff0000){Aレコードを定義するDYNAレコ...
ただし、利用出来る可変レコードはプラグイン毎に制限されて...
DYNA/DYNCレコードは &color(#ff0000){["プラグイン種別"!"...
DNSゾーンファイルには下記の様なレコードを追記する事となる。
www 10 DYNA multifo!tcp_80
blog 10 DYNA weighted!tcp_443
cname 10 DYNC weighted!tcp_cname
-&size(16){&font(b){ラウンドロビン};};
#region(&color(#ff0000){設定内容};)
ヘルスチェックを行いつつ、コンテンツサーバにラウンドロビ...
コンテンツサーバでWEB(TCP:80)を待ち受けている環境を想定し...
gdnsdのヘルスチェック設定は、既存のconfigファイルに追記を...
# vi /usr/lcoal/gdnsd/etc/gdnsd/config
---
service_types => {
tcp_80_http => {
plugin => http_status,
port => 80,
url_path => /,
ok_codes => [ 200, 301 ],
up_thresh => 10,
ok_thresh => 5,
down_thresh => 5,
interval => 5,
timeout => 4,
}
}
plugins => {
multifo => {
tcp_80 => {
service_types => tcp_80_http,
up_thresh => 0.001,
SERVERA => 192.168.0.1,
SERVERB => 192.168.0.2,
}
}
}
DNSゾーンファイルには、Aレコード・CNAMEの応答内容に従って...
例えば、Aレコードとして可変応答させる場合は下記の様になる。
# vi /usr/local/gdnsd/etc/gdnsd/zones/gslb.test.org
---
;; DNSゾーンに追記
$TTL 10
www 10 DYNA multifo!tcp_80
#endregion
-&size(16){&font(b){重み付け応答};};
#region(&color(#ff0000){設定内容};)
重み付けに応じて応答するレコードを変更する場合、ラウンド...
変更箇所はpluginsフィールド内のみで、service_typesは書き...
下記設定では、SERVER-Aを1、SERVER-Bを3とした場合の重み付...
# vi /usr/lcoal/gdnsd/etc/gdnsd/config
---
plugins => {
weighted => {
tcp_80 => {
service_types => tcp_80_http,
up_thresh => 0.001,
multi => false,
SERVERA => [ 192.168.0.1, 1],
SERVERB => [ 192.168.0.2, 3],
}
}
}
重み付け応答にする為、監視モジュールを[multifo]から[weigh...
DNSゾーンファイルのDYNAレコード設定も変更する。
# vi /usr/local/gdnsd/etc/gdnsd/zones/gslb.test.org
---
;; DNSゾーンに追記
$TTL 10
www 10 DYNA weighted!tcp_80
#endregion
-&size(16){&font(b){ping死活監視};};
#region(&color(#ff0000){設定内容};)
gdnsdのヘルスチェックには、ping死活監視モジュールが存在し...
その為、ping死活で応答レコードを変更する場合、外部コマン...
外部コマンドに監視対象のIPアドレスを引き渡す場合、特殊変...
"%%ITEM%%"変数を指定する事で、configファイルの応答IP...
外部コマンドモジュールを利用する場合、パラメータ内で利用...
gdnsdヘルスチェックのタイムアウト秒数以上にならない様に注...
# vi /usr/lcoal/gdnsd/etc/gdnsd/config
---
service_types => {
icmp_command => {
plugin => extmon,
cmd => ["/usr/sbin/fping", "-t 3", "%%IT...
interval => 10,
timeout => 4,
up_thresh => 6,
ok_thresh => 3,
down_thresh => 3,
}
}
plugins => {
multifo => {
icmp_check => {
service_types => icmp_command,
up_thresh => 0.001,
SERVERA => 192.168.0.1,
SERVERB => 192.168.0.2,
}
}
}
DNSゾーンファイルの内容も設定に応じて書き換える。
外部コマンドを利用しているが、DYNAレコードに影響のあるplu...
従来通りの書式に従ってDYNAレコード設定を変更する。
# vi /usr/local/gdnsd/etc/gdnsd/zones/gslb.test.org
---
;; DNSゾーンに追記
$TTL 10
www 10 DYNA multifo!icmp_check
#endregion
-&size(16){&font(b){NAT配下監視};};
#region(&color(#ff0000){設定内容};)
クラウドではグローバルIPとインスタンス内部アドレスを、NAT...
この時、NAT装置がNATループバック(ヘアピンNAT)に対応してい...
グローバルIPからインスタンス内部アドレスに変換が出来ず、&...
解決方法は複数存在するが、楽な方法としては外部コマンドヘ...
インスタンス内部アドレスで監視しつつ、DNSの応答レコードを...
下記は、Web(TCP:80)への死活監視をインスタンス内部アドレス...
DNSレコードとしてはグローバルIP(NAT)を応答する設定例とな...
# vi /usr/lcoal/gdnsd/etc/gdnsd/config
---
service_types => {
script_mon => {
plugin => extmon,
cmd => ["/usr/local/bin/script_mon.pl", ...
interval => 10,
timeout => 4,
up_thresh => 6,
ok_thresh => 3,
down_thresh => 3,
}
}
plugins => {
multifo => {
tcp_80 => {
service_types => script_mon,
up_thresh => 0.001,
SERVERA => 1.1.0.1,
SERVERB => 1.1.0.2,
}
}
}
DNSゾーンファイルは今までと同じように、plugins/service_ty...
この時、重み付け応答を行いたい場合、設定に合わせてDYNAレ...
# vi /usr/local/gdnsd/etc/gdnsd/zones/gslb.test.org
---
;; DNSゾーンに追記
$TTL 10
www 10 DYNA multifo!tcp_80
外部コマンドは様々は作成方法があるが、筆者が作成したperl...
応答性重視の監視スクリプトとして利用する為、例外処理は全...
# vi /usr/local/bin/script_mon.pl
---
#!/usr/bin/perl
$GIP = $ARGV[0];
$PORT = $ARGV[1];
%LIP;
$LIP{'1.1.0.1'} = "10.0.0.1";
$LIP{'1.1.0.2'} = "10.0.0.2";
$STAT = system("/usr/bin/ncat -w 1 $LIP{$GIP} ${PORT} < ...
$STAT = $STAT >> 8;
exit $STAT;
#endregion
-&size(16){&font(b){アクティブ・スタンバイ};};
#region(&color(#ff0000){設定内容};)
GSLB配下のコンテンツサーバ間でセッション同期を行っていな...
通信を片寄せする時にコンテンツサーバをActive/Standby動作...
gdnsdにActive/Standbyモジュールは存在しないが、
データセンター・フェールオーバー機能でアクティブ・スタン...
下記は、SERVER-Aをアクティブ・SERVER-Bをスタンバイとして...
ヘルスチェックにWeb(TCP:80)への死活監視を行う設定例となる。
# vi /usr/lcoal/gdnsd/etc/gdnsd/config
---
service_types => {
tcp_80_http => {
plugin => http_status,
port => 80,
url_path => /,
ok_codes => [ 200, 301 ],
up_thresh => 10,
ok_thresh => 5,
down_thresh => 5,
interval => 5,
timeout => 4,
}
}
plugins => {
metafo => {
resources => {
tcp_80 => {
datacenters => [ active, standby ]
dcmap => {
active => {
plugin => multifo,
service_types => tcp_80_http,
up_thresh => 0.001,
SERVERA => 192.168.0.1,
}
standby => {
plugin => multifo,
service_types => tcp_80_http,
up_thresh => 0.001,
SERVERB => 192.168.0.2,
}
}
}
}
}
}
DNSゾーンファイルは従来通りに、サービスタイプとプラグイン...
今回は、データセンター・フェールオーバーを利用しているの...
サービスタイプは作成した物を従来通りに設定する。
# vi /usr/local/gdnsd/etc/gdnsd/zones/gslb.test.org
---
;; DNSゾーンに追記
$TTL 10
www 10 DYNA metafo!tcp_80
#endregion
-&size(16){&font(b){ソーリーサーバ};};
#region(&color(#ff0000){設定内容};)
障害でコンテンツサーバが全台がダウンした時に緊急コンテン...
メインサーバがダウンしている事を伝える事がある。
このソーリーサーバをgdnsdで実装するには、データセンター・...
下記は、SERVER-AとSERVER-Bをラウンドロビン稼働させつつ、
ソーリーサーバとして192.168.0.3へ割り振る設定例となる。
ただし、ソーリーサーバへのヘルスチェックを行わない事で、
ソーリーサーバの稼働状況にかかわらず、コンテンツサーバ全...
# vi /usr/lcoal/gdnsd/etc/gdnsd/config
---
service_types => {
tcp_80_http => {
plugin => http_status,
port => 80,
url_path => /,
ok_codes => [ 200, 301 ],
up_thresh => 10,
ok_thresh => 5,
down_thresh => 5,
interval => 5,
timeout => 4,
}
}
plugins => {
metafo => {
resources => {
tcp_80 => {
datacenters => [ active, sorry ]
dcmap => {
active => {
plugin => multifo,
service_types => tcp_80_http,
up_thresh => 0.001,
SERVERA => 192.168.0.1,
SERVERB => 192.168.0.2,
}
sorry => 192.168.0.3,
}
}
}
}
}
ソーリーサーバを利用する場合も、DNSゾーンファイルは従来通...
gdnsdのプラグインはmetafoを利用しているので、metafoを指定...
# vi /usr/local/gdnsd/etc/gdnsd/zones/gslb.test.org
---
;; DNSゾーンに追記
$TTL 10
www 10 DYNA metafo!tcp_80
#endregion
終了行:
*gdnsd [#p9c99800]
オープンソースのグローバルロードバランサー(GSLB)
ソースコード量が少なく、高速動作と脆弱性の発生しにくさが...
ただし、ソースコードを減らす為にプログラムのロギング機能...
細かいヘルスチェックはスクリプトを別途作成する必要がある...
フル機能を使いこなすには知識・技術が必要なソフトウェアで...
gdnsdは通信事業者レベルでの採用実績がある。
また、ソースコードが少ない割には整理されている為、機能追...
~
*参考サイト [#h651c013]
-[[gdnsd:+http://gdnsd.org/]]
-[[GitHub gdnsd:+https://github.com/gdnsd]]
-[[gdnsdでかんたんGSLB:+https://qiita.com/jh1vxw/items/7c...
~
*構築環境 [#f4cf0e44]
-[[配布サイト:+https://github.com/gdnsd/gdnsd/releases/]]
-[[公式ドキュメント:+https://github.com/gdnsd/gdnsd/wiki]]
#block
|LEFT:80|LEFT:180|LEFT:180|c
|CENTER:~Parameter|CENTER:~DNS-A|CENTER:~DNS-B|h
|&color(#2020ff){OS};|openSUSE Leap 42.3|openSUSE Leap 42...
|&color(#2020ff){GIP};|1.1.0.1|1.1.0.2|
|&color(#2020ff){IP};|10.0.0.1|10.0.0.2|
|&color(#2020ff){A-RR};|ns1.gslb.test.org|ns2.gslb.test.o...
|&color(#2020ff){USER};|>|gdnsd|
|&color(#2020ff){VERSION};|>|v2.4.0|
|&color(#2020ff){PREFIX};|>|/usr/lcoal/gdnsd-2.4.0|
|&color(#2020ff){CONFIG};|>|/usr/lcoal/gdnsd/etc/gdnsd/co...
|&color(#2020ff){ZONE};|>|/usr/lcoal/gdnsd/etc/gdnsd/zone...
|LEFT:80|LEFT:180|LEFT:180|c
|CENTER:~Parameter|CENTER:~SERVER-A|CENTER:~SERVER-B|h
|&color(#2020ff){IP};|192.168.0.1|192.168.0.2|
|&color(#2020ff){A-RR};|sv1.gslb.test.org|sv2.gslb.test.o...
#block(next)
#ref(Linux/Source/gdnsd/wiki_gdnsd_01.png,45%,left,nowrap)
#block(end)
~
*インストール [#g603a033]
-&size(16){&font(b){1. インストール};};
gdnsdの最新機能を利用する為、今回はソースからビルドする。
ソースビルド時でもバージョン管理が行える様に、
prefix指定を変更した上でシンボリックリンクを張る事でプロ...
# zypper install libev4 libev-devel ragel
# wget https://github.com/gdnsd/gdnsd/archive/v2.4.0.tar...
# 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
-&size(16){&font(b){2. 起動準備};};
gdnsdを動かす為の実行ユーザを作成した上で起動スクリプトも...
gdnsdはsystemd起動に最適化されている為、従来のinitスクリ...
なお、v3.0.0から起動オプションが変わった為、アップグレー...
#region(&color(#ff0000){v2.4.0 起動コマンド};)
# 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 ns...
[Install]
WantedBy=multi-user.target
[Service]
Type=notify
NotifyAccess=all
ExecStart=/usr/local/gdnsd/sbin/gdnsd -c /etc/gdnsd -f s...
ExecStop=/usr/local/gdnsd/sbin/gdnsd -c /etc/gdnsd stop
## Security Setting
MountFlags=slave
DevicePolicy=closed
PrivateDevices=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
#endregion
#region(&color(#ff0000){v3.0.0 起動コマンド};)
# cd /usr/local
# ln -s /usr/local/gdnsd-3.0.0 gdnsd
# cd /etc
# ln -s /usr/local/gdnsd/etc/gdnsd gdnsd
# echo '# Type Path Mode UID GID Age Argu...
# echo 'd /var/run/gdnsd/ 0700 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 ns...
[Install]
WantedBy=multi-user.target
[Service]
Type=notify
NotifyAccess=all
ExecStart=/usr/local/gdnsd/sbin/gdnsd -c /etc/gdnsd -l s...
ExecStop=/usr/local/gdnsd/bin/gdnsdctl -c /etc/gdnsd -l ...
ExecReload=/usr/local/gdnsd/bin/gdnsdctl -c /etc/gdnsd -...
## Security, daemon management
User=gdnsd
UMask=0022
RuntimeDirectory=gdnsd
RuntimeDirectoryMode=0700
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
## Security Setting
MountFlags=slave
DevicePolicy=closed
PrivateDevices=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
#endregion
-&size(16){&font(b){3. コンフィグ};};
gdnsdのコンフィグは、&color(#ff0000){[${PREFIX}/etc/gdnsd...
上記設定に合わせてコンフィグを作成しないと、プログラムの...
今回はprefixをシンボリックリンクで[/usr/local/gdnsd]に変...
作成するコンフィグファイル名も&color(#ff0000){[/usr/local...
コンフィグファイルにはgdnsdのヘルスチェック条件も書く必要...
権威DNSサーバ機能のみ利用するならば、optionsのみ記載すれ...
v3.0.0で一部の設定項目が廃止となった為、エラーが出た場合...
# 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 => 1,
udp_threads => 1,
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/gdn...
}
#region(&color(#ff0000){設定の解説};)
全オプションはgdnsdの[[公式ドキュメント:+https://github.c...
最低限の動作を行う場合、下記オプションを参考に設定を行う。
|LEFT:200|CENTER:50|CENTER:50|LEFT:600|c
|CENTER:~OPTIONS HASH|CENTER:~v2.4.0|CENTER:~v3.0.0|CENTE...
|&color(#2020ff){username};|○|×|gdnsdの実行ユーザ。グルー...
|&color(#2020ff){chaos_response};|○|○|CHクラスの応答内容&...
|&color(#2020ff){listen};|○|○|gdnsdの待ち受けIPアドレス・...
|&color(#2020ff){http_listen};|○|×|gdnsdヘルスチェック画...
|&color(#2020ff){log_stats};|○|×|DNSクエリの統計ログ出力...
|&color(#2020ff){tcp_threads};|○|○|リスナーアドレスに対し...
|&color(#2020ff){udp_threads};|○|○|リスナーアドレスに対し...
|&color(#2020ff){include_optional_ns};|○|×|DNSのAuthority...
|&color(#2020ff){disable_text_autosplit};|○|○|TXTレコード...
|&color(#2020ff){zones_strict_data};|○|○|DNSゾーンファイ...
|&color(#2020ff){zones_strict_startup};|○|○|gdnsd起動時に...
|&color(#2020ff){zones_rfc1035_auto};|○|×|DNSゾーンファイ...
|&color(#2020ff){state_dir};|○|○|gdnsdのデーモン起動情報...
|&color(#2020ff){run_dir};|○|○|gdnsdのPIDファイル保存フォ...
|&color(#2020ff){plugin_search_path};|○|×|プラグインの保...
#endregion
-&size(16){&font(b){4. ゾーンファイル};};
DNSゾーンファイルは、権威DNSとしてレコードを登録したいORI...
例えば、[gslb.test.org]のゾーンを作成する場合、
DNSゾーンファイルは&color(#ff0000){[/usr/local/gdnsd/etc/...
ファイルの書式は基本的にBINDのゾーン記法と同じだが、
ヘルスチェックを元にした可変レコードの箇所のみ、gdnsd特有...
GSLBの特性上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 ; se...
3600 ; re...
1200 ; re...
1209600 ; ex...
3600 ; mi...
)
;; 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の可変レコードを記載
-&size(16){&font(b){5. 起動};};
事前に作成したサービスファイルを用いてgdnsdを起動する。
ログはsyslogのdaemonファシリティに出力されるので、起動し...
# systemctl unmask gdnsd
# systemctl enable gdnsd
# systemctl start gdnsd
~
*ステータス [#e92c864c]
gdnsdのヘルスチェック確認はメジャーバージョンによって変化...
v2.4.2までは、同梱するHTTPサーバを用いたGUI確認となるが、
v3.0.0以降は、コマンドで出力したJSON形式の実行結果を見る...
#region(&color(#ff0000){v2.4.0 ステータス確認};)
#block
v2.4.0にはプログラムの稼働状況確認画面(ステータス画面)が...
コンフィグで設定した[http_listen]パラメータをWebブラウザ...
Webブラウザからgdnsdに接続して見る事が出来る。
確認出来る項目は下記の通り基本的な物は網羅している。
また、CSV/JSONを利用して別システムと連携する事も可能にな...
ただし、gdnsdが処理したDNSクエリ自体は確認する事が出来な...
-DNSクエリの応答ステータス
-gdnsdの応答クエリ統計情報
-ヘルスチェック稼働状況
-統計情報のCSV/JSONファイル
ステータス画面はgdnsdの稼働状況を視認出来るので便利だが、
画面自体をユーザ・パスワード認証する事が出来ない。
よって、本番環境で利用する場合は、iptablesで接続元IP制限...
&color(#ff0000){[http_listen => 127.0.0.1:3506]}; でロー...
フロントエンドは認証設定したリバースプロキシにするなど注...
#block(next)
#ref(Linux/Source/gdnsd/wiki_gdnsd_02.png,45%,left,nowrap)
#block(end)
#endregion
#region(&color(#ff0000){v3.0.0 ステータス確認};)
v3.0.0ではコマンドラインで確認する形になる。
出力データはJSON型となるが、項目はv2.4.0のGUI画面同等の内...
-バージョン確認
# /usr/lcoal/gdnsd/bin/gdnsdctl -c /etc/gdnsd status
---
info: version 3.0.0 running at PID 10000
-daemonステータス
# /usr/lcoal/gdnsd/bin/gdnsdctl -c /etc/gdnsd stats
---
{
"uptime": 3933,
"stats": {
"noerror": 381,
"refused": 0,
"nxdomain": 0,
"notimp": 0,
"badvers": 0,
"formerr": 0,
"dropped": 0,
"v6": 0,
"edns": 69,
"edns_clientsub": 0,
"edns_do": 64,
"edns_cookie_formerr": 0,
"edns_cookie_ok": 0,
"edns_cookie_init": 5,
"edns_cookie_bad": 0
},
"udp": {
"reqs": 381,
"recvfail": 0,
"sendfail": 0,
"tc": 0,
"edns_big": 0,
"edns_tc": 0
},
"tcp": {
"reqs": 0,
"recvfail": 0,
"sendfail": 0,
"conns": 0,
"close_c": 0,
"close_s_ok": 0,
"close_s_err": 0,
"close_s_kill": 0,
"proxy": 0,
"proxy_fail": 0
}
}
-ヘルスチェックステータス
# /usr/lcoal/gdnsd/bin/gdnsdctl -c /etc/gdnsd states
---
{
"metafo/XXX/active": {"state": "NA", "real_state...
"metafo/XXX/standby": {"state": "NA", "real_stat...
"***.***.***.***/XXX": {"state": "UP", "real_sta...
"***.***.***.***/XXX": {"state": "UP", "real_sta...
}
#endregion
~
*ヘルスチェック [#g6be9422]
GSLBは下位サーバに対してヘルスチェックを行い、ステータス...
負荷分散(ラウンドロビン)、冗長化(アクティブ・スタンバイ)...
gdnsdにもヘルスチェックが搭載されており、基本的なGSLBとし...
また、標準のヘルスチェックで機能不足の場合、ヘルスチェッ...
環境に応じた機能拡張を行う事も出来る。
gdnsdのヘルスチェックを利用する時は、gdnsdのconfigファイ...
DNSゾーンファイルで専用の可変レコードを設定する事により利...
可変レコードは&color(#ff0000){Aレコードを定義するDYNAレコ...
ただし、利用出来る可変レコードはプラグイン毎に制限されて...
DYNA/DYNCレコードは &color(#ff0000){["プラグイン種別"!"...
DNSゾーンファイルには下記の様なレコードを追記する事となる。
www 10 DYNA multifo!tcp_80
blog 10 DYNA weighted!tcp_443
cname 10 DYNC weighted!tcp_cname
-&size(16){&font(b){ラウンドロビン};};
#region(&color(#ff0000){設定内容};)
ヘルスチェックを行いつつ、コンテンツサーバにラウンドロビ...
コンテンツサーバでWEB(TCP:80)を待ち受けている環境を想定し...
gdnsdのヘルスチェック設定は、既存のconfigファイルに追記を...
# vi /usr/lcoal/gdnsd/etc/gdnsd/config
---
service_types => {
tcp_80_http => {
plugin => http_status,
port => 80,
url_path => /,
ok_codes => [ 200, 301 ],
up_thresh => 10,
ok_thresh => 5,
down_thresh => 5,
interval => 5,
timeout => 4,
}
}
plugins => {
multifo => {
tcp_80 => {
service_types => tcp_80_http,
up_thresh => 0.001,
SERVERA => 192.168.0.1,
SERVERB => 192.168.0.2,
}
}
}
DNSゾーンファイルには、Aレコード・CNAMEの応答内容に従って...
例えば、Aレコードとして可変応答させる場合は下記の様になる。
# vi /usr/local/gdnsd/etc/gdnsd/zones/gslb.test.org
---
;; DNSゾーンに追記
$TTL 10
www 10 DYNA multifo!tcp_80
#endregion
-&size(16){&font(b){重み付け応答};};
#region(&color(#ff0000){設定内容};)
重み付けに応じて応答するレコードを変更する場合、ラウンド...
変更箇所はpluginsフィールド内のみで、service_typesは書き...
下記設定では、SERVER-Aを1、SERVER-Bを3とした場合の重み付...
# vi /usr/lcoal/gdnsd/etc/gdnsd/config
---
plugins => {
weighted => {
tcp_80 => {
service_types => tcp_80_http,
up_thresh => 0.001,
multi => false,
SERVERA => [ 192.168.0.1, 1],
SERVERB => [ 192.168.0.2, 3],
}
}
}
重み付け応答にする為、監視モジュールを[multifo]から[weigh...
DNSゾーンファイルのDYNAレコード設定も変更する。
# vi /usr/local/gdnsd/etc/gdnsd/zones/gslb.test.org
---
;; DNSゾーンに追記
$TTL 10
www 10 DYNA weighted!tcp_80
#endregion
-&size(16){&font(b){ping死活監視};};
#region(&color(#ff0000){設定内容};)
gdnsdのヘルスチェックには、ping死活監視モジュールが存在し...
その為、ping死活で応答レコードを変更する場合、外部コマン...
外部コマンドに監視対象のIPアドレスを引き渡す場合、特殊変...
"%%ITEM%%"変数を指定する事で、configファイルの応答IP...
外部コマンドモジュールを利用する場合、パラメータ内で利用...
gdnsdヘルスチェックのタイムアウト秒数以上にならない様に注...
# vi /usr/lcoal/gdnsd/etc/gdnsd/config
---
service_types => {
icmp_command => {
plugin => extmon,
cmd => ["/usr/sbin/fping", "-t 3", "%%IT...
interval => 10,
timeout => 4,
up_thresh => 6,
ok_thresh => 3,
down_thresh => 3,
}
}
plugins => {
multifo => {
icmp_check => {
service_types => icmp_command,
up_thresh => 0.001,
SERVERA => 192.168.0.1,
SERVERB => 192.168.0.2,
}
}
}
DNSゾーンファイルの内容も設定に応じて書き換える。
外部コマンドを利用しているが、DYNAレコードに影響のあるplu...
従来通りの書式に従ってDYNAレコード設定を変更する。
# vi /usr/local/gdnsd/etc/gdnsd/zones/gslb.test.org
---
;; DNSゾーンに追記
$TTL 10
www 10 DYNA multifo!icmp_check
#endregion
-&size(16){&font(b){NAT配下監視};};
#region(&color(#ff0000){設定内容};)
クラウドではグローバルIPとインスタンス内部アドレスを、NAT...
この時、NAT装置がNATループバック(ヘアピンNAT)に対応してい...
グローバルIPからインスタンス内部アドレスに変換が出来ず、&...
解決方法は複数存在するが、楽な方法としては外部コマンドヘ...
インスタンス内部アドレスで監視しつつ、DNSの応答レコードを...
下記は、Web(TCP:80)への死活監視をインスタンス内部アドレス...
DNSレコードとしてはグローバルIP(NAT)を応答する設定例とな...
# vi /usr/lcoal/gdnsd/etc/gdnsd/config
---
service_types => {
script_mon => {
plugin => extmon,
cmd => ["/usr/local/bin/script_mon.pl", ...
interval => 10,
timeout => 4,
up_thresh => 6,
ok_thresh => 3,
down_thresh => 3,
}
}
plugins => {
multifo => {
tcp_80 => {
service_types => script_mon,
up_thresh => 0.001,
SERVERA => 1.1.0.1,
SERVERB => 1.1.0.2,
}
}
}
DNSゾーンファイルは今までと同じように、plugins/service_ty...
この時、重み付け応答を行いたい場合、設定に合わせてDYNAレ...
# vi /usr/local/gdnsd/etc/gdnsd/zones/gslb.test.org
---
;; DNSゾーンに追記
$TTL 10
www 10 DYNA multifo!tcp_80
外部コマンドは様々は作成方法があるが、筆者が作成したperl...
応答性重視の監視スクリプトとして利用する為、例外処理は全...
# vi /usr/local/bin/script_mon.pl
---
#!/usr/bin/perl
$GIP = $ARGV[0];
$PORT = $ARGV[1];
%LIP;
$LIP{'1.1.0.1'} = "10.0.0.1";
$LIP{'1.1.0.2'} = "10.0.0.2";
$STAT = system("/usr/bin/ncat -w 1 $LIP{$GIP} ${PORT} < ...
$STAT = $STAT >> 8;
exit $STAT;
#endregion
-&size(16){&font(b){アクティブ・スタンバイ};};
#region(&color(#ff0000){設定内容};)
GSLB配下のコンテンツサーバ間でセッション同期を行っていな...
通信を片寄せする時にコンテンツサーバをActive/Standby動作...
gdnsdにActive/Standbyモジュールは存在しないが、
データセンター・フェールオーバー機能でアクティブ・スタン...
下記は、SERVER-Aをアクティブ・SERVER-Bをスタンバイとして...
ヘルスチェックにWeb(TCP:80)への死活監視を行う設定例となる。
# vi /usr/lcoal/gdnsd/etc/gdnsd/config
---
service_types => {
tcp_80_http => {
plugin => http_status,
port => 80,
url_path => /,
ok_codes => [ 200, 301 ],
up_thresh => 10,
ok_thresh => 5,
down_thresh => 5,
interval => 5,
timeout => 4,
}
}
plugins => {
metafo => {
resources => {
tcp_80 => {
datacenters => [ active, standby ]
dcmap => {
active => {
plugin => multifo,
service_types => tcp_80_http,
up_thresh => 0.001,
SERVERA => 192.168.0.1,
}
standby => {
plugin => multifo,
service_types => tcp_80_http,
up_thresh => 0.001,
SERVERB => 192.168.0.2,
}
}
}
}
}
}
DNSゾーンファイルは従来通りに、サービスタイプとプラグイン...
今回は、データセンター・フェールオーバーを利用しているの...
サービスタイプは作成した物を従来通りに設定する。
# vi /usr/local/gdnsd/etc/gdnsd/zones/gslb.test.org
---
;; DNSゾーンに追記
$TTL 10
www 10 DYNA metafo!tcp_80
#endregion
-&size(16){&font(b){ソーリーサーバ};};
#region(&color(#ff0000){設定内容};)
障害でコンテンツサーバが全台がダウンした時に緊急コンテン...
メインサーバがダウンしている事を伝える事がある。
このソーリーサーバをgdnsdで実装するには、データセンター・...
下記は、SERVER-AとSERVER-Bをラウンドロビン稼働させつつ、
ソーリーサーバとして192.168.0.3へ割り振る設定例となる。
ただし、ソーリーサーバへのヘルスチェックを行わない事で、
ソーリーサーバの稼働状況にかかわらず、コンテンツサーバ全...
# vi /usr/lcoal/gdnsd/etc/gdnsd/config
---
service_types => {
tcp_80_http => {
plugin => http_status,
port => 80,
url_path => /,
ok_codes => [ 200, 301 ],
up_thresh => 10,
ok_thresh => 5,
down_thresh => 5,
interval => 5,
timeout => 4,
}
}
plugins => {
metafo => {
resources => {
tcp_80 => {
datacenters => [ active, sorry ]
dcmap => {
active => {
plugin => multifo,
service_types => tcp_80_http,
up_thresh => 0.001,
SERVERA => 192.168.0.1,
SERVERB => 192.168.0.2,
}
sorry => 192.168.0.3,
}
}
}
}
}
ソーリーサーバを利用する場合も、DNSゾーンファイルは従来通...
gdnsdのプラグインはmetafoを利用しているので、metafoを指定...
# vi /usr/local/gdnsd/etc/gdnsd/zones/gslb.test.org
---
;; DNSゾーンに追記
$TTL 10
www 10 DYNA metafo!tcp_80
#endregion
ページ名: