1、安装vnstat
sudo apt-get install vnstat && \
sudo apt-get install vnstat bc && \
sudo vnstat -i eth0 && \
sudo systemctl start vnstat && \
sudo systemctl enable vnstat
eth0 替换为自己的网卡 ifconfig查看
2、编写脚本
1.流量统计脚本
nano /root/check_traffic.sh
#!/bin/bash
# 设置日志文件路径
LOG_FILE="/var/log/traffic_monitor.log"
# 设置网卡名称
INTERFACE="eth0"
# 设置流量限制(单位:GB)
LIMIT=180
# 记录日志的函数
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}
# 检查是否以 root 权限运行
if [ "$(id -u)" -ne 0 ]; then
log "错误:此脚本需要 root 权限。请在 root 用户的 crontab 中运行。"
exit 1
fi
# 获取当前入站和出站流量(单位:MiB)
vnstat_output=$(vnstat -i $INTERFACE --oneline)
TOTAL_RX=$(echo "$vnstat_output" | awk -F';' '{gsub(/ KiB/, "", $4); gsub(/ MiB/, "", $4); gsub(/ GiB/, "", $4); if ($4 ~ /\./) print $4; else print $4/1024}')
TOTAL_TX=$(echo "$vnstat_output" | awk -F';' '{gsub(/ KiB/, "", $5); gsub(/ MiB/, "", $5); gsub(/ GiB/, "", $5); if ($5 ~ /\./) print $5; else print $5/1024}')
# 将流量转换为GB
RX_GB=$(awk -v rx="$TOTAL_RX" 'BEGIN {printf "%.2f", rx / 1024}')
TX_GB=$(awk -v tx="$TOTAL_TX" 'BEGIN {printf "%.2f", tx / 1024}')
log "当前入站流量: $RX_GB GB, 出站流量: $TX_GB GB"
# 检查是否超过流量限制
if (( $(echo "$RX_GB >= $LIMIT" | bc -l) )) || (( $(echo "$TX_GB >= $LIMIT" | bc -l) )); then
log "流量超出限制 ($LIMIT GB)。正在应用网络限制。"
# 应用网络限制
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
log "网络限制已应用。"
else
log "流量未超出限制。"
fi
2.自动关机脚本
nano /root/reset_network.sh
#!/bin/bash
# 设置日志文件路径
LOG_FILE="/var/log/network_reset.log"
# 记录日志的函数
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}
# 检查是否以 root 权限运行
if [ "$(id -u)" -ne 0 ]; then
log "错误:此脚本需要 root 权限。请在 crontab 中使用 root 用户运行。"
exit 1
fi
# 设置网卡名称
INTERFACE="eth0"
log "开始执行网络重置脚本"
# 重置 vnStat 数据
log "正在重置 vnStat 数据..."
if vnstat --remove --force -i $INTERFACE && vnstat --add -i $INTERFACE; then
log "vnStat 数据已重置"
else
log "错误:重置 vnStat 数据失败"
exit 1
fi
# 重置 iptables 规则
log "正在重置防火墙规则..."
if iptables -P INPUT ACCEPT && iptables -P OUTPUT ACCEPT && iptables -P FORWARD ACCEPT && iptables -F; then
log "防火墙规则已重置,允许所有流量"
else
log "错误:重置防火墙规则失败"
exit 1
fi
log "所有操作已完成"
3.赋予脚本最高权限
chmod +x /root/check_traffic.sh
chmod +x /root/reset_network.sh
4.设置定时任务
crontab -e
# 每5分钟检查一次流量
*/5 * * * * /root/check_traffic.sh
# 每月1号重置网络和流量统计
0 0 1 * * /root/reset_network.sh