Bindのログをグラフ化
私の所の現在の環境は、外側LANと内側LANの名前解決のログを取っている状態です。そこで、BIND9のクエリー数をMRTGでグラフ化させてみます。
まずMRTGは、何らかの二つの値からグラフを作成するツールです。The Multi Router Traffic Grapherの略です。このツールは色々な所で使われており、主にルータの通過量とかそういうのを視覚化させる為にグラフにします。
今回は、DNSのクエリ数をグラフ化したいと思います。MRTGのインストールは済んでおり、既に動いているとします。
DNSサーバですが、今回はBIND9を使用しており、viewとaclという機能を使用しています。この機能は問い合わせ元のIPアドレスで、返す名前解決の値を変更させる事ができます。例えばa-yasui.infoというドメインが有る場合、192.168.1.0/24からの問い合せは 192.168.1.254を返し、他のIPからの問い合せは xxx.xxx.xxx.xxxを返すという事をします。
その場合BINDのログは、
queries: info: client 192.168.xxx.xxx#49617: view Second: query: crl.adobe.com IN A + queries: info: client xxx.xxx.xxx.xxx#63717: view global: query: a-yasui.info IN AXFR - queries: info: client xxx.xxx.xxx.xxx#32807: view global: query: wp.a-yasui.info IN A +
といった感じになります。
外からのアクセスは上のログではview globalになっています。そして、内からのアクセスはview Second*1となっています。ですので、ログからglobalの数とSecondの数を取り出してやれば良いわけです。
以下、取り出すスクリプトです。下記のでは、実行の際に引数をつけるとqueryとlame-serverのログを仕分ける様にしています*2。
#!/usr/bin/perl -wT use strict; use Carp; our $DEBUG = 0; $main::lame = 0; $main::lame = 1 if @ARGV; $main::Query_Log = '/path/to/dns.log'; %main::Count = (); @main::Parse_Array = (q{(?:view)\s([a-zA-Z]+)}, q{^([a-zA-Z\-]+)}, ); open LOG, "<", $main::Query_Log or die $!; while (<LOG>) { chomp(); s{[\r\n]}{}gx; if (m{$main::Parse_Array[$main::lame]}x) { warn "match $main::Parse_Array[$main::lame]" if $DEBUG; $main::Count{$1} = (exists($main::Count{$1})) ? $main::Count{$1} + 1 : 1; } } close(LOG); for my $k (keys %main::Count) { print "$k => " if $DEBUG; print $main::Count{$k}; print "\n"; }
後は、mrtgの設定です。特に深く考えずに、下記の様にしました。
Target[dnsQuery]: `/path/to/script.pl` Title[dnsQuery]: Bind Query Log Options[dnsQuery]: integer Kilo[dnsQuery]: 1024 MaxBytes[dnsQuery]: 51200 LegendI[dnsQuery]: Gloval Query LegendO[dnsQuery]: Local Query
後はmrtgを動かして、グラフを出してみてください。:-)
私の所の結果は、このようになっています。
*1:Secondなのは以前の環境からの名残です。
*2:どうも、再帰問い合せをしてくる人の為のログだそうです。参考:Stray Penguin - Linux Memo (BIND9)