应配置Nginx通过if+return拦截非法HTTP方法(如TRACE、TRACK、DEBUG)并返回405或444,同时用map与access_log条件记录至独立日志,辅以UA和Header特征增强识别,并结合logrotate与轻量脚本实现审计告警。

要实现对非法 HTTP 方法探测行为的实时拦截与记录,核心不是单纯配置错误日志,而是结合 请求过滤 + 自定义日志 + 状态码控制,让 Nginx 主动拒绝非常规方法(如 OPTIONS、TRACE、TRACK、DEBUG 等),同时将这类拒绝行为明确记录到独立日志中,便于审计和告警。
限制允许的 HTTP 方法并返回明确拒绝状态
Nginx 本身不内置“非法方法黑名单”,需用 if + return 显式拦截。推荐在 server 或 location 块中添加:
- 只允许常见安全方法:
GET、HEAD、POST、PUT、DELETE、PATCH - 对其他方法统一返回
405 Method Not Allowed(语义准确)或444(直接关闭连接,更隐蔽)
示例配置:
if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE|PATCH)$) {
return 405;
}将非法方法请求单独记录到专用访问日志
错误日志(error_log)默认不记录 4xx 请求详情;应使用 access_log 配合 log_format 和 map 实现条件记录:
- 用
map定义变量,标记是否为非法方法请求 - 在
log_format中加入该变量及关键字段(如时间、IP、方法、URI、状态码) - 在 server 块中用
access_log ... if=$illegal_method实现仅记录匹配项
示例:
map $request_method $illegal_method {
default 0;
TRACE 1;
TRACK 1;
DEBUG 1;
OPTIONS 0; # 可选:放行 OPTIONS(CORS 需要)
GET 0;
HEAD 0;
POST 0;
PUT 0;
DELETE 0;
PATCH 0;
}
<p>log_format illegal_method '$time_local | $remote_addr | $request_method | $uri | $status | $http_user_agent';</p><p>access_log /var/log/nginx/illegal-method.log illegal_method if=$illegal_method;增强识别:补充常见扫描特征与 UA 过滤
攻击者常混用非常规方法与可疑 User-Agent(如 sqlmap、nmap、nikto)或异常 Header。可叠加判断提升检出率:
- 检查
$http_user_agent是否含已知扫描器关键词 - 检查是否携带
X-Forwarded-For异常或空Host头 - 组合条件时建议用
map合并逻辑,避免多层if(Nginx 中if在 location 外不支持嵌套)
例如扩展 map:
map "$request_method:$http_user_agent" $scan_attempt {
~^(TRACE|TRACK|DEBUG):.*(?:sqlmap|nikto|nmap|acunetix) 1;
~^(TRACE|TRACK|DEBUG):.* 1;
default 0;
}日志轮转与轻量告警联动
专用日志文件需配合 logrotate 防止膨胀,并可通过简单脚本触发告警:
- 用
logrotate按日切割,保留 7 天 - 写一个每分钟执行的 shell 脚本,统计前一分钟新增行数,超阈值(如 ≥5)则发邮件或写入系统日志
- 避免实时 tail -f + grep,推荐用
awk或journalctl --since(若用 systemd)高效提取
无需引入 ELK,基础运维即可闭环。


















