服务器负载突然拉满?试试这个自动封停异常连接的脚本

发布于
1

服务器毫无征兆地卡顿,延迟飙红,后台一看负载高了300%。这种情况多半是遇到了CC攻击,大量垃圾请求挤占了连接数。不用急着加钱扩容,试试这个基于iptables的轻量脚本,能有效缓解小规模流量冲击。

服务器负载突然拉满

直接丢进服务器后台运行即可:

#!/bin/bash

# 连接阈值,单IP超过100个并发即判定为异常
LIMIT=100
# 封锁时长(秒)
BAN_TIME=1800

while true; do
    # 提取当前高并发IP
    netstat -anp | grep 'tcp\|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr > /tmp/conn_list
    
    # 遍历并封禁
    while read LINE; do
        CONN_NUM=$(echo $LINE | awk '{print $1}')
        IP=$(echo $LINE | awk '{print $2}')
        
        # 排除本地IP
        if [ $CONN_NUM -gt $LIMIT ] && [ $IP != "127.0.0.1" ] && [ $IP != "0.0.0.0" ]; then
            if ! iptables -C INPUT -s $IP -j DROP > /dev/null 2>&1; then
                iptables -I INPUT -s $IP -j DROP
                echo "$(date) Blocked $IP with $CONN_NUM connections" >> /var/log/conn_block.log
                
                # 设置定时解封
                (sleep $BAN_TIME && iptables -D INPUT -s $IP -j DROP) &
            fi
        fi
    done < /tmp/conn_list
    
    sleep 30
done

逻辑解析:

脚本每30秒扫描一次系统连接状态,统计每个IP的活跃连接数。当某个IP的连接数超过预设阈值(默认100),系统会立即通过iptables丢弃该IP发来的所有数据包。封锁时间为30分钟,之后自动解除,避免误伤正常玩家。

参数调整建议:

  • LIMIT值:​ 如果是游戏服务器,玩家通常需要保持长连接,建议设为80-150之间;如果是网页应用,设为50-80即可。

  • BAN_TIME:​ 针对持续骚扰的IP,可以延长至3600秒(1小时)或更高。

注意事项:

  1. 使用前确保iptables已安装,且服务器有空闲性能运行该脚本。

  2. 执行前建议先备份当前iptables规则:iptables-save > /root/iptables.backup

  3. 该方案适合抵御中小型CC攻击,若遭遇大规模流量攻击,仍需配合高防IP或专业清洗服务。

0 讨论
热门最新
总结
暂无总结
0 / 600
嗨,下午好!
所有的成功,都源自一个勇敢的开始
¥10.00
10元抵扣券
已过期