Heinet DNS Query流量监控的安装说明(存档)

今天有人问我是否能把我们dns监控实施在他们单位,才发现写的这个小东西竟然一直没有整理下文档,一时也没法给别人一个完整的说明。今天有点空闲,就把这个小东西整理了下,也方便以后有此需求的人们也能方面使用。

另注:转载不限,但请注明出处,thanks。

——————————————————————
原理:

在dns服务器每间隔10分钟执行一次cron脚本logStat.sh,提取dns-query日志中前10分钟的信息,并针对各种不同对象(A、MX等)获取分析数据,然后将数据存储到rrdtool数据文件中,最后将rrdtool数据文件远程cp到web服务器目录。

在web服务器上有一个php脚本,读取rrdtool数据文件,生成数据图和列表。

——————————————————————–

文件:

dns server:
/data/dnsStat/             执行目录,也存放rrdtool数据文件
/data/dnsStat/logStat.sh   cron日志分析脚本

web server:
/data/webapp/dnsMonitor/           web目录,dnsserver将rrdtool文件scp到此
/data/webapp/dnsMonitor/index.php  查看监控页面

———————————————————————

环境:

dns server:
RHAS4
rrdtool 1.0.49
需要设定免认证scp到webserver
bind9的查询日志配置于/usr/local/bind9/log/bind9_query.log

webserver:
RHAS4
rrdtool 1.0.49
需要设定dnsserver能免认证scp到本地
apache+php

———————————————————————-

脚本:

/data/dnsStat/logStat.sh

#!/bin/sh

# 路径配置,bind日志目录和脚本目录
logPath="/usr/local/bind9/log"
statPath="/data/dnsStat"

# 开始cron的计时
echo `date "+%Y-%m-%d %H:%M:%S"`" cron start:" >> /data/dnsStat/statlog

# 计算当前时间前10分钟的小时分钟,作为以后log判断的效验,如提取12:1作为判断12:1x的条件
before10m=`date -d "-10 minute" +%H:%M | sed -n 's/.$//p'`
# 计算当前时间前10分钟的年月日字串
before10m1=`date -d "-10 minute" +%Y%m%d`
# 计算当前时间前10分钟的日期字串
dayStr=`date -d "-10 minute" +%d`

# 判断日志,得到前10分钟内不同$9记录(即query类型)的查询数量
# 全部query
Query_count=`cat $logPath/bind9_query.log | awk '$1~/^'$dayStr'/ && $2~/^'$before10m'/ {print $2}' | wc -l`
Query_count=`echo $Query_count`

# 全部query的client ip排名前10 -> 写入文件
cat $logPath/bind9_query.log | awk '$1~/^'$dayStr'/ && $2~/^'$before10m'/ {print $5}' | cut -d"#" -f1 | awk '{a[$1]+=1}END{for(i in a)print i,a}' | sort -k2 -n -r | sed -n '0,10p' > /data/dnsStat/queryClientIpTop10

# 全部query的域名对象排名前10 -> 写入文件
cat $logPath/bind9_query.log | awk '$1~/^'$dayStr'/ && $2~/^'$before10m'/ {print $9}' | awk '{a[$1]+=1}END{for(i in a)print i,a}' | sort -k2 -n -r | sed -n '0,10p' > /data/dnsStat/queryObjectTop10

# A记录 query
A_count=`cat $logPath/bind9_query.log | awk '$1~/^'$dayStr'/ && $2~/^'$before10m'/ && $11~/A/ {print $2}' | wc -l`
A_count=`echo $A_count`

# client ip排名前10 -> 写入文件
cat $logPath/bind9_query.log | awk '$1~/^'$dayStr'/ && $2~/^'$before10m'/ && $11~/A/ {print $5}' | cut -d"#" -f1 | awk '{a[$1]+=1}END{for(i in a)print i,a}' | sort -k2 -n -r | sed -n '0,10p' > /data/dnsStat/aClientIpTop10

# 域名对象排名前10 -> 写入文件
cat $logPath/bind9_query.log | awk '$1~/^'$dayStr'/ && $2~/^'$before10m'/ && $11~/A/ {print $9}' | awk '{a[$1]+=1}END{for(i in a)print i,a}' | sort -k2 -n -r | sed -n '0,10p' > /data/dnsStat/aObjectTop10

