我需要知道我的DNS服务器客户端的数量。 也许这意味着每天都有独特的知识产权,或者别的什么,因为我认为没有别的办法来以其他方式来识别客户。 所以,我需要知道我的bind9服务的客户端数量。 我怎样才能以最简单的方式实现呢?
1 – 查询logging
启用查询loggingrndc querylog并parsing您的日志文件,如下所示:
grep -Eo "client ([0-9]{1,3}[\.]){3}[0-9]{1,3}" /path/to/logfile | sort -u | uniq client 10.0.252.1 client 10.0.231.15 client 127.0.0.1
排除重复的| uniq | uniq和| wc -l | wc -l来计算它们,但不介意find真正的解决scheme,这将是真正的准确和简单。
2 – dnstop
捕捉stream量:
tcpdump -w dump.pcap -c 10000 port 53
parsing它:
dnstop dump.pcap > report.txt
这里是输出格式( 只有前50名客户):
% cat report.txt Sources Count % cum% ------------ --------- ------ ------ 10.0.252.1 36 87.8 87.8 10.0.250.100 3 7.3 95.1 10.0.231.15 2 4.9 100.0 [...]
3 – dnstap
还有一个dnstap但我不太了解它,除了它是一个BIND 9.11计划function: https : dnstap .pdf 。
编辑:该命令没有列出所有的IP,我通过添加sort -u修复它。
注意:'uniq'不检测重复行,除非它们相邻。
从根本上说,获取这些信息的最简单的方法是从tcpdump 。 我最近一直在做类似的事情,但是寻找不同的模式。 你可能会发现我已经做了一些对你有用的东西。
http://distracted-it.blogspot.co.nz/search/label/dns http://distracted-it.blogspot.co.nz/2014/07/capturing-and-analysing-dns-samples.html
特别是,如“稍后提出进一步的问题,但对实时监控无用”中所述,“捕获并分析DNS示例(tcpdump符合SQLite3)”并将其放入sqlite3数据库非常有用。 这个代码可以在https://github.com/cameronkerrnz/scriptorium/blob/master/dns-query-sample
代码的快照:
#!/bin/bash sample_size="50000" interface="eth0" echo "Capturing sample of $sample_size packets from interface $interface" tcpdump -w /tmp/query-sample.pcap -i "$interface" -nn -p -c "$sample_size" -s0 dst port domain rm -f /tmp/query-sample.sqlite3 sqlite3 /tmp/query-sample.sqlite3 'create table queries (count int,client,querytype,queryval);' tcpdump -r /tmp/query-sample.pcap -nn \ | sed -rne 's/^[^ ]+ IP ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\.[0-9]+ > ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\.[0-9]+: .* ([^?]+)\? ([A-Za-z0-9._-]+) .*/\1 \3 \4/p' \ | awk ' { queryval = $3 } queryval ~ /\.noisy-example\.com\.$/ { queryval = "SOMETHING.noisy-example.com." } queryval ~ /\.10\.in-addr\.arpa\.$/ { queryval = "SOMETHING.10.in-addr.arpa." } queryval ~ /\.67\.45\.123\.in-addr\.arpa\.$/ { queryval = "SOMETHING.67.45.123.in-addr.arpa." } queryval ~ /[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\.in-addr\.arpa\.$/ { queryval = "SOMETHING.in-addr.arpa." } { print $1,$2,queryval }' \ | sort | uniq -c \ | sed -re 's/[ \t]+/|/g' -e 's/^\|//' \ | sqlite3 /tmp/query-sample.sqlite3 '.import /dev/stdin queries' echo " In this report, Cost is a count of such queries received, normalised by the number of clients that queried it. Thus, something with a Cost greater than 10 (<= are omitted), would likely benefit from DNS caching. Some queries, namely inverse lookups and things under noisy-domain.com (generally some abuse of DNS) are aggregated. " sqlite3 /tmp/query-sample.sqlite3 <<EOF .mode column .header on .width 4 7 70 select sum(count)/count(count) as Cost, querytype as RRtype, queryval as Name from queries group by RRtype,Name having Cost > 10 order by Cost desc limit 100; .width 9 6 15 select sum(count) as NumQueries, querytype as RRtype, client as Client from queries group by Client having NumQueries > 10 order by NumQueries desc limit 100; EOF tcpdump -tt -r /tmp/query-sample.pcap -nn \ | grep '\.53: ' \ | cut -d. -f1 | uniq -c \ | awk ' NR == 1 {starttime = $2; next} {total += $1; count += 1; last = $1; lasttime = $2} END { total -= last; print "Queries / second = " total / (lasttime - starttime) }'
对于实时监控,您可能会使用tcpdump,然后使用诸如sed和AWK,Python,Perl等解决scheme来处理它。我最近使用sed和AWK来帮助我查找谁发送了最多的请求每秒钟,然后我与另一个人总结寻找最频繁的顶级spikers。 你应该至less可以重新使用第一部分(我刚注意到我需要上传)。
最后,您需要确保在报告中不要经常调用dig来滥用自己的DNS服务器。 改为使用“getent主机” 。
例:
$ echo -e '1.1.1.1 2\n8.8.8.8 12\n8.8.4.4 25' \ | awk ' BEGIN {threshold = 5} $2 > threshold { "getent hosts " $1 | getline getent_hosts_str; split(getent_hosts_str, getent_hosts_arr, " "); print $1, getent_hosts_arr[2], $3 }' 8.8.8.8 google-public-dns-a.google.com 8.8.4.4 google-public-dns-b.google.com
如果你正在寻找一个持续的解决scheme,你可以有一个仪表板,然后你可以使用tcpdump和Python来发送每个客户端的每秒总结报告(以减less数据)通过JSON和推向ELK叠加。 在Kibana 4中,你可以绘制一个属性的唯一计数(例如clientip.raw)
希望给你很多有用的想法。
干杯,卡梅隆