必须配置唯一 default_server 拦截非法 host 请求:在 listen 80/443 后加 default_server,server_name 设为 _,并 return 444;https 需配占位证书;避免多 default_server 或遗漏 default_server 标识。

在 Nginx 中,默认不会自动拒绝未知域名或空 Host 头的请求——它会把这类请求交给某个 server 块处理,通常是第一个配置的 server(若未显式设置 default_server)。要真正实现“默认拒绝”,必须主动配置一个专用的兜底 server 块,并用明确策略拦截所有未匹配的请求。
核心:用 default_server 主动接管,而非依赖隐式行为
关键不是写 server_name _ 或留空,而是把 default_server 作为 listen 的修饰符。它必须和监听指令绑定,且同一端口协议下只能有一个:
- ✅ 正确:
listen 80 default_server;、listen [::]:80 default_server;、listen 443 ssl http2 default_server; - ❌ 错误:
default_server;单独成行(Nginx 启动失败) - ❌ 错误:同一端口重复出现
default_server(nginx -t报 duplicate)
HTTP 和 HTTPS 需分别配置,IPv4 与 IPv6 也要分开
Nginx 按 “IP:端口:协议” 维度识别默认行为,所以四者需独立声明:
- HTTP IPv4:
listen 80 default_server; - HTTP IPv6:
listen [::]:80 default_server; - HTTPS IPv4:
listen 443 ssl http2 default_server; - HTTPS IPv6:
listen [::]:443 ssl http2 default_server;
漏掉任一组合,对应类型的非法请求可能落到业务 server 块中,造成信息泄露。
拒绝方式推荐 return 444
return 444; 是 Nginx 特有状态码,表示直接关闭 TCP 连接,不发任何响应体。相比 return 403 或 return 404,它更干净、日志更少、也更难被扫描器利用:
- 可配合
server_name _;(语义清晰,非必需但推荐) - 不要用
rewrite或return 301跳转到主站——这会让恶意解析获得有效流量 - HTTPS 场景需配占位证书(哪怕自签名),否则 TLS 握手可能失败或暴露默认证书
配置位置与验证要点
建议将该兜底块单独写入 /etc/nginx/conf.d/default-block.conf,并确保它被加载(如 include /etc/nginx/conf.d/*.conf;):
- 放在所有业务 server 块之前或之后均可,只要语法层级正确(在
http{}内) - 修改后务必执行
nginx -t测试,再nginx -s reload - 用
curl -H "Host: fake.example" http://your-ip/或curl --resolve "xxx.com:80:your-ip" http://xxx.com/验证是否返回空响应(444 表现为连接被重置)