# PTR记录 query
PTR_count=`cat $logPath/bind9_query.log | awk '$1~/^'$dayStr'/ && $2~/^'$before10m'/ && $11~/PTR/ {print $2}' |wc -l`PTR_count=`echo $PTR_count`

# client ip排名前10 -> 写入文件
cat $logPath/bind9_query.log | awk '$1~/^'$dayStr'/ && $2~/^'$before10m'/ && $11~/PTR/ {print $5}' | cut -d"#" -f1 | awk '{a[$1]+=1}END{for(i in a)print i,a}' | sort -k2 -n -r | sed -n '0,10p' > /data/dnsStat/ptrClientIpTop10

# 域名对象排名前10 -> 写入文件
cat $logPath/bind9_query.log | awk '$1~/^'$dayStr'/ && $2~/^'$before10m'/ && $11~/PTR/ {print $9}' | awk '{a[$1]+=1}END{for(i in a)print i,a}' | sort -k2 -n -r | sed -n '0,10p' > /data/dnsStat/ptrObjectTop10

# MX记录 query
MX_count=`cat $logPath/bind9_query.log | awk '$1~/^'$dayStr'/ && $2~/^'$before10m'/ && $11~/MX/ {print $2}' | wc -l`MX_count=`echo $MX_count`

# client ip排名前10 -> 写入文件
cat $logPath/bind9_query.log | awk '$1~/^'$dayStr'/ && $2~/^'$before10m'/ && $11~/MX/ {print $5}' | cut -d"#" –
f1 | awk '{a[$1]+=1}END{for(i in a)print i,a}' | sort -k2 -n -r | sed -n '0,10p' > /data/dnsStat/mxClientIpTop10

# 域名对象排名前10 -> 写入文件
cat $logPath/bind9_query.log | awk '$1~/^'$dayStr'/ && $2~/^'$before10m'/ && $11~/MX/ {print $9}' | awk '{a[$1]
+=1}END{for(i in a)print i,a}' | sort -k2 -n -r | sed -n '0,10p' > /data/dnsStat/mxObjectTop10

# SOA记录 query
SOA_count=`cat $logPath/bind9_query.log | awk '$1~/^'$dayStr'/ && $2~/^'$before10m'/ && $11~/SOA/ {print $2}' |
wc -l`SOA_count=`echo $SOA_count`

# client ip排名前10 -> 写入文件
cat $logPath/bind9_query.log | awk '$1~/^'$dayStr'/ && $2~/^'$before10m'/ && $11~/SOA/ {print $5}' | cut -d"#" -f1 | awk '{a[$1]+=1}END{for(i in a)print i,a}' | sort -k2 -n -r | sed -n '0,10p' > /data/dnsStat/soaClientIpTop10

# 域名对象排名前10 -> 写入文件
cat $logPath/bind9_query.log | awk '$1~/^'$dayStr'/ && $2~/^'$before10m'/ && $11~/SOA/ {print $9}' | awk '{a[$1
]+=1}END{for(i in a)print i,a}' | sort -k2 -n -r | sed -n '0,10p' > /data/dnsStat/soaObjectTop10

# SRV记录 query
SRV_count=`cat $logPath/bind9_query.log | awk '$1~/^'$dayStr'/ && $2~/^'$before10m'/ && $11~/SRV/ {print $2}' |
wc -l`SRV_count=`echo $SRV_count`

# client ip排名前10 -> 写入文件
cat $logPath/bind9_query.log | awk '$1~/^'$dayStr'/ && $2~/^'$before10m'/ && $11~/SRV/ {print $5}' | cut -d"#" -f1 | awk '{a[$1]+=1}END{for(i in a)print i,a}' | sort -k2 -n -r | sed -n '0,10p' > /data/dnsStat/srvClientIpTop10

# 域名对象排名前10 -> 写入文件
cat $logPath/bind9_query.log | awk '$1~/^'$dayStr'/ && $2~/^'$before10m'/ && $11~/SRV/ {print $9}' | awk '{a[$1
]+=1}END{for(i in a)print i,a}' | sort -k2 -n -r | sed -n '0,10p' > /data/dnsStat/srvObjectTop10

echo -e $before10m1" "$before10m"0\t"$Query_count"\t"$A_count"\t"$PTR_count"\t"$MX_count"\t"$SOA_count"\t"$SRV_count >> /data/dnsStat/statlog

# 得到前一个10分钟段第一秒的起始时间字串
before10m2=$before10m1" "$before10m"0:00"
# 生成相应的时间戳
rrdTime=`date -d "$before10m2" +%s`

