本文演示如何监控内网的流量信息。(本文前提是你有一个linux系统在做网关)
点击(此处)折叠或打开
- #!/bin/bash
- ###############################################################################
- #
- # +---------------------------------------------------------------------------+
- # | 脚本名称 | lanmon.sh |
- # +---------------------------------------------------------------------------+
- # | 作 者 | xiaoxi227 |
- # +---------------------------------------------------------------------------+
- # | QQ | 451914397 |
- # +---------------------------------------------------------------------------+
- # | 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