应先用tac实时分析Nginx日志识别高频IP,再用iptables -I INPUT精准封禁;同时启用Nginx限流、配置CDN真实IP映射、结合fail2ban分层防御,缺一不可。

确认攻击后第一反应不是删日志或关服务,而是立刻封住正在打你的IP——但直接封错源IP、漏掉CDN节点、或规则不持久,反而会让服务器更慢甚至失联。
怎么快速封禁正在刷你网站的IP
别进宝塔界面点来点去,用命令行从Nginx日志里实时抓高频IP,一秒内完成识别+封禁:
-
tac倒序读日志比tail -n更准,能确保抓到最近60秒的完整请求段 - 阈值别硬套“150次/分钟”,先试
80:静态资源多的站(如博客)可设低些,API类站点建议调到200以上再观察 - 执行前加
iptables -C检查是否已存在该规则,避免重复插入拖慢 iptables 遍历速度 - 封禁命令必须用
iptables -I INPUT(不是-A),保证规则在链最前生效,否则可能被其他放行规则绕过
示例命令(封过去1分钟内访问超100次的IP):
tac /www/wwwlogs/yoursite.log | awk -v st="$(date -d '1 minutes ago' '+%d/%b/%Y:%H:%M:%S')" -v et="$(date '+%d/%b/%Y:%H:%M:%S')" '$4 ~ /\[.*\]/ && substr($4,2,20) >= st && substr($4,2,20) <= et {ip[$2]++} END {for (i in ip) if (ip[i] > 100) print i}' | while read ip; do iptables -C INPUT -s $ip -j DROP 2>/dev/null || iptables -I INPUT -s $ip -j DROP; done
为什么封了IP网站还是卡?因为没限带宽和连接数
CC攻击早不靠“次数”压垮你,而是用长连接占满PHP-FPM或Nginx worker_connections。只封IP等于拆了枪管,没卸弹匣。
- 进站点设置 →
流量限制→ 启用后选「博客」模板(非「无」),它会自动注入limit_conn和limit_req - 若你套了CDN,
$binary_remote_addr会变成CDN出口IP,必须提前在Nginx配置里加map规则还原真实IP,否则限的全是腾讯云节点 -
limit_conn_zone $clientRealIp zone=perip:10m中的$clientRealIp必须已在http块定义,否则整条规则静默失效 - 日志级别至少设为
crit,否则limit_req的拒绝记录不会写进access.log,你根本看不到谁被限了
封完IP还要防它换马甲回来
攻击者换IP成本低于你盯日志的时间,封禁时间设太短等于白干;但设太长又怕误伤真实用户。关键在分层控制:
- 用
fail2ban替代手动封:它盯/www/wwwlogs/*.log,匹配404 /wp-login.php或401 /admin这类行为,一触发就调iptables封,不依赖频率阈值 -
bantime = 3600是底线,建议设86400(24小时),配合maxretry = 3,即3次失败就封一天 - 宝塔改端口后,
firewalld和云厂商安全组必须同步放开新端口,否则封完IP也登不上面板——这是最常被忽略的断层 - 别信「自动封禁」,免费版WAF的自动黑名单只记IP不拉黑,得你手动去「黑名单」页签点「永久加入」
真正卡住攻击者的不是封IP的速度,而是你能否让每个IP在连接建立、请求处理、响应返回三个环节都撞上不同限制——这需要日志解析、iptables、Nginx限流、fail2ban 四层规则对齐,缺一层,攻击者就能滑过去。

















