Chinaunix首页 | 论坛 | 博客
  • 博客访问: 54507
  • 博文数量: 13
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 30
  • 用 户 组: 普通用户
  • 注册时间: 2014-01-04 14:48
个人简介

为者常成,行者常至

文章分类
文章存档

2014年(13)

我的朋友

分类: LINUX

2014-05-27 17:58:42

本文演示如何监控内网的流量信息。(本文前提是你有一个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.实现开机自动签到(这个是附加功能,跟流量监控无关,本人公司是这样实现签到的)

下面是代码:


点击(此处)折叠或打开

  1. #!/bin/bash
  2. ###############################################################################
  3. #
  4. # +---------------------------------------------------------------------------+
  5. # | 脚本名称 | lanmon.sh |
  6. # +---------------------------------------------------------------------------+
  7. # | 作 者 | xiaoxi227              |
  8. # +---------------------------------------------------------------------------+
  9. # | QQ | 543928910 |
  10. # +---------------------------------------------------------------------------+
  11. # | Email | xiaoxi227@163.com |
  12. # +---------------------------------------------------------------------------+
  13. # | 创建时间 | 2011-09-22 13:48:00 |
  14. # +---------------------------------------------------------------------------+
  15. # | 脚本功能 | 局域网流量监控及签到 |
  16. # +---------------------------------------------------------------------------+
  17. # | 版 本 | 2.0 |
  18. # +---------------------------------------------------------------------------+
  19. #
  20. ###############################################################################
  21. set -f
  22. LANG_BAK=$LANG
  23. export LANG="zh_CN.UTF-8"
  24. mysql_password="数据库密码"
  25. database="数据库名"
  26. table="存放用户信息的表"
  27. download_limit=100 # 允许的最大下载速度
  28. upload_limit=100 # 允许的最大上传速度

  29. function checkin_and_checkout()
  30. {
  31. # 略
  32. # 可在此处编写签到逻辑,由于本文只演示如何监控局域网流量,所以此处代码就不贴了。
  33. }
  34. #############################################################################
  35. ################################## 监控主程序 ################################
  36. #############################################################################
  37. hour=`date +%H`
  38. if [ $hour -lt 7 ];then exit 0;fi # 办公室肯定没人的时候不检测
  39. logfile=/dev/shm/logfile.tmp.`date +%s`
  40. tmpfile=/dev/shm/lanmon.tmp.`date +%s`
  41. runtime=2 # minute
  42. # 监控程序每次运行runtime分钟,runtime分钟后分析数据

  43. begintime=$(date "+%Y-%m-%d %H:%M:%S") # 监控开始时间

  44. iptraf -l eth0 -L $logfile -B -t $runtime

  45. sleep $(($runtime*60+1))  # 必须等iptraf执行完毕才能继续向后执行,不然尚未生成log

  46. endtime=$(date "+%Y-%m-%d %H:%M:%S") # 监控结束时间
  47. # 使用sed和awk等工具,截取我们需要的数据
  48. sed -i '1,5d;/Running time/,$d;/^$/d;/Incoming/d;/Outgoing/d;/Last 5-second/d' $logfile
  49. sed -i -r '/Ethernet address/N;s/\n/ /g' $logfile
  50. gawk '{ print $3,$6,$9 }' $logfile > $tmpfile
  51. # 此时$tmpfile内容为: $1:MAC地址 $2:平均下载速度(KB/s) $3:平均上传速度(KB/s)
  52. while read line
  53. do
  54. # 本次检测的用户的MAC地址
  55. mac_address=$(echo $line | gawk '{ print $1 }') 

  56. # 该用户在过去 $runtime 分钟内的平均上传速度
  57. avg_upload_rate=$(echo $line | gawk '{ print $3 }') 

  58. # 该用户在过去 $runtime 分钟内的平均下载速度
  59. avg_download_rate=$(echo $line | gawk '{ print $2 }') 
  60. # 小b转大B
  61. avg_upload_rate=$(echo helloworld | gawk -v number=$avg_upload_rate '{ print number/8; }')
  62. avg_download_rate=$(echo helloworld | gawk -v number=$avg_download_rate '{ print number/8; }')
  63. # 该用户的姓名
  64. mysql_command="select cn_name from ${table} where mac_address='$mac_address'"
  65. cn_name=$(mysql -N -u root -p$mysql_password $database -e"$mysql_command")

  66. # 如果没人使用这个mac无需监控(如:FF:FF:FF:FF:FF:FF,或者局域网打印机之类的设备)
  67. if [ x"$cn_name" = x"" ];then continue; fi
  68. current_time=$(date "+%F %H:%M:%S")

  69. checkin_and_checkout $mac_address # 为该用户签到
  70. # 保存检测数据,无论是否超速都记录监控数据
  71. mysql_command="insert into all_data (begintime,endtime,en_name,ip_address,mac_address,download_rate,upload_rate) values"
  72. mysql_command="$mysql_command (\"${begintime}\",\"${endtime}\",\"${en_name}\",\"${ip_address}\",\"${mac_address}\",\"${avg_download_rate}\",\"${avg_upload_rate}\")"
  73. mysql -u root -p$mysql_password $database -e"$mysql_command"
  74. # 将平均上传、下载速度取整,进而判断是否超速。(因为bash无法使用小数进行数值比较)
  75. avg_upload_rate_int=${avg_upload_rate%%.*}
  76. avg_download_rate_int=${avg_download_rate%%.*}
  77.  
  78. # 如果超过规定的速度则记录
  79. if [ $avg_download_rate_int -gt $download_limit -o $avg_upload_rate_int -gt $upload_limit ];then
  80. mysql_command="insert into bad_logs (begintime,endtime,cn_name,mac_address,download_rate,upload_rate) values"
  81. mysql_command="$mysql_command (\"${begintime}\",\"${endtime}\",\"${cn_name}\",\"$mac_address\",\"${avg_download_rate}\",\"${avg_upload_rate}\")"
  82. mysql -u root -p$mysql_password ${database} -e"$mysql_command"
  83. fi
  84. done < $tmpfile

  85. export LANG=$LANG_BAK
  86. rm -f $tmpfile
  87. rm -f $logfile


由于本文只演示如何监控局域网流量,所以这里贴的脚本与我线上使用的相比有大量删减。
比如:可以把所有人的流量数据相加,之后得到总速率,根据每个人的电脑是否产生了流量进而为用户签到等等。

这样,一个局域网流量监控的后台程序就做完了。设置计划任务:

crontab -e后添加:

*/2 * * * * /path_to_your_script/script_name.sh &> /dev/null

这样,系统每隔2分钟就会运行一次,每次都会计算得到这2分钟内所有已开机的设备的平均上行下行流量。

注意:计划任务中设置几分钟执行一次,脚本中的runtime最好就设置为几分钟。

如果计划任务时间大于脚本中的时间,两次执行之间会有N分钟无法被监控。
(N是计划任务设置的时间与脚本中runtime的差值)


如果计划任务设置的时间小于脚本中的时间,那么上次的脚本还没执行完呢,新脚本就又开始执行了。

这是新执行的脚本会失败。因为iptraf这个命令只能有一个,不能两个同时存在。

所以计划任务设置的时间不能小于iptraf执行的时间(两者最好相同)。


最后,在写个监控数据的展示页面,就可以方便的查看了。

如下图片中是本人用php写的简易展示页面(姓名被涂掉了,只留了姓氏,见谅)



下面是签到的数据展示页面(签到部分的代码没贴出来,您可以根据贵公司的具体现状进行编写)



好了,本文到此结束。希望对那些想监控局域网流量的读者有所帮助。


阅读(1479) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~