Nginx配置阻止IP访问与HTTP直连443端口泄露问题问询
问题解决方案
一、阻断http://ip:443的纯HTTP请求
当客户端向443端口发送纯HTTP请求时,你当前的SSL监听server块无法处理这类请求,Nginx会默认返回错误页面。要彻底阻断,需新增一个不启用SSL的443端口默认server块,放在现有SSL server块之前:
# 拦截发往443端口的纯HTTP请求 server { listen 443 default_server; listen [::]:443 default_server; # 直接关闭连接,无任何响应返回 return 444; }
若要对这类请求也应用CDN IP限制,只需将规则引入该块:
server { listen 443 default_server; listen [::]:443 default_server; include nginxconfig/block/access-cdn-ip.conf; return 444; }
此前CDN IP规则未生效,是因为纯HTTP请求走的是无SSL监听路径,而你的规则仅配置在SSL server块中,无法覆盖这类请求。
二、实现类似HAProxy strict-sni的SNI强制验证
HAProxy的strict-sni会在SSL握手阶段,拒绝未发送SNI或SNI无效的请求。Nginx可通过ssl_preread模块结合stream层配置实现相同效果:
- 确保Nginx编译时包含
ngx_http_ssl_preread_module(主流发行版官方包默认自带)。 - 添加stream层配置,在SSL握手前校验SNI:
stream { # 定义允许的域名列表,匹配则标记为1,否则为0 map $ssl_preread_server_name $allowed { your-domain.com 1; sub.your-domain.com 1; default 0; } server { listen 443 ssl reuseport; listen [::]:443 ssl reuseport; ssl_preread on; # SNI不匹配则直接关闭TCP连接 if ($allowed = 0) { return 44; } # 将合法请求转发到本地HTTP服务(可自定义端口) proxy_pass 127.0.0.1:8080; } }
- 修改HTTP层配置,监听本地端口处理转发请求:
http { server { listen 127.0.0.1:8080 ssl; server_name your-domain.com sub.your-domain.com; # 原有SSL配置、业务逻辑、CDN IP限制等 ssl_protocols TLSv1.2 TLSv1.3; ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; include nginxconfig/block/access-cdn-ip.conf; # 其他业务配置... } # 兜底处理未匹配请求 server { listen 127.0.0.1:8080 default_server; return 444; } }
此配置会在SSL握手前就阻断无效SNI请求,不会返回任何Nginx相关标识,完全复刻HAProxy strict-sni的效果。
内容的提问来源于stack exchange,提问作者Xiaoer
相关产品推荐
相关产品推荐

