应配置显式default_server块实现非法域名请求的零延迟拦截,每个端口仅一个且省略server_name,业务server块只列精确白名单域名并禁用通配符与正则。

核心是用 default_server 块兜底拦截,不靠 server_name 匹配,而是靠监听逻辑直接终止非法请求。
只留一个明确的 default_server
每个端口(80、443、8080 等)必须且只能有一个带 default_server 标志的 server 块。Nginx 会把所有 Host 头不匹配任何显式 server_name 的请求,全部交给它处理——包括 IP 直接访问、含下划线的域名(如 test_user.example.com)、随机子域(如 xxx.attacker.net)等。
- HTTP 端口写:
listen 80 default_server; - HTTPS 端口写:
listen 443 ssl http2 default_server; - 不要依赖“第一个 server 块自动成为 default”,必须显式声明
- 其他业务 server 块里,同一端口不能再出现
default_server
default_server 块要极简,不参与任何匹配
这个块的目标是“零延迟拦截”,不能有 location、root、proxy_pass、rewrite 或正则匹配。它只做一件事:快速响应或断连。
- 推荐返回
444:静默关闭 TCP 连接,不发任何字节,CPU 和带宽开销最低 - 也可返回
403:合规场景下更友好,但需确保不加载静态文件(避免root+error_page) - 不要写
server_name _或server_name "":这些值会触发冗余匹配流程,反而拖慢拦截速度 - 最佳实践是:
server_name字段直接省略
业务 server 块只列白名单域名
所有合法域名必须显式、精确写出,禁用通配符和正则,否则无法真正拦截未授权子域。
- 正确写法:
server_name example.com www.example.com api.example.com; - 错误写法:
server_name *.example.com;或server_name ~^([a-z0-9-]+)\.example\.com$; - 含下划线的域名(如
admin_test.example.com)天然不被 Nginx 认可,不会匹配任何合法块,自动落入 default_server - 这样配置后,攻击者即使把
payroll.example.com解析到你服务器 IP,也会被立即 444 拒绝
配合日志识别与 IP 封禁效果更好
default_server 拦截的是“域名层”非法请求,但真实攻击常伴随高频扫描、敏感路径探测等行为。建议同步做两件事:
- 定期分析 access.log,用
awk提取异常 Host、URI、User-Agent,发现规律后加入封禁列表 - 用
geo指令高效封禁恶意 IP 段,比一堆deny更轻量(尤其在封禁上百条时) - 两者叠加:非法域名进 default_server → 返回 444;已知黑产 IP 即使访问合法域名,也在入口被
if ($block_ip)拦住


















