Bind9 Statistics for Cacti
まえおき
DNSの攻撃が問題になっている昨今、自前のキャッシュサーバといえども、否、だからこそ、統計のチェックをして攻撃されていないか、攻撃に使用されていないかを確認する必要があります。で、今回はその統計のチェックを Cacti でやるための追加設定の方法を紹介しましょう。
参考:
ダウンロード
から bind9-snmp_1.6.tgz を落としてくるんだけど、いま見たら bayour.com が 404 返すなあ。手元にあるのは少し前にあらかじめ落としてきてあったものです。
手元の環境は下記のとおり。
ファイルのインストールと設定
# tar -C /tmp -zxvf bind9-snmp_1.6.tgz # cd /tmp/bind9-snmp-1.6/ # cp BAYOUR-COM-MIB.txt /usr/local/share/snmp/mibs/ # cp bind9-snmp-stats.pl snmp*.conf.stub /usr/local/etc/snmp # cp bind9-stats_*.xml /usr/local/share/cacti/resource/snmp_queries/ # cp BayourCOM_SNMP.pm /usr/local/lib/perl5/site_perl/
BayourCOM_SNMP.pm は perl -V して出る @INC: のどれかのパスにコピーする。
つぎに snmp*.conf の設定。
# cd /usr/local/etc/snmp # cat snmp.conf.stub >> snmp.conf # cat snmpd.conf.stub >> snmpd.conf # cat snmpd.conf.stub [省略] pass_persist .1.3.6.1.4.1.8767.2.1 /usr/local/etc/snmp/bind9-snmp-stats.pl
snmpd.conf.stub 見ればわかるとおり、OID .1.3.6.1.4.1.8767.2.1 に対して bind9-snmp-stats.pl を実行し、Bind9の統計情報を取得して、SNMPで返すということをやっている。bind9-snmp-stats.pl は rndc stats を実行した後 stats file から値を読み取るというスクリプト。
続いて bind9-snmp-stats.pl 用の設定ファイルを作る。bind9-snmp-stats.plのアタマの部分に
my $CFG_FILE = "/etc/bind/.bindsnmp";
と設定ファイルがどこにあるかを書くようになっているので、これを適切なファイル名に変更する。今回は /usr/local/etc/snmp/bindsnmp ファイルに設定を書く。設定例は同じくスクリプト中のコメントにもあるし、README.txt にも書いてある。こんな感じで。
DEBUG=4 DEBUG_FILE=/chroot/named/var/log/bind9-snmp-stats.log IGNORE_INDEX=1 RNDC=/usr/sbin/rndc RNDC_OPTS=-c /chroot/named/etc/rndc.conf STATS_FILE=/chroot/named/var/stats/named.stats STATS_FILE_OWNER_GROUP=bind:bind DELTA_DIR=/var/tmp
いまの環境では bind を chroot して使っているのでそれに合わせて多少変えている。RNDC_OPTS は本来ないオプションで、今回追加したもの(後述)。rndc の設定ファイルを chroot 環境のパスにおいているので、設定ファイル位置を指定するために入れてある。
スクリプトの修正
とりあえず diff から見よう。
--- bind9-snmp-stats.pl.orig Tue Feb 7 19:54:06 2006 +++ bind9-snmp-stats.pl Wed Mar 21 09:58:24 2007 @@ -17,7 +17,7 @@ # # If the location of the config file isn't good enough for you, # feel free to change that here. -my $CFG_FILE = "/etc/bind/.bindsnmp"; +my $CFG_FILE = "/usr/local/etc/snmp/bindsnmp"; # # Optional arguments # DEBUG=4 @@ -469,7 +469,7 @@ %CFG = get_config($CFG_FILE); debug(0, "=> Dumping Bind9 stats\n") if($CFG{'RNDC'} && ($CFG{'DEBUG'} > 1)); - system($CFG{'RNDC'}." stats") if($CFG{'RNDC'}); + system($CFG{'RNDC'}." ".$CFG{'RNDC_OPTS'}." stats") if($CFG{'RNDC'}); my $tmp = $CFG{'STATS_FILE'}; $tmp =~ s/\W/_/g; @@ -611,7 +611,7 @@ } # Re-get the DEBUG config option (so that we don't have to restart process). - $CFG{'DEBUG'} = get_config('DEBUG'); + $CFG{'DEBUG'} = get_config($CFG_FILE, 'DEBUG'); # {{{ Get all run arguments - next/specfic OID my $arg = $_; chomp($arg);
変更点:
- 17行目:CFG_FILE は設定ファイル指定。
- 469行目:rndc にオプションを追加するように変更している。設定ファイルから RNDC_OPTSの値を持ってきてオプションに追加するだけ。
- 611行目:不具合の修正。ファイル名が引数としてわたっていないためにエラーが起こって動かないようなので変更する。bind9-snmp-stats.pl を実行して適当にReturnを入力したとき、下記のようなメッセージが出てる場合はここを直す。
Argument "2/8" isn't numeric in numeric gt(>) at ./bind9-snmp-stats.pl line 618, <> line 2.
スクリプトの動作確認
# ./bind9-snmp-stats.pl PING [return] PONG getnext [return] 1 [return] .1.3.6.1.4.1.8767.2.1.1.0 integer 6 # snmpwalk -v2c -c community_string localhost .1.3.6.1.4.1.8767.2.1.3.1 BAYOUR-COM-MIB::b9stCounterName.1 = STRING: success BAYOUR-COM-MIB::b9stCounterName.2 = STRING: referral BAYOUR-COM-MIB::b9stCounterName.3 = STRING: nxrrset BAYOUR-COM-MIB::b9stCounterName.4 = STRING: nxdomain BAYOUR-COM-MIB::b9stCounterName.5 = STRING: recursion BAYOUR-COM-MIB::b9stCounterName.6 = STRING: failure BAYOUR-COM-MIB::b9stCounterTotal.1 = INTEGER: 3439 BAYOUR-COM-MIB::b9stCounterTotal.2 = INTEGER: 0 BAYOUR-COM-MIB::b9stCounterTotal.3 = INTEGER: 49 BAYOUR-COM-MIB::b9stCounterTotal.4 = INTEGER: 160 BAYOUR-COM-MIB::b9stCounterTotal.5 = INTEGER: 3192 BAYOUR-COM-MIB::b9stCounterTotal.6 = INTEGER: 17
こんな感じで値が出力されてればOK。
グラフの設定
グラフ情報(ホストテンプレート) cacti_host_template_bind9_snmp_machine.xml はブラウザ経由でインポートする。
- [console]-"Import/Exprrt" [Import Templates]-[参照]
- [console]-"Devices"
domains はゾーン管理をしているBindでドメインごとにクエリを分析したい場合。Statsでドメイン別の情報を出すようにオプションを設定してやる必要がある。
options { zone-statistics "yes"; };
かな。いま対象にしているのはキャッシュサーバなので totals のみ使用してる。