服务器毫无征兆地卡顿,延迟飙红,后台一看负载高了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小时)或更高。
注意事项:
-
使用前确保iptables已安装,且服务器有空闲性能运行该脚本。
-
执行前建议先备份当前iptables规则:
iptables-save > /root/iptables.backup。 -
该方案适合抵御中小型CC攻击,若遭遇大规模流量攻击,仍需配合高防IP或专业清洗服务。

