今天有人问我是否能把我们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
# 路径配置,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 [email protected]:/data/webapp/dnsMonitor/rrdSource/" scpuser
#su -c "/usr/bin/scp /data/dnsStat/*Top10 [email protected]:/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
/*
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Script System Name: ::
:: (c) 2003-2005 Heinet developer (www.heinet.cn) ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Author: wp1998 ([email protected]) ::
:: 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 [email protected]
</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"> A 类型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 类型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 类型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";
}
}
?>