通过nginx日志识别并封锁异常ip的核心是分析日志特征、自动提取异常ip、快速封禁,可不依赖waf应对刷量、爬虫、爆破等攻击;关键字段包括$remote_addr、$status、$request_time等,需确保cdn下真实ip还原;可用awk命令筛查高频请求、403/404、敏感路径访问ip;推荐fail2ban实现自动封禁,需配置filter、jail规则并校准时区与时间格式。

直接通过 Nginx 日志识别并封锁异常 IP,核心在于“分析日志特征 + 自动提取 + 快速封禁”,不依赖第三方 WAF 也能快速响应刷量、爬虫、爆破等攻击。
定位异常流量的关键日志字段
Nginx 默认 access_log 中最需关注的是:$remote_addr(真实客户端 IP)、$status(HTTP 状态码)、$request_time(请求耗时)、$request(请求行,含 URL 和方法)、$http_user_agent(UA)、$http_referer(来源页)。若使用 CDN 或反向代理,需确保 $real_ip 已通过 set_real_ip_from 和 real_ip_header X-Forwarded-For 正确还原真实 IP,否则封错地址。
用命令行快速筛查高频异常 IP
在日志文件(如 /var/log/nginx/access.log)中,结合 awk、sort、uniq 快速统计:
- 1 分钟内请求超 100 次的 IP:
awk '$4 > "['$(date -d '1 minute ago' '+%d/%b/%Y:%H:%M')':00" && $4 100 {print $2}' - 大量 404 或 403 的 IP(可能在扫目录):
awk '$9 ~ /^40[34]$/ {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10 - 高频访问敏感路径(如
/wp-login.php、/api/login)的 IP:awk '$7 ~ /\/wp-login\.php|\/api\/login/ {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -5
用 fail2ban 实现自动封禁(推荐方案)
手动封 IP 易遗漏、难持续,fail2ban 可监听 Nginx 日志并触发 iptables 或 nftables 封禁:
- 安装后,在
/etc/fail2ban/jail.local中启用 nginx 相关 jail,例如: - 添加自定义 filter:
/etc/fail2ban/filter.d/nginx-badbots.conf,正则匹配恶意 UA 或扫描行为; - 配置 jail 规则:设定
maxretry = 5、findtime = 600(10 分钟内触发 5 次即封)、bantime = 3600(封 1 小时); - 重启 fail2ban 并用
fail2ban-client status nginx-badbots查看实时拦截状态。
临时封禁与验证方式
确认 IP 异常后,可立即手动干预:
- 用 iptables 封禁:
iptables -I INPUT -s 192.168.1.100 -j DROP(注意保存规则,避免重启丢失); - 或在 Nginx 配置中用
deny 192.168.1.100;(需 reload nginx); - 验证是否生效:从该 IP curl 网站,应返回连接超时或 403;同时检查
tail -f /var/log/nginx/access.log是否不再出现该 IP 请求。
不复杂但容易忽略的是日志时间格式和时区一致性——确保系统时间、Nginx log_format 中的 $time_local 与 fail2ban 配置中的 datepattern 匹配,否则无法正确解析时间戳,导致规则失效。











