Nginx 443端口外部访问异常:内部正常外部无法连接
Nginx 443端口外部HTTPS访问失败问题排查与解决
问题核心分析
外部HTTPS访问域名时出现error:1400410B:SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number,但外部用HTTP直接访问443端口、内部HTTPS访问均正常——说明外部流量到达服务器443端口时,接收到的是纯HTTP响应而非TLS握手响应,问题出在外部流量路径或服务器监听配置上,而非Nginx本地SSL配置。
排查与修复步骤
1. 检查DigitalOcean云防火墙规则
服务器本地ufw放行端口不代表DigitalOcean云防火墙也放行:
- 登录DigitalOcean控制台,进入目标Droplet的「Networking」标签页
- 查看Cloud Firewall的入站规则,确保存在允许
HTTPS (443)(TCP协议,来源0.0.0.0/0和::/0)的规则 - 若缺失,添加规则并等待5-10分钟生效
2. 修正Nginx监听地址
默认listen 443 ssl;仅监听IPv4,若服务器启用IPv6且DNS解析包含IPv6地址,会导致外部IPv6流量异常:
- 修改Nginx的443服务器块配置:
server { listen 443 ssl; listen [::]:443 ssl; # 新增IPv6监听 server_name [my_domain].com www.[my_domain].com; # 其余SSL、代理配置不变 } - 重新加载配置:
sudo nginx -s reload - 验证监听状态:
ss -tulnp | grep 443,确认输出包含0.0.0.0:443和[::]:443
3. 排查端口占用情况
确保443端口仅被Nginx监听:
- 执行命令:
lsof -i :443或ss -tulnp | grep 443 - 若输出显示非
nginx的进程占用443,停止该进程并重启Nginx:sudo systemctl restart nginx
4. 清理iptables隐性规则
即使ufw显示规则正确,可能存在遗留iptables规则干扰:
- 重置ufw并重新配置:
sudo ufw reset sudo ufw enable sudo ufw allow 80/tcp sudo ufw allow 443/tcp - 验证规则:
sudo ufw status verbose
5. 检查第三方代理/CDN配置
若域名使用了CDN或第三方反向代理:
- 确认CDN的SSL模式为「全加密(Strict)」,确保客户端到CDN、CDN到服务器均使用HTTPS
- 检查代理服务是否错误地将HTTPS流量转发到服务器的HTTP端口
验证方法
完成修复后,从外部执行以下测试:
- 执行
curl -v https://[my_domain].com/api/ping,确认TLS握手正常且返回200 OK - 用
telnet [my_domain].com 443连接后,输入GET /api/ping HTTP/1.1\r\nHost: [my_domain].com\r\n\r\n,若返回HTTPS相关错误(而非纯HTTP响应),说明TLS服务正常
内容的提问来源于stack exchange,提问作者Brik000
相关产品推荐
相关产品推荐

