本文演示如何监控内网的流量信息。(本文前提是你有一个linux系统在做网关)

 
本程序使用iptraf来监控内网流量数据。iptraf是一个分析网卡流量的工具。系统一般都不会安装。
 
您需要自己去下载,使用源码安装,下载地址:http://iptraf.seul.org/download.html
 
下载解压后执行:./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.实现开机自动签到(这个是附加功能,跟流量监控无关,本人公司是这样实现签到的)
 
下面是代码:
 

点击(此处)折叠或打开

  1. #!/bin/bash
  2.  
  3.  
  4. ###############################################################################
  5. #
  6. # +---------------------------------------------------------------------------+
  7. # | 脚本名称 | lanmon.sh |
  8. # +---------------------------------------------------------------------------+
  9. # | 作 者 | xiaoxi227              |
  10. # +---------------------------------------------------------------------------+
  11. # | QQ | 451914397 |
  12. # +---------------------------------------------------------------------------+
  13. # | Email | [email protected] |
  14. # +---------------------------------------------------------------------------+
  15. # | 创建时间 | 2011-09-22 13:48:00 |
  16. # +---------------------------------------------------------------------------+
  17. # | 脚本功能 | 局域网流量监控及签到 |
  18. # +---------------------------------------------------------------------------+
  19. # | 版 本 | 2.0 |
  20. # +---------------------------------------------------------------------------+
  21. #
  22. ###############################################################################
  23.  
  24. set -f
  25.  
  26. LANG_BAK=$LANG
  27.  
  28. export LANG="zh_CN.UTF-8"
  29.  
  30. mysql_password="数据库密码"
  31.  
  32. database="数据库名"
  33.  
  34. table="存放用户信息的表"
  35.  
  36. download_limit=100 # 允许的最大下载速度
  37.  
  38. upload_limit=100 # 允许的最大上传速度
  39.  
  40.  
  41. function checkin_and_checkout()
  42. {
  43. # 略
  44. # 可在此处编写签到逻辑,由于本文只演示如何监控局域网流量,所以此处代码就不贴了。
  45. }
  46.  
  47. #############################################################################
  48. ################################## 监控主程序 ################################
  49. #############################################################################
  50.  
  51. hour=`date +%H`
  52.  
  53. if [ $hour -lt 7 ];then exit 0;fi # 办公室肯定没人的时候不检测
  54.  
  55. logfile=/dev/shm/logfile.tmp.`date +%s`
  56. tmpfile=/dev/shm/lanmon.tmp.`date +%s`
  57.  
  58. runtime=2 # minute
  59.  
  60. # 监控程序每次运行runtime分钟,runtime分钟后分析数据
  61.  
  62. begintime=$(date "+%Y-%m-%d %H:%M:%S") # 监控开始时间
  63.  
  64. iptraf -l eth0 -L $logfile -B -t $runtime
  65.  
  66. sleep $(($runtime*60+1))  # 必须等iptraf执行完毕才能继续向后执行,不然尚未生成log
  67.  
  68. endtime=$(date "+%Y-%m-%d %H:%M:%S") # 监控结束时间
  69.  
  70. # 使用sed和awk等工具,截取我们需要的数据
  71. sed -i '1,5d;/Running time/,$d;/^$/d;/Incoming/d;/Outgoing/d;/Last 5-second/d' $logfile
  72. sed -i -r '/Ethernet address/N;s/\n/ /g' $logfile
  73. gawk '{ print $3,$6,$9 }' $logfile > $tmpfile
  74.  
  75. # 此时$tmpfile内容为: $1:MAC地址 $2:平均下载速度(KB/s) $3:平均上传速度(KB/s)
  76.  
  77. while read line
  78. do
  79. # 本次检测的用户的MAC地址
  80. mac_address=$(echo $line | gawk '{ print $1 }') 
  81.  
  82. # 该用户在过去 $runtime 分钟内的平均上传速度
  83. avg_upload_rate=$(echo $line | gawk '{ print $3 }') 
  84.  
  85. # 该用户在过去 $runtime 分钟内的平均下载速度
  86. avg_download_rate=$(echo $line | gawk '{ print $2 }') 
  87.  
  88. # 小b转大B
  89. avg_upload_rate=$(echo helloworld | gawk -v number=$avg_upload_rate '{ print number/8; }')
  90. avg_download_rate=$(echo helloworld | gawk -v number=$avg_download_rate '{ print number/8; }')
  91.  
  92. # 该用户的姓名
  93. mysql_command="select cn_name from ${table} where mac_address='$mac_address'"
  94. cn_name=$(mysql -N -u root -p$mysql_password $database -e"$mysql_command")
  95.  
  96. # 如果没人使用这个mac无需监控(如:FF:FF:FF:FF:FF:FF,或者局域网打印机之类的设备)
  97. if [ x"$cn_name" = x"" ];then continue; fi
  98.  
  99. current_time=$(date "+%F %H:%M:%S")
  100.  
  101. checkin_and_checkout $mac_address # 为该用户签到
  102.  
  103. # 保存检测数据,无论是否超速都记录监控数据
  104. mysql_command="insert into all_data (begintime,endtime,en_name,ip_address,mac_address,download_rate,upload_rate) values"
  105. mysql_command="$mysql_command (\"${begintime}\",\"${endtime}\",\"${en_name}\",\"${ip_address}\",\"${mac_address}\",\"${avg_download_rate}\",\"${avg_upload_rate}\")"
  106. mysql -u root -p$mysql_password $database -e"$mysql_command"
  107.  
  108. # 将平均上传、下载速度取整,进而判断是否超速。(因为bash无法使用小数进行数值比较)
  109. avg_upload_rate_int=${avg_upload_rate%%.*}
  110. avg_download_rate_int=${avg_download_rate%%.*}
  111.  
  112. # 如果超过规定的速度则记录
  113. if [ $avg_download_rate_int -gt $download_limit -o $avg_upload_rate_int -gt $upload_limit ];then
  114. mysql_command="insert into bad_logs (begintime,endtime,cn_name,mac_address,download_rate,upload_rate) values"
  115. mysql_command="$mysql_command (\"${begintime}\",\"${endtime}\",\"${cn_name}\",\"$mac_address\",\"${avg_download_rate}\",\"${avg_upload_rate}\")"
  116. mysql -u root -p$mysql_password ${database} -e"$mysql_command"
  117. fi
  118.  
  119. done < $tmpfile
  120.  
  121. export LANG=$LANG_BAK
  122.  
  123. rm -f $tmpfile
  124. rm -f $logfile
 
