tcまたはiptablesを使用してインターフェイスの帯域幅を監視します。

tcまたはiptablesを使用してインターフェイスの帯域幅を監視します。

/var/log/messagesインターフェイスの受信または送信帯域幅が特定のしきい値を超える場合は、eth0ファイルに警告メッセージを記録したいと思います。ファイルから値を読み取り、/sys/devices/virtual/net/eth0/statistics/[rt]x_bytes値を保存し、しばらく休止し、まったく同じ値を再読み込みし、1秒あたりに送信されたビット数を計算し、結果を特定のしきい値と比較するスクリプトを使用してこれを実行できます。 。 、それより高い場合は、メッセージを/var/log/messagesファイルに書き込みます。しかし、よりスマートな方法はありますか?たとえば、インターフェイスの特定の帯域幅しきい値を超えると、ログメッセージが生成されますかiptablestc

答え1

これを-trオプションと一緒に使用し、しきい値と比較し、超過したvnstat場合はログに書き込むことができます。

-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インターフェースに対してこれを行うのはなぜですか?

関連情報