为你的服务器设置流量流出达到阈值关机策略

该设置能让一些流量计费模式的服务器被恶意攻击时提供流量流出过量保护

在 /usr/local/bin/monitor.sh创建脚本

写入以下内容

#!/bin/bash

INTERFACE="ens5"          #修改成你的网卡名称 ip a命令查询
THRESHOLD_MB=300          # 设置阈值,单位 MB 根据你带宽填写合适数值
INTERVAL=3                # 采样间隔(秒)
WINDOW=60                 # 时间窗口(秒)

THRESHOLD_BYTES=$((THRESHOLD_MB * 1024 * 1024))

declare -a tx_history
index=0
total_tx=0

get_tx_bytes() {
    awk -v iface="$INTERFACE:" '$1 == iface {print $10}' /proc/net/dev
}

prev_tx=$(get_tx_bytes)
if [[ -z "$prev_tx" ]]; then
    echo "Error: Interface $INTERFACE not found."
    exit 1
fi

echo "Monitoring upload on $INTERFACE. Threshold: ${THRESHOLD_MB} MB in ${WINDOW}s."

while true; do
    sleep $INTERVAL
    current_tx=$(get_tx_bytes)
    if [[ -z "$current_tx" ]]; then
        echo "Interface $INTERFACE disappeared. Exiting."
        exit 1
    fi

    if (( current_tx >= prev_tx )); then
        diff=$((current_tx - prev_tx))
    else
        diff=$(( (2**64 - prev_tx) + current_tx ))
    fi
    if (( ${#tx_history[@]} < WINDOW )); then
        tx_history+=($diff)
    else
        old_val=${tx_history[$index]}
        total_tx=$((total_tx - old_val))
        tx_history[$index]=$diff
    fi
    total_tx=$((total_tx + diff))
    prev_tx=$current_tx
    index=$(( (index + 1) % WINDOW ))

    if (( total_tx >= THRESHOLD_BYTES )); then
        echo "$(date): Upload threshold exceeded (${total_tx} bytes >= ${THRESHOLD_BYTES}). Shutting down..."
        /sbin/shutdown -h now "Upload limit exceeded on $INTERFACE"
        exit 0
    fi
    # echo "Current 60s upload: $((total_tx / 1024 / 1024)) MB
done

根据自己需求修改以上参数。该代码只统计流出流量

执行sudo chmod +x /usr/local/bin/monitor.sh 授权

创建 /etc/systemd/system/monitor.service

写入以下内容

[Unit]
Description= 监控网卡上传情况,若超出阈值则关鸡
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/monitor.sh
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

启动

sudo systemctl daemon-reexec
sudo systemctl enable --now monitor.service

查看日志

journalctl -u monitor -f

建议部署后进行测试。把THRESHOLD_MB=300 参数改小然后下载大于该数值的文件查看服务器是否关机。关机后启动了再尝试一次下载确保脚本能自启

可以配备探针之类的工具协助查看总体流量使用情况,推荐使用nezha面板,后台可以配置一些指令和信息统计,详情自己摸索

以下为设置一个自然月里使用流量到达阈值自动关机,防止半夜里卡着策略上限gank

安装 vnstat和jq

sudo apt install vnstat -y
sudo apt install jq -y 

初始化(假设网卡名为 eth0)

sudo vnstat -i eth0 #名字自己用ip a命令查询

# 启用服务
sudo systemctl enable vnstat
sudo systemctl start vnstat

验证 vnstat 是否正常工作

vnstat -i 网卡名 -m # 查看统计

创建脚本

/usr/local/bin/check_tx_limit.sh

写入以下代码

#!/bin/bash

if [ ! -f /run/tx_monitor_enabled ]; then
    exit 0
fi

INTERFACE="ens5"          # 网卡名
THRESHOLD_MB=200000          # 阈值 单位:MB
LOGFILE="/var/log/tx_monitor.log"

TX_BYTES=$(vnstat -i "$INTERFACE" --json | jq -r '.interfaces[0].traffic.month[0].tx' 2>/dev/null)

if [ -z "$TX_BYTES" ] || ! [[ "$TX_BYTES" =~ ^[0-9]+$ ]]; then
    echo "$(date): [WARN] Failed to get valid TX data for $INTERFACE (got: '$TX_BYTES')" >> "$LOGFILE"
    exit 0
fi

TX_MB=$(( TX_BYTES / 1000000 ))

echo "$(date): Current TX this month = ${TX_MB} MB (threshold: ${THRESHOLD_MB} MB)" >> "$LOGFILE"

if [ "$TX_MB" -ge "$THRESHOLD_MB" ]; then
    echo "$(date): TX limit exceeded! Shutting down..." >> "$LOGFILE"
    /sbin/shutdown -h now "Monthly upload limit reached on $INTERFACE."
fi

(只统计流出流量)

授权

sudo chmod +x /usr/local/bin/check_tx_limit.sh

设置每10分钟执行(root cron)

sudo crontab -e

写入以下规则

*/10 * * * * /usr/local/bin/check_tx_limit.sh >/dev/null 2>&1

顺序为 分 时 日 月 星期

nano指令:ctrl+o保存(回车确认) ctrl+x退出

手动运行脚本测试

sudo /usr/local/bin/check_tx_limit.sh

查看日志

tail -f /var/log/tx_monitor.log

在脚本中加了一个启用标志文件,只有该文件存在时才检查流量并关机,防止开机就关机

启用监控时,手动创建标志文件(需 root)

sudo touch /run/tx_monitor_enabled

系统重启后/run/tx_monitor_enabled 会自动消失

自动消失 → 脚本不再生效 → 不会因流量关机

如需再次启用,必须手动重新创建标志文件

    评论

    1. ouyang
      2 周前
      2026-1-07 0:24:37

      第一个脚本要不得,配置成300M,会造成开机马上就关机。拆坑,还好服务器没有数据,建议删掉。衰啊。

      • lazy
        ouyang
        已编辑
        2 周前
        2026-1-08 10:43:52

        经过测试在dean12运行正常,确认一下脚本检测参数有没有正常

    发送评论 编辑评论

    
    				
    |´・ω・)ノ
    ヾ(≧∇≦*)ゝ
    (☆ω☆)
    (╯‵□′)╯︵┴─┴
     ̄﹃ ̄
    (/ω\)
    ∠( ᐛ 」∠)_
    (๑•̀ㅁ•́ฅ)
    →_→
    ୧(๑•̀⌄•́๑)૭
    ٩(ˊᗜˋ*)و
    (ノ°ο°)ノ
    (´இ皿இ`)
    ⌇●﹏●⌇
    (ฅ´ω`ฅ)
    (╯°A°)╯︵○○○
    φ( ̄∇ ̄o)
    ヾ(´・ ・`。)ノ"
    ( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
    (ó﹏ò。)
    Σ(っ °Д °;)っ
    ( ,,´・ω・)ノ"(´っω・`。)
    ╮(╯▽╰)╭
    o(*////▽////*)q
    >﹏<
    ( ๑´•ω•) "(ㆆᴗㆆ)
    😂
    😀
    😅
    😊
    🙂
    🙃
    😌
    😍
    😘
    😜
    😝
    😏
    😒
    🙄
    😳
    😡
    😔
    😫
    😱
    😭
    💩
    👻
    🙌
    🖕
    👍
    👫
    👬
    👭
    🌚
    🌝
    🙈
    💊
    😶
    🙏
    🍦
    🍉
    😣
    Source: github.com/k4yt3x/flowerhd
    颜文字
    Emoji
    小恐龙
    花!
    上一篇