由于本文只演示如何监控局域网流量,所以这里贴的脚本与我线上使用的相比有大量删减。
比如:可以把所有人的流量数据相加,之后得到总速率,根据每个人的电脑是否产生了流量进而为用户签到等等。
 
这样,一个局域网流量监控的后台程序就做完了。设置计划任务:
 
crontab -e后添加:
 
*/2 * * * * /path_to_your_script/script_name.sh &> /dev/null
 
这样,系统每隔2分钟就会运行一次,每次都会计算得到这2分钟内所有已开机的设备的平均上行下行流量。
 
注意:计划任务中设置几分钟执行一次,脚本中的runtime最好就设置为几分钟。
 
如果计划任务时间大于脚本中的时间,两次执行之间会有N分钟无法被监控。
(N是计划任务设置的时间与脚本中runtime的差值)
 
 
如果计划任务设置的时间小于脚本中的时间,那么上次的脚本还没执行完呢,新脚本就又开始执行了。
 
这是新执行的脚本会失败。因为iptraf这个命令只能有一个,不能两个同时存在。
 
所以计划任务设置的时间不能小于iptraf执行的时间(两者最好相同)。
 
 
最后,在写个监控数据的展示页面,就可以方便的查看了。
 
如下图片中是本人用php写的简易展示页面(姓名被涂掉了,只留了姓氏,见谅)
 
 
 
下面是签到的数据展示页面(签到部分的代码没贴出来,您可以根据贵公司的具体现状进行编写)