免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 38410 | 回复: 45
打印 上一主题 下一主题

[DNS] 給阿骁兄的賀禮二: DNS 流量統計~超強版 [复制链接]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
跳转到指定楼层
[收藏(0)] [报告]
发表于 2004-10-13 01:39 |只看该作者 |正序浏览
其實也稱不上超強版,不過一般人可能較不會往這邊想而以...
透過修改 bind 的 source code, 利用 rndc 從遠端直接抓出
dns 的query/response 次數,再利用 mrtg 或 rrdtool 來繪圖而以
(註:rndc 不懂的人自己去看,非本處主題)
這是我做的 bind-9.3.0 的 patch file, 有興趣的可拿去看看,如果懂程式
的話,你就會知道不同的版本如何改,如果不懂的話,你就將就用囉!
  1. diff -cr bind-9.3.0/bin/named/query.c bind-9.3.0_abel/bin/named/query.c
  2. *** bind-9.3.0/bin/named/query.c Wed Jun 30 22:13:05 2004
  3. --- bind-9.3.0_abel/bin/named/query.c Wed Oct 13 00:45:07 2004
  4. ***************
  5. *** 95,100 ****
  6. --- 95,103 ----
  7.   static void
  8.   query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype);
  9.   
  10. + static int querycount=0;
  11. + static int replycount=0;
  12. +
  13.   /*
  14.    * Increment query statistics counters.
  15.    */
  16. ***************
  17. *** 112,121 ****
  18. --- 115,132 ----
  19.   zonestats[counter]++;
  20.   }
  21.   }
  22. + int get_query_count(void) {
  23. + return(querycount);
  24. + }
  25. +
  26. + int get_reply_count(void) {
  27. + return(replycount);
  28. + }
  29.   
  30.   static void
  31.   query_send(ns_client_t *client) {
  32.   dns_statscounter_t counter;
  33. + replycount++;
  34.   if (client->;message->;rcode == dns_rcode_noerror) {
  35.   if (ISC_LIST_EMPTY(client->;message->;sections[DNS_SECTION_ANSWER])) {
  36.   if (client->;query.isreferral) {
  37. ***************
  38. *** 3447,3453 ****
  39.   query_error(client, result);
  40.   return;
  41.   }
  42. !
  43.   if (ns_g_server->;log_queries)
  44.   log_query(client);
  45.   
  46. --- 3458,3464 ----
  47.   query_error(client, result);
  48.   return;
  49.   }
  50. ! querycount++;
  51.   if (ns_g_server->;log_queries)
  52.   log_query(client);
  53.   
  54. diff -cr bind-9.3.0/bin/named/server.c bind-9.3.0_abel/bin/named/server.c
  55. *** bind-9.3.0/bin/named/server.c Fri Jun 18 12:39:48 2004
  56. --- bind-9.3.0_abel/bin/named/server.c Wed Oct 13 00:47:47 2004
  57. ***************
  58. *** 3998,4003 ****
  59. --- 3998,4005 ----
  60.   n = snprintf((char *)isc_buffer_used(text),
  61.        isc_buffer_availablelength(text),
  62.        "number of zones: %u\n"
  63. +      "number of query: %u\n"
  64. +      "number of reply: %u\n"
  65.        "debug level: %d\n"
  66.        "xfers running: %u\n"
  67.        "xfers deferred: %u\n"
  68. ***************
  69. *** 4006,4012 ****
  70.        "recursive clients: %d/%d\n"
  71.        "tcp clients: %d/%d\n"
  72.        "server is up and running",
  73. !      zonecount, ns_g_debuglevel, xferrunning, xferdeferred,
  74.        soaqueries, server->;log_queries ? "ON" : "OFF",
  75.        server->;recursionquota.used, server->;recursionquota.max,
  76.        server->;tcpquota.used, server->;tcpquota.max);
  77. --- 4008,4014 ----
  78.        "recursive clients: %d/%d\n"
  79.        "tcp clients: %d/%d\n"
  80.        "server is up and running",
  81. !      zonecount, get_query_count(), get_reply_count(),ns_g_debuglevel, xferrunning, xferdeferred,
  82.        soaqueries, server->;log_queries ? "ON" : "OFF",
  83.        server->;recursionquota.used, server->;recursionquota.max,
  84.        server->;tcpquota.used, server->;tcpquota.max);
复制代码

atch 動作請自己做, patch -p1 < this_patch_file,本檔僅適合 9.3.0,沒空每版都寫出來
以上的程式僅是在做 rdnc -s IP_addr status 時,可以帶出如下內容:
[root@log SIP]# rndc -s 211.72.210.251 status
  1. number of zones: 1
  2. number of query: 157
  3. number of reply: 153
  4. debug level: 0
  5. xfers running: 0
  6. xfers deferred: 0
  7. soa queries in progress: 0
  8. query logging is ON
  9. recursive clients: 0/1000
  10. tcp clients: 0/100
  11. server is up and running
复制代码

看到沒有,跟你的有什麼不同, 多了
number of query: 157
number of reply: 153

兩欄,也就是我們加上去的,好了,你每一台機器都做了這樣的 patch 後
並做相同的 rndc.conf 的設定,就可以利用 rndc -s Server_IP status 取
得這樣的結果了,我們可以驗證看看數字到底對不對:


  1. #rndc -s Server_IP stats
  2. # cat /var/named/named.stats
  3. success 137
  4. referral 0
  5. nxrrset 6
  6. nxdomain 10
  7. recursion 142
  8. failure 4
复制代码

上面數字 success+nxrrset+nxdomain+failure=157 表示 dns 收到了
157 查詢,其中有 142 次做 recursion

不計算 failure 即為成功的查詢次數, 所以為 153

故程式的結果沒有問題 !!
我再寫一個小程式來做字串處理:

  1. #!/usr/bin/perl
  2. open(II,"/usr/local/sbin/rndc -s $ARGV[0] status|");
  3. while (<II>;) {
  4.   chomp;
  5.   split(/: /,$_);
  6.   print "$_[1]\n" if ($_[0] eq 'number of query' or $_[0] eq 'number of reply');
  7. }
  8. close(II);
复制代码

Ex:filename 為 dns_flow.pl
./dns_flow.pl Server_IP
輸出結果為:
  1. 157
  2. 153
复制代码


是不是變簡單了呢 !?
你若跑十台 DNS 服務,想來很多人會用 query log 來記 Query 量
這是最不好的方式,因為 Disk I/O 會很多
若你用 rndc stats 來做分折,是可以的,但資料滙整將是一個問題

改程式是終南捷徑(要會改就不是捷徑了)...
每部 DNS Server 再配置相同的 rndc.conf ,即可使用此一 rule
(不同也行,但就會變復雜了,相同的 rndc.conf 只要將一些 rndc
的設定copy 到別台機器即可)

利用 mrtg 來輸出結果:

  1. #  for UNIX
  2. WorkDir: /www/html/mrtg
  3. #  or for NT
  4. # WorkDir: c:\mrtgdata

  5. ### Global Defaults

  6. #  to get bits instead of bytes and graphs growing to the right
  7. Options[_]: growright, noinfo



  8. #---------------------------------------------------------------

  9. Target[DNS_Server1]: `/home/abel/dns.pl 你的DNS_Server_IP`
  10. MaxBytes[DNS_Server1]: 2500
  11. Title[DNS_Server1]: A.DNS.TW (IPv6)
  12. Legend1[DNS_Server1]: DNS查詢(次數/秒)
  13. Legend2[DNS_Server1]: DNS回應(次數/秒)
  14. LegendI[DNS_Server1]: DNS查詢
  15. LegendO[DNS_Server1]: DNS回應
  16. YLegend[DNS_Server1]: Q. per second
  17. PageTop[DNS_Server1]: <h1>;DNS_Server Query/Response</h1>;
复制代码

crontab 那些及 mrtg 設定細節就不再贅述

mrtg 結果:
http://211.72.210.251/dns/


這次我就不寫 rrdtool 版本了,免得大家望文生畏,我也偷懶一下
給阿骁兄的賀禮基本上 google 都是沒有或不足的,有興趣的人可好好研究
一下

註: 我直接提供一個修改過的9.3.0版本給大家試試
http://211.72.210.251/bind-9.3.0.tar.gz
若不放心,請記得到 ftp://ftp.isc.org 下也抓一個 9.3.0
來做比較(diff -cr isc_dir abel_dir), 即可知我改了什麼

求职 : Linux运维
论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:15:0815-16赛季CBA联赛之山东
日期:2016-10-31 10:40:10综合交流区版块每日发帖之星
日期:2016-07-06 06:20:00IT运维版块每日发帖之星
日期:2016-02-08 06:20:00数据库技术版块每日发帖之星
日期:2016-01-15 06:20:00IT运维版块每日发帖之星
日期:2016-01-15 06:20:00IT运维版块每日发帖之星
日期:2016-01-10 06:20:00黄金圣斗士
日期:2015-11-24 10:45:10IT运维版块每日发帖之星
日期:2015-09-01 06:20:00IT运维版块每日发帖之星
日期:2015-08-13 06:20:00IT运维版块每日发帖之星
日期:2015-07-30 09:40:012015年亚洲杯之巴勒斯坦
日期:2015-05-05 10:19:03
45 [报告]
发表于 2016-10-31 10:39 |只看该作者
CU好文呀。要顶起来!!!

论坛徽章:
0
44 [报告]
发表于 2008-01-29 05:41 |只看该作者
先向各位江湖老大与前辈们行个礼!

论坛徽章:
0
43 [报告]
发表于 2007-12-31 14:46 |只看该作者
目前还用不上

论坛徽章:
0
42 [报告]
发表于 2007-11-30 18:10 |只看该作者
不懂,先留下脚印先。

论坛徽章:
0
41 [报告]
发表于 2007-04-12 11:37 |只看该作者
我今天按照上面的方法修改编译了9.4.0,但在make时出错了,abel能不能帮忙看看是什么原因,对C不是很了解,呵呵。

  1. query.c:148: warning: no previous prototype for `get_query_count'
  2. query.c:152: warning: no previous prototype for `get_reply_count'
  3. query.c: In function `ns_query_start':
  4. query.c:4513: parse error before "if"
  5. make: *** [query.o] Error 1
复制代码

论坛徽章:
0
40 [报告]
发表于 2006-12-13 11:15 |只看该作者
厉害,可是还没看懂,呵

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
39 [报告]
发表于 2005-10-06 16:13 |只看该作者

給阿骁兄的賀禮二: DNS 流量統計~超強版

[quote]原帖由 "coolzsb"]苯油ü齭nmp抓bind的数据,感觉比修改bind方便些。[/quote 发表:

這個是以 snmp 的 exec 來取徝的,你每取一次值,就會 run 一次 exec 的指令,
這個指令中的數據也是 rndc 來的, 所以個人看法兩種做法並無太大差別,
不過 snmp 的東西一般人很容易一知半解

论坛徽章:
0
38 [报告]
发表于 2005-10-06 15:00 |只看该作者

給阿骁兄的賀禮二: DNS 流量統計~超強版

可以试试看这个http://www.bayour.com/bind9-snmp/,直接通过snmp抓bind的数据,感觉比修改bind方便些。

论坛徽章:
0
37 [报告]
发表于 2005-01-25 10:06 |只看该作者

給阿骁兄的賀禮二: DNS 流量統計~超強版

发现当每秒不到一次的时候...就没有记录咯....我这里经常是replay 0...真可怜

看来需要rrdtool出马了~~

论坛徽章:
0
36 [报告]
发表于 2004-12-23 09:24 |只看该作者

給阿骁兄的賀禮二: DNS 流量統計~超強版

相关贴子如下:
  1. 请教关于dnstop和Query/respone比例
  2. http://bbs.chinaunix.net/forum/viewtopic.php?t=430300&highlight=jsquan
复制代码


回过头来,我们再看这个贴子,对于以下内容,请教又作何理解。


  1. 一、dnstop 的输出结果如下:

  2. 代码:
  3. Sources              count      %
  4. ---------------- --------- ------
  5. 220.173.230.2         7008   19.8 (client's ip1)
  6. 220.173.222.25        1252    3.5 (client's ip2)
  7. 220.173.222.23        1043    2.9 (client's ip3)
  8. 220.171.231.251        749    2.1 (client's ip4)
  9. 220.171.226.123        651    1.8 (client's ip5)
  10. 220.172.128.68         647    1.8 (我的primary DNS's ip)

  11. 二、分析
  12. client's ip1 ~ client's ip5,查询的次数,竟然比我的DNS's ip
  13. 还要大,应该是client感染了病毒所致。
  14. 我是通过在named.conf中增加如下语句解决的。
  15. recursive-clients 10000; (该值默认为100)。

复制代码
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP