返回博客列表

tcping测试正常但HTTPS访问失败?按DNS、TLS、HTTP和CDN回源逐层排查

CdnChart 技术团队发布于 2026-11-0812 分钟阅读
tcping测试正常但HTTPS访问失败?按DNS、TLS、HTTP和CDN回源逐层排查

服务器上用tcping测试443端口显示正常,浏览器却提示“无法建立安全连接”;或者端口探测没有问题,网站最终返回403、502甚至直接超时。这个现象并不矛盾。

tcping通常只验证TCP连接能否建立。HTTPS还要继续完成TLS握手、证书验证、HTTP请求和响应。如果域名接入了CDN,CDN边缘节点与源站之间还可能存在另一段独立的回源连接。TLS握手属于TCP连接之后的步骤,具体过程可以参考TLS握手流程说明。

所以,排查重点不是继续反复测试443端口,而是找出请求最后成功到达了哪一层:

DNS解析
→ TCP连接
→ TLS握手
→ 证书验证
→ HTTP请求
→ CDN边缘规则
→ CDN回源
→ 源站程序

tcping测试正常,究竟证明了什么?

tcping成功,通常只能说明测试端能够向某个目标IP的443端口发起TCP连接,并收到对方的响应。它可以帮助判断:

  • 目标IP的443端口是否有监听;

  • 当前网络是否完全阻断了TCP连接;

  • 防火墙是否直接丢弃了连接请求;

  • TCP建立连接的大致耗时。

但tcping无法证明下面这些事情:

  • DNS解析到的就是你测试的那个IP;

  • 服务器返回了正确域名对应的证书;

  • TLS版本和加密套件可以协商;

  • 证书没有过期、域名匹配且证书链完整;

  • WAF允许当前客户端访问;

  • CDN能够正常回源;

  • 网站程序可以返回正确页面;

  • 浏览器加载的脚本、接口和图片都能正常访问。

可以把它理解成“楼下大门能打开”,但还没有证明你能通过门禁、进入正确房间并拿到需要的服务。

先用curl判断失败发生在哪一步

不要一开始就修改证书、清缓存或放行防火墙。先用一次真实HTTPS请求记录完整过程。

curl --noproxy '*' -sS -v \
  --connect-timeout 5 \
  --max-time 20 \
  -o /dev/null \
  -w "\ncode=%{http_code}\nremote_ip=%{remote_ip}\nname=%{time_namelookup}\nconnect=%{time_connect}\ntls=%{time_appconnect}\nttfb=%{time_starttransfer}\ntotal=%{time_total}\n" \
  https://www.example.com/

Windows环境可以使用curl.exe。如果不希望绕过系统代理,可以先删除--noproxy '*',再分别记录两种结果。

重点看这几个字段:

  • remote_ip:实际连接的IP。它可能与tcping测试的IP不同。

  • code:最终HTTP状态码。

  • time_connect:TCP连接完成时的累计时间。

  • time_appconnect:TLS或其他安全协议握手完成时的累计时间。

  • time_starttransfer:收到响应首字节前的累计时间。

  • time_total:整个请求完成的累计时间。

这些时间是从请求开始计算的累计值,不能直接把time_appconnect当作纯TLS耗时。想准确理解字段定义,可以查看curl官方计时参数说明。

结果可以先这样分:

curl结果

优先检查方向

DNS解析失败

域名、DNS服务器、代理或本地解析

TCP连接失败

路由、防火墙、端口监听、地址族

TCP成功但TLS失败

SNI、证书、TLS版本、加密套件

TLS成功但返回403或429

WAF、访问控制、频率限制

TLS成功但返回502或504

CDN回源、负载均衡、源站

http_code=000

没有拿到HTTP响应,结合错误日志判断失败阶段

curl返回200但浏览器打不开

浏览器、代理、缓存或页面二次请求

http_code=000不是服务器返回了一个名为“000”的状态码,而是curl没有取得有效的HTTP响应。此时应回到详细日志中,确认失败发生在连接、TLS还是读取响应阶段。

先核对DNS:tcping测试的IP是不是HTTPS实际使用的IP?

很多排查在第一步就出现偏差:tcping是手动测试某个IP,而浏览器访问域名时却解析到了另一个地址。

先查看域名的CNAME、IPv4和IPv6记录:

dig +short CNAME www.example.com
dig +short A www.example.com
dig +short AAAA www.example.com

如果没有dig,也可以使用:

nslookup -type=A www.example.com
nslookup -type=AAAA www.example.com

需要重点确认:

  1. 域名是否同时存在A和AAAA记录;

  2. tcping测试的IP是否仍在DNS返回列表中;

  3. 不同DNS服务器是否返回不同结果;

  4. 是否只有某个CDN节点或某个地址失效;

  5. HTTPS访问是否经过代理,而tcping没有经过代理。

继续分别测试IPv4和IPv6:

curl --noproxy '*' -4 -v --connect-timeout 5 --max-time 20 -o /dev/null https://www.example.com/
curl --noproxy '*' -6 -v --connect-timeout 5 --max-time 20 -o /dev/null https://www.example.com/

如果IPv4成功、IPv6失败,排查重点应转向AAAA记录、IPv6路由、IPv6监听、IPv6防火墙和CDN的IPv6入口。不能因为一台电脑没有IPv6网络就直接判断网站的IPv6配置一定错误。

相反,如果tcping测试的是IPv4,但浏览器优先选择了IPv6,那么“tcping正常、浏览器失败”其实是在比较两条不同的网络路径。

TCP连通后,TLS握手还要检查什么?

HTTPS最容易被忽略的部分是SNI。一个IP地址可能承载多个HTTPS域名,客户端需要在TLS握手时告诉服务器自己要访问哪个域名,服务器才能选择对应证书。

可以使用OpenSSL测试:

openssl s_client \
  -connect www.example.com:443 \
  -servername www.example.com \
  -verify_hostname www.example.com \
  -verify_return_error \
  </dev/null

重点查看:

  • 服务器返回的证书主题和SAN是否包含www.example.com;

  • Verify return code是否为0;

  • 证书的有效期是否正常;

  • 服务器是否发送了必要的中间证书;

  • 实际协商的TLS版本和加密套件;

  • 是否出现handshake failure、certificate verify failed或unrecognized name。

各参数的具体行为可以结合OpenSSL s_client证书调试参数核对。

常见故障包括:

证书域名不匹配

例如访问的是www.example.com,但边缘节点返回的证书只包含api.example.com。TCP当然可以连接,但浏览器会在证书验证阶段拦截。

证书链不完整

部分客户端可能因为本地缓存过中间证书而暂时访问正常,另一台设备却提示证书不受信任。服务器端应发送完整的必要证书链,不能只依赖用户设备碰巧缓存过证书。

SNI配置错误

如果多个域名共用一个IP,而CDN、负载均衡或源站没有正确识别SNI,服务器可能返回默认站点证书,或者直接拒绝握手。

TLS版本或加密套件不兼容

可以在确实需要定位协议差异时分别测试:

curl --noproxy '*' -v \
  --tlsv1.2 --tls-max 1.2 \
  --connect-timeout 5 --max-time 20 \
  -o /dev/null https://www.example.com/

curl --noproxy '*' -v \
  --tlsv1.3 --tls-max 1.3 \
  --connect-timeout 5 --max-time 20 \
  -o /dev/null https://www.example.com/

这类测试用于定位兼容性问题,不代表应该把服务器长期改成更低的TLS版本。也不要把curl -k当成正式修复方案。它只是跳过证书验证,最多用于确认“绕过验证后是否能继续发出HTTP请求”。

如果已经返回HTTP状态码,就不要再叫“443不通”

只要curl完成TLS并收到了HTTP状态码,说明这一次请求至少已经通过了DNS、TCP和TLS中的主要环节。接下来要分析的是请求为什么被拒绝或为什么没有得到正确内容。

建议使用GET请求读取响应头,而不是只用HEAD请求:

curl --noproxy '*' -sS \
  -D - \
  -o /dev/null \
  --connect-timeout 5 \
  --max-time 20 \
  https://www.example.com/

部分Web服务器对HEAD和GET的处理逻辑不同,HEAD返回正常并不能完全代表浏览器GET请求正常。