# 将分析的query结果写入到rrdtool文件中
dataSource=$rrdTime:$Query_count:$A_count:$MX_count:$PTR_count:$SOA_count:$SRV_count
/usr/local/rrdtool/bin/rrdtool update /data/dnsStat/bind_stat.rrd -t ALL:A:MX:PTR:SOA:SRV $dataSource

echo `date "+%Y-%m-%d %H:%M:%S"`" write rrdtool success:" >> /data/dnsStat/statlog

# 拷贝rrdtool文件到Heinet 服务器上
#su -c "/usr/bin/scp /data/dnsStat/bind_stat.rrd scpuser@xxx.xx.xx.xx:/data/webapp/dnsMonitor/rrdSource/" scpuser
#su -c "/usr/bin/scp /data/dnsStat/*Top10 scpuser@xxx.xx.xx.xx:/data/webapp/dnsMonitor/" scpuser

# 结束时间标记
echo `date "+%Y-%m-%d %H:%M:%S"`" scp rrdfile to 64.93 success:" >> /data/dnsStat/statlog

/data/webapp/dnsMonitor/index.php

<?php
/*
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Script System Name:                                                  ::
:: (c) 2003-2005 Heinet developer (www.heinet.cn)                       ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Author:  wp1998 (wp1998@e21.edu.cn)                                  ::
:: Version:            Time:                                            ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/

// Filename        :    
// introduce    :    
// Last Time    :    

// 获取指定时间之前最近的尾数为0分钟,如0、10、20、30、40、50
// 参数:时间戳
function getAfterTime1($timeInt){
    do {
        if(substr(date("i",$timeInt),-1)=="0" && date("s",$timeInt)=="00"){
            return $timeInt;
            break;
        } else {
            $timeInt–;
        }
    } while($timeInt>0);
}

$nowTime=getAfterTime1((time()-30*60));                // 见函数说明
$oneDayAfterTime=$nowTime-(3600*24);                // 一天之前的时间
$oneWeekAfterTime=$nowTime-(3600*24*7);                // 一个星期之前的时间
$oneMonthAfterTime=$nowTime-(3600*24*30);            // 一个月之前的时间
$oneYearAfterTime=$nowTime-(3600*24*365);            // 一年之前的时间

?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta http-equiv=refresh content=300 url=index.php ;>
<title>Heinet DNS查询实时监控</title>
<style>
body {font-size:10.4pt}
td {font-size:9pt}
</style>
</head>
<body text="#000000" leftmargin="10" topmargin="10">

<FONT SIZE="6" face="Arial">Heinet DNS Query 流量监控</FONT><BR>

<p style="line-height:14pt;font-size=10.4pt">
说明:<BR>
1。监控的流量值是采集每10分钟内平均每秒(second)各类型查询的query数量值而成;<BR>
2。下列图片分别显示最近的日、周、月、年内的曲线变化情况;<BR>
3。<FONT COLOR="CC6633">此色标识</FONT>A记录查询、<FONT COLOR="66FF99">此色标识</FONT>PTR记录查询、<FONT

COLOR="0066CC">此色标识</FONT>MX记录查询、<FONT COLOR="FF0000">此色标识</FONT>SOA记录查询、<FONT COLOR="339933">此色标识</FONT>SRV记录查询。<BR>
最后更新:2005-5-25 wp1998@e21.edu.cn
</p>

<TABLE cellpadding=5 cellspacing=5>
<TR>
    <TD valign=top>
        <B>近一天内Query流量示意图:</B><BR>
        <img xsrc="./dnsQueryStat.php?nowTime=<?php echo $nowTime; ?>&lastTime=<?php echo $oneDayAfterTime; ?>" border=0 title="24小时各查询量状态,每10分钟计算"><BR>
        <BR>
        <B>近一周内Query流量示意图:</B><BR>
        <img xsrc="./dnsQueryStat.php?nowTime=<?php echo $nowTime; ?>&lastTime=<?php echo $oneWeekAfterTime; ?>" border=0 title="24小时各查询量状态,每10分钟计算"><BR>
        <BR>
        <B>近一月内Query流量示意图:</B><BR>
        <img xsrc="./dnsQueryStat.php?nowTime=<?php echo $nowTime; ?>&lastTime=<?php echo $oneMonthAfterTime; ?>" border=0 title="24小时各查询量状态,每10分钟计算"><BR>
        <BR>
        <B>近一年内Query流量示意图:</B><BR>
   
     <img xsrc="./dnsQueryStat.php?nowTime=<?php echo $nowTime; ?>&lastTime=<?php echo $oneYearAfterTime; ?>" border=0 title="24小时各查询量状态,每10分钟计算"><BR>
        <BR>
    </TD>
    <TD valign=top align=right>
        实时Top排名<BR>
        <TABLE cellpadding=3 cellspacing=2 border=0>
            <TR bgcolor=#DDDDDD>
                <TD colspan=2><FONT SIZE="2">&nbsp;A&nbsp;类型TOP10 ClientIP</FONT></TD>
            </TR>
            <?php showFile("aClientIpTop10"); ?>
        </TABLE>
        <BR>
        <TABLE cellpadding=3 cellspacing=2 border=0>
            <TR bgcolor=#DDDDDD>
                <TD colspan=2><FONT SIZE="2">MX&nbsp;类型TOP10 ClientIP</FONT></TD>
            </TR>
            <?php showFile("mxClientIpTop10"); ?>
        </TABLE>
        <BR>
        <TABLE cellpadding=3 cellspacing=2 border=0>
            <TR bgcolor=#DDDDDD>
                <TD colspan=2><FONT SIZE="2">PTR类型TOP10 ClientIP</FONT></TD>
            </TR>
            <?php showFile("ptrClientIpTop10"); ?>
        </TABLE>
        <BR>
        <TABLE cellpadding=3 cellspacing=2 border=0>
            <TR bgcolor=#DDDDDD>
                <TD colspan=2><FONT SIZE="2">SOA类型TOP10 ClientIP</FONT></TD>
            </TR>
            <?php showFile("soaClientIpTop10"); ?>
        </TABLE>
        <BR>
        <TABLE cellpadding=3 cellspacing=2 border=0>
            <TR bgcolor=#DDDDDD>
                <TD colspan=2><FONT SIZE="2">SRV类型TOP10 ClientIP</FONT></TD>
            </TR>
            <?php showFile("srvClientIpTop10"); ?>
        </TABLE>
    </TD>
    <TD valign=top>
        源于最近10分钟dnsLog<BR>
        <TABLE cellpadding=3 cellspacing=2 border=0>
            <TR bgcolor=#DDDDDD>
                <TD colspan=2><FONT SIZE="2">A类型TOP10 域名对象</FONT></TD>
            </TR>
            <?php showFile("aObjectTop10"); ?>
        </TABLE>
        <BR>
        <TABLE cellpadding=3 cellspacing=2 border=0>
            <TR bgcolor=#DDDDDD>
                <TD colspan=2><FONT SIZE="2">MX&nbsp;类型TOP10 域名对象</FONT></TD>
            </TR>
            <?php showFile("mxObjectTop10"); ?>
        </TABLE>
        <BR>
        <TABLE cellpadding=3 cellspacing=2 border=0>
            <TR bgcolor=#DDDDDD>
                <TD colspan=2><FONT SIZE="2">PTR类型TOP10 对象</FONT></TD>
            </TR>
            <?php showFile("ptrObjectTop10"); ?>
        </TABLE>
        <BR>
        <TABLE cellpadding=3 cellspacing=2 border=0>
            <TR bgcolor=#DDDDDD>
                <TD colspan=2><FONT SIZE="2">SOA类型TOP10 对象</FONT></TD>
            </TR>
            <?php showFile("soaObjectTop10"); ?>
        </TABLE>
        <BR>
        <TABLE cellpadding=3 cellspacing=2 border=0>
            <TR bgcolor=#DDDDDD>
                <TD colspan=2><FONT SIZE="2">SRV类型TOP10 对象</FONT></TD>
            </TR>
            <?php showFile("srvObjectTop10"); ?>
        </TABLE>
&nb
sp;   </TD>
</TR>
</TABLE>

</body>
</html>
<?php
function showFile($fileName){
    $ary=file("/data/webapp/dnsMonitor/".$fileName);
    for($i=0;$i<count($ary);$i++){    
        echo "<tr bgcolor=#EEEEEE>";
        echo "<td>".substr(substr($ary[$i],0,strrpos($ary[$i]," ")),0,25)."</td>";
        echo "<td>".strrchr($ary[$i]," ")."</td>";
        echo "</tr>"."\n";
    }
}

?>

发表评论