该设置能让一些流量计费模式的服务器被恶意攻击时提供流量流出过量保护
在 /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 会自动消失
自动消失 → 脚本不再生效 → 不会因流量关机
如需再次启用,必须手动重新创建标志文件
第一个脚本要不得,配置成300M,会造成开机马上就关机。拆坑,还好服务器没有数据,建议删掉。衰啊。
经过测试在dean12运行正常,确认一下脚本检测参数有没有正常