Nginx配置拦截UA为"-" "-"的DDoS请求时重启报错如何解决?
错误原因
你遇到的启动报错+拦截不生效问题来自两个核心错误:
- 日志字段认知错误:Nginx默认
combined日志格式的字段顺序为客户端IP - 远程用户 [请求时间] "请求行" 状态码 响应字节数 "Referer来源" "User-Agent用户代理",你看到的日志末尾"-" "-",前一个"-"代表Referer为空,后一个"-"才代表UA为空,UA字段本身的值就是单个-,不是"-" "-"。 - 配置语法错误:你写的
$http_user_agent ~ ("-" "-")不符合Nginx的正则写法规则,多余的括号、空格和双引号嵌套会直接导致配置解析失败,服务无法启动。
正确拦截规则
这类攻击的核心特征是UA值为-(即客户端未携带正常UA头),优先用性能更高的精确匹配规则,把以下配置放到需要防护的server块或者全局http块中即可:
# 拦截UA为单个"-"的恶意请求 if ($http_user_agent = "-") { return 403; }
如果担心误杀正常请求(几乎不存在正常客户端UA为-的情况),可以结合你日志里的攻击特征(HEAD请求方法、空Referer)写更精准的匹配规则,误杀率接近0:
# 同时匹配HEAD请求、空UA、空Referer,精准命中你遇到的攻击流量 if ($request_method = HEAD) { if ($http_referer = "-") { if ($http_user_agent = "-") { return 403; } } }
配置生效操作
修改配置后不要直接重启服务,先执行语法校验避免启动失败:
nginx -t
当终端输出syntax is ok、test is successful的提示后,执行重载命令让配置生效即可,不会中断现有业务:
nginx -s reload
补充防护建议
这类多IP的DDoS攻击如果流量规模较大,单靠Nginx拦截会消耗服务器自身带宽和CPU资源,建议搭配以下措施提升防护效果:
- 在云服务商安全组、WAF层面配置频率限制,单IP短时间内请求频率超过阈值直接在边缘节点拉黑,不用回源到服务器。
- Nginx层面可添加限流规则兜底,参考配置如下:
# 先在http块定义限流区域,分配10M内存存储客户端IP,限制单IP平均每秒10个请求 limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s; # 在对应server块引用限流规则,突发请求最多允许5个,超出直接返回503 limit_req zone=req_limit burst=5 nodelay;
内容的提问来源于stack exchange,提问作者PhiDAo
相关产品推荐
相关产品推荐

