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

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

 

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

写入以下内容

#!/bin/bash

# 配置参数
INTERFACE="ens5"          # 修改成你要监听的网卡名称(使用 ip a 命令查询)
THRESHOLD_MB=500          # 设置阈值,单位 MB,根据带宽填写
INTERVAL=3                # 采样间隔(秒)
WINDOW_SEC=60             # 时间窗口(秒)

# 计算窗口内需要的采样点数
WINDOW_SIZE=$(( WINDOW_SEC / INTERVAL ))
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_SEC}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_SIZE )); then
        old_val=${tx_history[$index]}
        total_tx=$(( total_tx - old_val ))
    fi
    
    tx_history[$index]=$diff
    total_tx=$(( total_tx + diff ))
    prev_tx=$current_tx
    index=$(( (index + 1) % WINDOW_SIZE ))
    
    # 判断是否超阈值
    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 ${WINDOW_SEC}s 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
    7 月前
    2026-1-07 0:24:37

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

    • lazy
      ouyang
      已编辑
      6 月前
      2026-1-08 10:43:52

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

发送评论 编辑评论


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