核心是让探测在协议最底层失败:http层用default_server + return 444拦截非法host;https层在http块顶层启用ssl_reject_handshake on,精确声明server_name并禁用泛域名和default_server,实现tls握手阶段即断连且不暴露任何指纹。

防范非法请求的域名探测,核心不是等请求进来再过滤,而是让探测行为在协议最底层就失败——既不响应、不返回、不暴露服务存在,也不泄露任何指纹信息。
HTTP 层:用 default_server + 444 拦截非法 Host
所有未匹配 显式声明 server_name 的 HTTP 请求(比如直接用 IP 访问、伪造 Host 头、空 Host),都应由一个兜底 server 块处理:
- 监听 80 端口,标记为
default_server -
server_name _;—— 匹配任意未定义域名 - 使用
return 444;—— Nginx 特有状态码,直接关闭 TCP 连接,不发任何响应头或 body - 避免写
server_name *;或通配符,否则等于主动确认服务在线
HTTPS 层:启用 ssl_reject_handshake 阻断 TLS 握手
这是真正防探测的关键一步。它在 Client Hello 阶段就检查 SNI 域名,未匹配即断连,客户端连证书都拿不到:
- 在
http { }块顶层添加:ssl_reject_handshake on; - 每个 HTTPS
server必须精确列出合法域名:server_name example.com www.example.com; - 禁用
*.example.com泛域名和任何default_server,否则会绕过拦截 - 验证方式:用
openssl s_client -connect ip:443 -servername fake.test.com,成功时输出含UNRECOGNIZED_NAME且无Certificate:段
隐藏服务指纹,杜绝信息泄露
即使配置了拦截,若响应中暴露版本号、默认页或错误细节,仍会被用于二次分析:
- 全局关闭版本标识:
server_tokens off; - 自定义错误页(400/403/404/497),页面内容精简,不含服务器名、路径或堆栈
- 禁用默认欢迎页,删除未使用的
index.html和测试文件 - 避免在 location 中用
rewrite ... permanent,改用return 301,更轻量可控
辅助加固:防火墙与日志协同防御
应用层拦截之外,底层防护能进一步压缩攻击面:
- 用 ufw 或 iptables 限制 80/443 端口仅允许主流爬虫 UA(如 Googlebot)或可信 CDN IP 段访问(可选)
- 对高频无 Host 头、UA 为空、或含扫描特征(如 sqlmap、nmap)的连接直接 DROP
- 在 log_format 中加入
$ssl_server_name和$host,便于分析探测模式 - 对同一 IP 短期内大量失败握手请求做限速,防暴力枚举 SNI











