本文演示如何监控内网的流量信息。(本文前提是你有一个linux系统在做网关)
本程序使用iptraf来监控内网流量数据。iptraf是一个分析网卡流量的工具。系统一般都不会安装。
您需要自己去下载,使用源码安装,下载地址:
下载解压后执行:./configure;make;make install即可。
安装后系统中会多出一个名为iptraf的命令,我们使用的,就是这个命令。
该命令的语法如图所示(man page截图):
帮英文不好的同学翻译下吧:
-l 指定监控哪个网卡。
-L 将监控结果保存到文件中,而不是在屏幕输出。
-B 在后台执行
-t 指定执行多长时间(单位:分钟)
本脚本只使用到这4个参数,所以其他的就不介绍了。自己看下手册吧。:)
使用例句:
iptraf -l eth0 -L $logfile -B -t $runtime
此句命令会在后台运行$runtime分钟,并且会将统计结果保存在$logfile中。执行完毕后用shell分析这个文件就行了。
执行后、$logfile的内容大致如下:
第一行:Fri May 4 11:24:02 2012; ******** LAN traffic monitor started ********
输出脚本开始执行的时间
第二行:空行
第三行:*** LAN traffic log, generated Fri May 4 11:26:02 2012
本文件生成的时间
第四行:空行
第五行:空行
随后、会为局域网中的每个设备都生成一条监控记录。(每条记录共5行),两条记录间有一行空行。
最后一行:记录iptraf命令执行的时间。本图中为:120秒(即:2分钟)
具体再看某一台机器的监控记录:
第一行:被监控主机的MAC地址
第二行:所有进入本机的包的数量(即:下载)
第三行:所有从本机外发的包的数量(即:上传)
第四行:平均上传下载速度,单位:kb/s(出于用户习惯,此数值在后面要除以8转成大B)
第五行:iptraf执行的最后5秒内平均上传下载速度。
其中、我们需要的是第一行中的mac地址和第四行中的平均速度,第2、3、5行不需要。
所以,使用sed将2、3、5行删掉,再用sed将剩余两行合并为一行。再用awk将mac地址和上传下载速度取出来,这样就获得了某机器的流量数据。此时再配合其他方式就可以向管理员展示监控数据了。
本人使用的方案是:
在数据库的表中,存放每个人的信息,其中包含姓名、年龄等个人信息,以及为其分配的mac地址。
这样就可以在表中查询到每个mac地址对应的人的名字,将监控结果存入数据库,再写个前端展示页面,这样,一个内网流量监控系统就构建起来了。
OK。现在闲话少说,开始贴代码。
贴代码之前先列个需求:
1.监控局域网内每个人的上传下载速度。
2.如果超过允许的速度会被记录到“违规记录”中。
3.实现开机自动签到(这个是附加功能,跟流量监控无关,本人公司是这样实现签到的)
下面是代码:
-
#!/bin/bash
-
-
-
###############################################################################
-
#
-
# +---------------------------------------------------------------------------+
-
# | 脚本名称 | lanmon.sh |
-
# +---------------------------------------------------------------------------+
-
# | 作 者 | xiaoxi227 |
-
# +---------------------------------------------------------------------------+
-
# | QQ | 543928910 |
-
# +---------------------------------------------------------------------------+
-
# | Email | xiaoxi227@163.com |
-
# +---------------------------------------------------------------------------+
-
# | 创建时间 | 2011-09-22 13:48:00 |
-
# +---------------------------------------------------------------------------+
-
# | 脚本功能 | 局域网流量监控及签到 |
-
# +---------------------------------------------------------------------------+
-
# | 版 本 | 2.0 |
-
# +---------------------------------------------------------------------------+
-
#
-
###############################################################################
-
-
set -f
-
-
LANG_BAK=$LANG
-
-
export LANG="zh_CN.UTF-8"
-
-
mysql_password="数据库密码"
-
-
database="数据库名"
-
-
table="存放用户信息的表"
-
-
download_limit=100 # 允许的最大下载速度
-
-
upload_limit=100 # 允许的最大上传速度
-
-
-
function checkin_and_checkout()
-
{
-
# 略
-
# 可在此处编写签到逻辑,由于本文只演示如何监控局域网流量,所以此处代码就不贴了。
-
}
-
-
#############################################################################
-
################################## 监控主程序 ################################
-
#############################################################################
-
-
hour=`date +%H`
-
-
if [ $hour -lt 7 ];then exit 0;fi # 办公室肯定没人的时候不检测
-
-
logfile=/dev/shm/logfile.tmp.`date +%s`
-
tmpfile=/dev/shm/lanmon.tmp.`date +%s`
-
-
runtime=2 # minute
-
-
# 监控程序每次运行runtime分钟,runtime分钟后分析数据
-
-
begintime=$(date "+%Y-%m-%d %H:%M:%S") # 监控开始时间
-
-
iptraf -l eth0 -L $logfile -B -t $runtime
-
-
sleep $(($runtime*60+1)) # 必须等iptraf执行完毕才能继续向后执行,不然尚未生成log
-
-
endtime=$(date "+%Y-%m-%d %H:%M:%S") # 监控结束时间
-
-
# 使用sed和awk等工具,截取我们需要的数据
-
sed -i '1,5d;/Running time/,$d;/^$/d;/Incoming/d;/Outgoing/d;/Last 5-second/d' $logfile
-
sed -i -r '/Ethernet address/N;s/\n/ /g' $logfile
-
gawk '{ print $3,$6,$9 }' $logfile > $tmpfile
-
-
# 此时$tmpfile内容为: $1:MAC地址 $2:平均下载速度(KB/s) $3:平均上传速度(KB/s)
-
-
while read line
-
do
-
# 本次检测的用户的MAC地址
-
mac_address=$(echo $line | gawk '{ print $1 }')
-
-
# 该用户在过去 $runtime 分钟内的平均上传速度
-
avg_upload_rate=$(echo $line | gawk '{ print $3 }')
-
-
# 该用户在过去 $runtime 分钟内的平均下载速度
-
avg_download_rate=$(echo $line | gawk '{ print $2 }')
-
-
# 小b转大B
-
avg_upload_rate=$(echo helloworld | gawk -v number=$avg_upload_rate '{ print number/8; }')
-
avg_download_rate=$(echo helloworld | gawk -v number=$avg_download_rate '{ print number/8; }')
-
-
# 该用户的姓名
-
mysql_command="select cn_name from ${table} where mac_address='$mac_address'"
-
cn_name=$(mysql -N -u root -p$mysql_password $database -e"$mysql_command")
-
-
# 如果没人使用这个mac无需监控(如:FF:FF:FF:FF:FF:FF,或者局域网打印机之类的设备)
-
if [ x"$cn_name" = x"" ];then continue; fi
-
-
current_time=$(date "+%F %H:%M:%S")
-
-
checkin_and_checkout $mac_address # 为该用户签到
-
-
# 保存检测数据,无论是否超速都记录监控数据
-
mysql_command="insert into all_data (begintime,endtime,en_name,ip_address,mac_address,download_rate,upload_rate) values"
-
mysql_command="$mysql_command (\"${begintime}\",\"${endtime}\",\"${en_name}\",\"${ip_address}\",\"${mac_address}\",\"${avg_download_rate}\",\"${avg_upload_rate}\")"
-
mysql -u root -p$mysql_password $database -e"$mysql_command"
-
-
# 将平均上传、下载速度取整,进而判断是否超速。(因为bash无法使用小数进行数值比较)
-
avg_upload_rate_int=${avg_upload_rate%%.*}
-
avg_download_rate_int=${avg_download_rate%%.*}
-
-
# 如果超过规定的速度则记录
-
if [ $avg_download_rate_int -gt $download_limit -o $avg_upload_rate_int -gt $upload_limit ];then
-
mysql_command="insert into bad_logs (begintime,endtime,cn_name,mac_address,download_rate,upload_rate) values"
-
mysql_command="$mysql_command (\"${begintime}\",\"${endtime}\",\"${cn_name}\",\"$mac_address\",\"${avg_download_rate}\",\"${avg_upload_rate}\")"
-
mysql -u root -p$mysql_password ${database} -e"$mysql_command"
-
fi
-
-
done < $tmpfile
-
-
export LANG=$LANG_BAK
-
-
rm -f $tmpfile
-
rm -f $logfile
由于本文只演示如何监控局域网流量,所以这里贴的脚本与我线上使用的相比有大量删减。
比如:可以把所有人的流量数据相加,之后得到总速率,根据每个人的电脑是否产生了流量进而为用户签到等等。
这样,一个局域网流量监控的后台程序就做完了。设置计划任务:
crontab -e后添加:
*/2 * * * * /path_to_your_script/script_name.sh &> /dev/null
这样,系统每隔2分钟就会运行一次,每次都会计算得到这2分钟内所有已开机的设备的平均上行下行流量。
注意:计划任务中设置几分钟执行一次,脚本中的runtime最好就设置为几分钟。
如果计划任务时间大于脚本中的时间,两次执行之间会有N分钟无法被监控。
(N是计划任务设置的时间与脚本中runtime的差值)
如果计划任务设置的时间小于脚本中的时间,那么上次的脚本还没执行完呢,新脚本就又开始执行了。
这是新执行的脚本会失败。因为iptraf这个命令只能有一个,不能两个同时存在。
所以计划任务设置的时间不能小于iptraf执行的时间(两者最好相同)。
最后,在写个监控数据的展示页面,就可以方便的查看了。
如下图片中是本人用php写的简易展示页面(姓名被涂掉了,只留了姓氏,见谅)
下面是签到的数据展示页面(签到部分的代码没贴出来,您可以根据贵公司的具体现状进行编写)
好了,本文到此结束。希望对那些想监控局域网流量的读者有所帮助。
阅读(4443) | 评论(0) | 转发(1) |