at_yasu's blog

ロード的なことを

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)