应通过Nginx日志识别高频请求敏感路径(如/shell.php)且返回404/200的行为,配合Fail2ban定制failregex规则、配置real_ip还原真实IP、设置maxretry=3/findtime=60/bantime=7200,并经fail2ban-regex和fail2ban-client验证后上线。

要识别并拉黑针对“静态后门”的扫描行为,关键不是等它执行成功,而是抓住它试探时留下的痕迹——比如高频请求特定敏感文件路径(.php、.jsp、.aspx 等可执行扩展名),且状态码多为 404 或 200(后者常是攻击者绕过 WAF 的伪装)。Nginx 本身不主动分析日志,但可以配合 Fail2ban 或自定义脚本,实现从日志捕获 → 规则匹配 → 自动封禁的闭环。
确保 Nginx 日志记录真实 IP 和关键字段
如果日志里全是 127.0.0.1 或 CDN 节点 IP,所有封禁都无效。必须确认:
- 使用
$binary_remote_addr(非$remote_addr)记录客户端地址,并配置real_ip指令还原真实来源 - 日志格式至少包含:客户端 IP、请求行(含路径)、HTTP 状态码。例如:
log_format main '$binary_remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'; - 若用宝塔或 Cloudflare,务必在面板中开启「获取真实 IP」,否则
$binary_remote_addr仍为代理 IP
编写专用于后门扫描的 Fail2ban 过滤规则
默认规则对后门扫描基本无效。你需要按实际攻击特征定制 failregex,重点匹配“可疑路径 + 可疑状态码”组合:
- 匹配常见静态后门路径(如
/shell.php、/1.php、/a.jsp、/cmd.aspx)且返回 404:failregex = ^<HOST> -.*"(GET|POST) /(shell|1|cmd|test|backdoor)\.(php|jsp|aspx|jspx|pl) HTTP.*" 404 - 若攻击者用 200 绕过检测(如返回空页或错误 JSON),可加一条匹配 200 + 敏感路径:
failregex = ^<HOST> -.*"(GET|POST) /(shell|1|cmd)\.(php|jsp|aspx) HTTP.*" 200 - 用
ignoreregex排除白名单 UA(如监控探针、可信爬虫)或内部健康检查路径,避免误封
配置 Jail 并设置合理触发阈值
在 /etc/fail2ban/jail.d/custom.conf 中新增 jail,把“扫描行为”量化为可执行参数:
-
maxretry = 3:1 分钟内命中 3 次即封——后门扫描通常密集试探,无需高阈值 -
findtime = 60:时间窗口设为 60 秒,比爆破类更短,能更快响应扫描节奏 -
bantime = 7200:封禁 2 小时,足够打断自动化工具;可启用bantime.increment = true让反复出现的 IP 封禁时间累加 -
backend = auto:确保日志文件被实时监控(尤其使用 logrotate 时)
验证与上线前必做三件事
规则写完不能直接上线,必须验证有效性:
- 用
fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-backdoor.conf测试正则是否真能抓到样本日志行 - 用
fail2ban-client status nginx-backdoor查看当前 jail 是否运行、有无匹配计数 - 手动模拟一次扫描请求(如
curl http://yoursite.com/shell.php),观察是否触发封禁并出现在iptables -L INPUT中


















