/var/log/messages
如果eth0
接口上的入口或出口带宽超过特定阈值,我想将警告消息记录到文件中。我可以使用一个脚本来执行此操作,该脚本读取文件的值/sys/devices/virtual/net/eth0/statistics/[rt]x_bytes
,存储该值,休眠一秒钟,再次读取这些完全相同的值,计算每秒发送的位数,将结果与特定阈值进行比较,如果较高,则写入消息到/var/log/messages
文件。然而,有没有更聪明的方法呢?我的意思是,例如,如果超过接口上的某些带宽阈值,可以创建一条日志消息iptables
?tc
答案1
您可以vnstat
与 -tr 选项一起使用,然后与阈值进行比较,如果超过则写入日志。
-tr time
Calculate how much traffic goes through the selected interface during the giventimeseconds. Thetimewill be 5 seconds if a number parameter isn't included.
答案2
我终于找到了我正在寻找的解决方案。Iptables
有rateest
一个模块可以做到这一点。例如:
# collects all ingress traffic to RATEEST target
iptables -A INPUT -j RATEEST --rateest-name RE1 --rateest-interval 500.0ms --rateest-ewmalog 1s
# creates a log entry(jumps to LOG target) if rate is greater than 10Mbps
iptables -A INPUT -m rateest --rateest RE1 --rateest-gt --rateest-bps 10Mbps -j LOG --log-prefix "Ingress bandwidth >10Mbps "
答案3
netstat -i
仅供初学者使用。查看 RX-OK 和 TX-OK 的标头。用 cron 设置一下就可以了。
#!/bin/bash
# Mar 2015
# Get bytes transmitted and received on eth0 and log msg.
echo " "
bytein=`netstat -i | grep eth0 | awk '{print $4 }'`
byteout=`netstat -i | grep eth0 | awk '{print $8 }'`
total=$((${bytein} + ${byteout}))
# echo "IN=$bytein, OUT=$byteout, TOTAL=$total"
max=1000000
outfile=/var/log/messages
msg="Bandwidth has exceeded $max bytes"
if [ $total -gt $max ]; then
echo "$msg" >> $outfile
echo $msg
fi
OP的大局是什么?我可以看到为不同的用户执行此操作以限制他们的带宽,为什么对 eth0 接口执行此操作?