使用 tc 或 iptables 监控接口上的带宽

使用 tc 或 iptables 监控接口上的带宽

/var/log/messages如果eth0接口上的入口或出口带宽超过特定阈值,我想将警告消息记录到文件中。我可以使用一个脚本来执行此操作,该脚本读取文件的值/sys/devices/virtual/net/eth0/statistics/[rt]x_bytes,存储该值,休眠一秒钟,再次读取这些完全相同的值,计算每秒发送的位数,将结果与特定阈值进行比较,如果较高,则写入消息到/var/log/messages文件。然而,有没有更聪明的方法呢?我的意思是,例如,如果超过接口上的某些带宽阈值,可以创建一条日志消息iptablestc

答案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

我终于找到了我正在寻找的解决方案。Iptablesrateest一个模块可以做到这一点。例如:

# 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 接口执行此操作?

相关内容