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