Nginx 防 CC 攻击需日志分析+脚本+geo/map+安全重载闭环:从访问频次、状态码、路径、参数识别异常 IP,写入黑名单并 CIDR 合并;用 geo/map 高效标记,if 拦截;nginx -t 校验后 reload,加白名单与审计日志防误封。

靠 Nginx 自身实时识别并封禁 CC 攻击不现实,必须用“日志分析 + 外部脚本 + geo/map 预加载 + reload”闭环机制。核心不是拦截单个 URL,而是从访问行为中识别异常模式,再把对应 IP 动态加入黑名单文件,最后安全重载生效。
识别高频异常 URL 的关键指标
CC 攻击常表现为对特定路径的密集、低价值请求,比如:
- 单位时间(如 1 分钟)内同一 IP 访问 /wp-login.php 超过 15 次
- 大量请求 /api/user/info 但返回 401/403,且无有效 Cookie 或 Token
- 高频访问不存在的接口路径(如 /admin/config.php),且状态码集中为 404
- URL 中含可疑参数,如 ?id=1' OR '1'='1 或 &cmd=whoami
用日志提取恶意 IP 并写入黑名单
在自定义日志格式中确保包含 `$request_uri`、`$status`、`$http_user_agent` 等字段,例如:
定时脚本(如每 2 分钟执行)可这样提取攻击源 IP:
- 统计 1 分钟内访问 /wp-login.php 且返回 200 的 IP,超 10 次即拉黑:
awk -v start="$(date -d '1 minute ago' '+%d/%b/%Y:%H:%M:%S')\" '$4 > \"[\" start && $7 ~ /\/wp-login\.php/ && $9 == 200 {print $1}' /var/log/nginx/access.log | sort | uniq -c | awk '$1 > 10 {print $2}' >> /usr/local/nginx/conf/blacklist.conf - 合并重复 IP 并去重:
sort /usr/local/nginx/conf/blacklist.conf | uniq > /tmp/bl.tmp && mv /tmp/bl.tmp /usr/local/nginx/conf/blacklist.conf - 建议将连续 IP 合并为 CIDR(如 192.168.1.100–103 → 192.168.1.100/30),减少 geo 查表开销
Nginx 配置中高效加载黑名单
避免直接用大量 `deny` 语句,改用 `geo` + `map` 实现高性能标记:
- 在 `http` 块中定义变量:
geo $bad_ip { default 0; include /usr/local/nginx/conf/blacklist.conf; }
(blacklist.conf 内容示例:192.168.1.100 1;、203.0.113.0/24 1;) - 用 `map` 将数值转为可用标识:
map $bad_ip $blocked { 1 "1"; default ""; } - 在 `server` 或 `location` 中拦截:
if ($blocked) { return 403; }
安全重载与防误封兜底
每次更新黑名单后必须校验再重载,否则配置错误会导致全站不可用:
- 先运行 nginx -t,仅当输出 success 才执行 nginx -s reload
- 脚本需以 Nginx 配置文件所属用户(如 www-data 或 nginx)权限写入 blacklist.conf
- 加白名单兜底:在 `geo` 块顶部优先声明可信网段,设为 0,确保运维 IP 不被误封
geo $bad_ip { default 0; 192.168.0.0/16 0; 10.0.0.0/8 0; include /usr/local/nginx/conf/blacklist.conf; } - 记录审计日志:把每次封禁的 IP、触发规则、时间追加到 /var/log/nginx/cc-audit.log


















