在 nginx 中限制非法域名直接通过 ip 访问,核心做法是配置一个优先级最高的默认 server 块,将其 server_name 设置为下划线 _,并在该块内返回 403 forbidden 或 444 状态码。这样当请求的 host 头不匹配任何已定义的有效域名时,nginx 会命中这个兜底规则并拒绝连接。

如何配置默认 server 块拦截非预期 Host
要实现这一拦截,需要在 nginx.conf 或包含的文件中,将 listen 指令加上 default_server 参数,并将 server_name 设为通配符。这确保了所有未明确匹配的请求都会进入此处理逻辑。

server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 403;
}
上述配置中,return 403; 会向客户端返回标准的禁止访问错误页面。如果希望更彻底地切断连接而不发送响应头,可以将 return 改为 return 444;,这是 Nginx 特有的非标准状态码,连接会被直接关闭。确保该 server 块在所有其他业务 server 块之前被加载,或者利用 default_server 标志来保证优先级。
HTTPS 场景下的 SNI 与证书校验策略
对于 HTTPS 服务,除了 HTTP 层的拦截,还需要处理 TLS 握手阶段的 SNI(Server Name Indication)问题。如果攻击者使用无效域名发起 HTTPS 请求,Nginx 需要能够正确识别并拒绝,同时避免暴露错误的证书信息。

server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name _;
# 可选:指定一个通用的自签名证书或空证书
ssl_certificate /etc/nginx/ssl/default.crt;
ssl_certificate_key /etc/nginx/ssl/default.key;
# 拒绝所有 HTTPS 请求
return 444;
}
在 HTTPS 配置中,return 444; 是更推荐的做法,因为它在 TLS 握手完成后立即断开连接,不会发送任何 HTTP 响应。这有助于防止攻击者通过响应内容探测服务器信息。同时,必须为这个默认 server 块配置有效的 SSL 证书文件,否则 Nginx 可能无法启动或无法正确处理 TLS 握手。如果不想暴露任何证书细节,可以使用一个通用的、非特定的证书,但通常建议直接阻断连接。
当 Host 头为空时 Nginx 的行为是什么
当客户端发送的请求中 Host 头为空或完全缺失时,Nginx 的处理行为取决于其版本和配置。在大多数现代 Nginx 版本中,空的 Host 头不会匹配具体的域名,因此也会落入 server_name _; 的默认 server 块中,从而受到相同的拦截策略保护。
# 测试空 Host 头的请求 # curl -H "Host: " http://your-ip/ # 结果:返回 403 或连接关闭
验证这一点可以通过命令行工具模拟。执行 curl -H "Host: " http://<server_ip></server_ip>,如果配置了上述默认 server 块,请求将被拒绝。这表明即使没有提供域名,Nginx 依然能正确识别其为非法访问并执行拦截。这种机制确保了无论客户端是否提供 Host 头,只要不是预期的合法域名,都会被统一处理,增强了安全性。


















