DNS Queryのリアルタイム統計をサーバ内で表示（dnstop編）

DNSの統計を出したり、性能を計るツールはいくつか出回っていますが、
今回はdnstopを動かしてみます。

dnstop:
http://dns.measurement-factory.com/tools/dnstop/

動きとしては、pcapを元にQueryの割合やSourceIPのランキングなどをリアルタイム表示します。
たぶん、ISP等で公開してるCache DNS等で無いと表示してもつまらないかもしれません。

パッケージ類もあるようですが今回はSourceを持ってくるところから行きたいと思います。
複雑な事はないのでサクっとインストールできると思います。

#テスト環境
- CentOS 6系（Digital Oceanを使ってます）

*ちなみにEPELにはあるみたいなのでSourceからいちいち入れなくてもOKのようです。
>![スクリーンショット 2016-01-08 17.56.59.png](https://qiita-image-store.s3.amazonaws.com/0/90309/7434979a-c0fe-c9e0-288e-e956ee6720f9.png)

#インストールなど
##1.必要なものをインストールします
データをキャプチャするのにpcap
データを描画させるのにncurses
を使う模様

```
# yum install libpcap-devel
# yum install ncurses-devel
```

##2.Sourceをダウンロード
そしてtarball解凍まで
`http://dns.measurement-factory.com/tools/dnstop/src/`より

```
# wget http://dns.measurement-factory.com/tools/dnstop/src/dnstop-20140915.tar.gz
# tar zxvf dnstop-20140915.tar.gz
dnstop-20140915/
dnstop-20140915/LICENSE
dnstop-20140915/lookup3.c
dnstop-20140915/new_gtlds.h
dnstop-20140915/known_tlds.h
dnstop-20140915/inX_addr.h
dnstop-20140915/inX_addr.c
dnstop-20140915/hashtbl.h
dnstop-20140915/hashtbl.c
dnstop-20140915/dnstop.c
dnstop-20140915/CHANGES
dnstop-20140915/dnstop.8
dnstop-20140915/install-sh
dnstop-20140915/config.h.in
dnstop-20140915/Makefile.in
dnstop-20140915/configure
dnstop-20140915/configure.ac
```


##3.configure&make
今回は特にオプション類は指定せずにmake installまで

```
# cd dnstop-20140915/
# ./configure
# make
gcc -g -O2 -DUSE_IPV6=1  -o dnstop dnstop.o hashtbl.o inX_addr.o lookup3.o -lresolv -lnsl -lpcap -lncurses
#
# make install
install -m 755 dnstop /usr/local/bin
install -m 644 dnstop.8 /usr/local/share/man/man8
#
```

##4.コマンドを試す
まずは何も付けずに実行
何やらqueryのfilterも一応できるみたいですが
もう少し種類があっても良いような！？

```
# /usr/local/bin/dnstop
usage: usr/local/bin/dnstop [opts] netdevice|savefile
	-4	Count IPv4 packets
	-6	Count IPv6 packets
	-Q	Count queries
	-R	Count responses
	-a	Anonymize IP Addrs
	-b expr	BPF program code
	-i addr	Ignore this source IP address
	-n name	Count only messages in this domain
	-p	Don't put interface in promiscuous mode
	-P	Print "progress" messages in non-interactive mode
	-r	Redraw interval, in seconds
	-l N	Enable domain stats up to N components
	-X	Don't tabulate the "source + query name" stats
	-f	filter-name

Available filters:
	unknown-tlds
	A-for-A
	rfc1918-ptr
	refused
	qtype-any
#
```

##5.実行例
ちなみに
抜けるときは Ctrl + x
統計データをリセットは Ctrl + R

```
# dnstop -l3 eth0
```


今回はローカルにbindを立てた上で
dnsperf（nominum社のdns performance測定ツール）を
まわした状態でdnstopを叩いてみました
http://nominum.com/measurement-tools/


####初期実行画面
どこのSourceIPからどのくらいQueryが来てるか確認できます

```
Queries: 0 new, 200 total                                                                                                            Fri Jan  8 04:52:00 2016

Sources             Count      %   cum%
--------------- --------- ------ ------
XXX.XXX.XXX.XXX       200  100.0  100.0
```

####domainランキング表示
先ほどの実行例のように`-l n`オプションを付けておくと`n`のレベルでのランキング表示が可能になります
今回の実行例では最大表示範囲は3rdレベルまで可能になる

dnstopを実行した後の状態でキーボードの3を押してみましょう
問い合わせが来ているdomainの3rdレベルでのランキングに変わります
（dnstopをmanしたところによると、`-l n`はCPUとmemoryが消費が通常より多くなるみたいなので範囲指定時は注意）

```:3を押してみる:
Queries: 0 new, 282 total                          Fri Jan  8 04:44:29 2016

Query Name  	                 Count      %   cum%
--------------------------- --------- ------ ------
ak.fbcdn.net                       18    6.4    6.4
a.root-servers.net                 13    4.6   11.0
google.com.mx                       3    1.1   12.1
168.192.in-addr.arpa                3    1.1   13.1
avqs.mcafee.com                     3    1.1   14.2
www.facebook.com                    3    1.1   15.2
www.google.com                      2    0.7   16.0
chttl.com.tw                        2    0.7   16.7
da1.akamai.net                      2    0.7   17.4
dns.msftncsi.com                    2    0.7   18.1
accounts.google.com                 2    0.7   18.8

```

ちなみに1を押すとトップレベル単位でのランキング

```:1を押すと
Queries: 0 new, 181 total           Fri Jan  8 04:48:53 2016

Query Name       Count	   %   cum%
------------ --------- ------ ------
com                 90   49.7   49.7
net                 34   18.8   68.5
in-addr.arpa        24   13.3   81.8
ru                   4    2.2   84.0
uk                   3    1.7   85.6
org                  3    1.7   87.3
lan                  2    1.1   88.4
ar                   2    1.1   89.5
_tcp                 2    1.1   90.6
ch                   2    1.1   91.7
```

####Queryタイプでも表示できます

```:qを押すと:
Queries: 0 new, 397 total          Fri Jan  8 04:57:01 2016

Query Type     Count      %   cum%
---------- --------- ------ ------
A?               271   68.3   68.3
PTR?              50   12.6   80.9
MX?               39    9.8   90.7
AAAA?             37    9.3  100.0
```

##その他
dnstop実行中に表示されているcum%は
cumulative percentage totals
の事のようです