常见状态可以这样理解:

  • 200:当前URL的HTTP请求成功,但不代表页面依赖的接口和静态资源全部正常。

  • 301或302:检查Location跳转到了哪个域名、端口和协议。

  • 403:通常需要检查WAF、访问控制、防盗链、地域规则或请求特征。

  • 429:重点看频率限制、客户端IP信誉和请求是否集中经过同一个出口。

  • 500:更接近源站应用或上游程序错误。

  • 502或504:需要检查网关、负载均衡、CDN回源和源站响应。

  • 525、526等厂商专用代码:必须结合具体CDN厂商的错误定义,不要把某一家CDN的代码解释套用到所有平台。

可以通过HTTP状态码分类说明了解状态码的标准分类,但状态码本身通常不能告诉你错误一定由CDN还是源站生成。

还要检查重定向链:

curl --noproxy '*' -sS \
  -D - \
  -o /dev/null \
  --connect-timeout 5 \
  --max-time 20 \
  https://www.example.com/

如果响应中出现Location,继续测试目标地址。入口域名可能已经正常,但它跳转到的登录域名、静态资源域名或API域名仍然存在TLS问题。

接入CDN后,必须单独检查回源HTTPS

访问者到CDN边缘节点是一段连接,CDN到源站是另一段连接。前端的tcping只能证明访问者到边缘节点的TCP连接成功,不能证明CDN回源成功。

如果有授权并且知道源站测试IP,可以使用curl --resolve:

curl --noproxy '*' \
  --resolve www.example.com:443:203.0.113.10 \
  -sS -v \
  --connect-timeout 5 \
  --max-time 20 \
  -o /dev/null \
  -w "\ncode=%{http_code}\nremote_ip=%{remote_ip}\ntotal=%{time_total}\n" \
  https://www.example.com/

这里的关键不是直接访问:

https://203.0.113.10/

而是仍然使用:

https://www.example.com/

--resolve只把域名临时指向指定IP,因此可以保留正确的HTTP Host和TLS SNI。这种方式比直接用HTTPS访问源站IP更适合测试多站点源站。

源站测试需要根据实际配置核对:

  • CDN回源协议是HTTP还是HTTPS;

  • 回源端口是否正确;

  • 回源SNI使用哪个域名;

  • 回源Host是否被改写;

  • 源站证书是否匹配回源域名;

  • 源站防火墙是否允许CDN回源地址;

  • 负载均衡健康检查是否使用正确的协议和路径;

  • 源站是否要求特定请求头、客户端证书或认证信息。

如果源站只允许CDN回源,外部直连失败可能是正常的安全策略。此时应使用CDN厂商提供的回源日志、健康检查和边缘诊断信息,不要为了排查临时关闭防火墙或长期放开源站。

判断逻辑可以简单归纳为:

公网访问

授权源站测试

更值得优先检查

边缘TLS失败

源站正常

CDN边缘证书、SNI、域名绑定

边缘返回403

源站正常

WAF、边缘规则、访问控制

边缘返回502/504

源站也失败

源站监听、回源协议、负载均衡

边缘返回502/504

源站正常

CDN回源Host、SNI、端口和证书校验

只有部分节点失败

源站正常

DNS调度、节点配置、运营商路径和地址族

这不是绝对结论,但比看到一个502后直接清理缓存更有效。

CDNChart的排查方法:先看失败分布,再看平均耗时

CDN故障排查中,一个节点的tcping结果信息量很有限。更有价值的问题是:

  • 是所有地区都失败,还是只有某个地区失败?

  • 是三家运营商都失败,还是只有移动或联通异常?

  • 失败节点拿到的是同一个响应IP,还是多个IP中的一部分?

  • 失败发生在连接阶段,还是已经拿到403、502等HTTP状态码?

  • 同一个域名的首页失败,还是只有某个API路径失败?

CDNChart更建议先做“失败分布判断”,再做具体配置排查。可以使用CDNChart网站测速工具,观察不同测试节点的地区、运营商、响应IP、HTTP状态码、连接时间、总耗时和失败节点,而不是只盯着一个平均速度。

可以按下面的方式缩小范围:

观察结果

初步判断

下一步

所有节点都无法完成TLS

边缘证书、SNI或TLS配置

用OpenSSL和curl核对证书及握手

所有节点都返回403或429

边缘访问规则或WAF

对照请求频率、地域和客户端特征

所有节点都返回502或504

回源链路或源站

用--resolve测试源站Host和SNI

只有一个地区失败

区域调度、节点或线路

对比响应IP、运营商和IPv4/IPv6

只有一个运营商失败

运营商路径或策略

从同运营商环境补测DNS、TCP和TLS

节点显示200,但浏览器打不开

客户端或页面二次请求

检查浏览器网络面板、代理和接口请求

如果响应IP、CNAME和证书信息不一致,可以继续使用CDN检测工具核对公开的CNAME、响应IP、ASN、响应头和TLS证书等证据。这里的重点是“证据组合”,不能只凭一个响应头就断定CDN厂商,也不能因为没有识别结果就认定域名没有使用CDN。

这也是CDNChart与单次端口探测的区别:端口探测回答“某个地址的某个端口能不能连”,多节点测速和CDN检测则帮助回答“问题是不是集中在某个地区、运营商、响应IP或服务链路”。

每次只改变一个变量,测试结果才有比较价值

排查时最容易犯的错误,是同时改DNS、证书、WAF和源站配置,然后发现网站恢复,却不知道真正原因是什么。

更稳妥的做法是固定:

  • 完整URL和请求路径;

  • 查询参数;

  • Host和SNI;

  • 测试客户端;

  • 测试时间;

  • 是否经过代理;

  • IPv4或IPv6地址族;

  • 是否跟随跳转。

然后每次只改变一个变量。例如:

  1. 先测试正常域名,记录实际响应IP和状态码;

  2. 再使用curl -4和curl -6比较地址族;

  3. 再用OpenSSL检查同一域名的证书和SNI;

  4. 再用--resolve固定到授权源站IP;

  5. 最后用多地区节点确认问题是否仍集中在某个网络。

CDNChart的测试方法更适合用来理解统一测试口径、样本对照和指标边界。它不能替代源站日志、CDN回源日志或企业内部监控,但可以帮助确定应该把日志范围缩小到哪一组节点、哪个地址或哪个时间段。

修复后也要重复原来的测试矩阵。至少确认:

  • 原来失败的IPv4或IPv6路径已经恢复;

  • TLS证书、SNI和证书链验证正常;

  • 预期URL返回正确的2xx或3xx;

  • 失败节点不再集中出现;

  • CDN回源日志中没有新的握手或超时错误;

  • 页面中的API、脚本和关键业务请求也能完成。

一次首页返回200,只能证明一次首页请求成功,不能替代完整验收。

常见问题

tcping测试正常,但curl显示TLS握手失败,问题在哪里?

优先检查证书、SNI、TLS版本、加密套件、客户端时间和代理。tcping只完成TCP层连接,TLS失败说明请求还没有进入正常的HTTP处理阶段。

加上curl -k之后可以访问,是否说明网站已经恢复?

不是。-k会跳过证书验证。它可以帮助判断问题是否与证书有关,但正式修复仍应处理证书域名、有效期、证书链或客户端信任问题。

curl返回200,浏览器为什么还是打不开?

浏览器可能还会请求API、脚本、图片、字体和第三方资源。也可能存在代理、浏览器扩展、缓存、HSTS、混合内容或Cookie策略问题。应在浏览器网络面板中找出真正失败的请求,而不是只看首页curl结果。

直接访问源站IP可以测试HTTPS吗?

不建议直接使用https://203.0.113.10/判断源站HTTPS。这样可能导致Host和SNI不正确。应在获得授权后使用curl --resolve,让连接指向指定IP,同时保留真实域名。

IPv4正常、IPv6失败,能不能直接删除AAAA记录?

不能直接这么处理。应先确认IPv6监听、路由、防火墙、CDN节点和证书配置。删除AAAA记录可能暂时绕过问题,却会让具备IPv6网络的用户失去IPv6访问路径。

CDN边缘节点返回200,为什么源站没有访问日志?

如果请求命中缓存,CDN可能直接返回边缘内容,源站本来就不会收到请求。只有缓存未命中、动态请求或需要回源的请求,才应在源站看到对应记录。

tcping正常能排除HTTP/3问题吗?

不能。HTTP/3基于QUIC,使用UDP传输;TCP端口测试没有覆盖这条路径。需要结合浏览器实际协商协议,或使用支持HTTP/3的客户端进行单独验证。HTTP/3的协议定义可以参考HTTP/3规范说明。

  • 443端口通但HTTPS打不开
  • TLS握手失败
  • SSL证书错误
  • SNI配置
  • CDN回源失败
  • IPv6访问异常

相关文章