TCP 拨测失败别急着判断端口不通,先看失败原因:网络不可达、节点无权限、超时
对某个端口做 TCP 拨测,结果大面积失败、统一报 TCP_CONNECT_FAILED,是不是就能断定「这个端口没开」?不能。TCP_CONNECT_FAILED 只是一个笼统的失败 code,它下面还藏着多种不同的底层原因——网络不可达、节点无权限、连接超时、无法分配地址、无路由、连接被拒绝等,每种指向的问题都不一样。
下面用对 www.bt.cn:6379(Redis 数据库端口)的一次真实 TCP 拨测,拆开看失败原因到底有哪几种、分别该怎么读。选 6379 做样本,是因为这个端口默认不对公网开放,一次运行就能把几乎所有失败原因类型都暴露出来,最适合当教材。
先看结果:352 个失败节点,报出 8 种不同的失败原因
本次对 www.bt.cn:6379 的 TCP 拨测(2026-10-03,北京时间),请求 500 个节点、选中 359 个、成功 7 个、失败 352 个(成功率 1.9%)。失败的 352 个节点,从失败 code 看只有两类:TCP_CONNECT_FAILED(351 个)和 TCP_TARGET_INVALID(1 个)。但把每个失败节点底层报的错误文案(message_v1)归一下类,能得到 8 种不同的失败原因:
| 失败原因(message_v1 归类) | 节点数 |
|---|---|
| network is unreachable(网络不可达) | 148 |
| i/o timeout(连接超时) | 96 |
| permission denied(节点无权限) | 92 |
| cannot assign requested address(无法分配地址) | 11 |
| no route to host(无路由) | 2 |
| connection refused(连接被拒绝) | 1 |
| address family not supported(地址族不支持) | 1 |
| lookup i/o timeout(域名解析超时,计为 TCP_TARGET_INVALID) | 1 |
也就是说,同样是「失败」,绝大多数节点的失败原因其实是**网络不可达(148)、连接超时(96)、节点无权限(92)**这三类,只有 1 个节点是明确的「连接被拒绝」——真正的「端口没开、目标拒绝连接」,反而只占极少数。
三类主因,分别指向什么问题
network is unreachable:节点到目标没有可达路由
148 个节点报 network is unreachable,是所有失败原因里最多的一类。它的意思是:检测节点所在的网络,到目标 IP 之间根本没有可用的路由,连接请求在发出之前就被本机或上游路由判定为「到不了」。
值得留意的是,本次失败的节点几乎都是走 IPv6 发起连接的(dial tcp6 …),而 www.bt.cn 同时有 IPv6 地址。当一个节点所在网络没有可用的 IPv6 路由时,就会报 network is unreachable。这类失败指向的是节点网络侧的问题,而不是目标端口本身。
i/o timeout:请求发出去了,但收不到回应
96 个节点报 i/o timeout。和 network is unreachable 不同,i/o timeout 说明连接请求已经发出去了,但等不到回应。常见有两种情况:一是目标端口上确实没有服务在监听,发出去的包无人应答;二是防火墙把连接请求静默丢弃(DROP),既不回应也不拒绝。要区分这两种,得结合目标服务器上的监听和防火墙设置来看。
permission denied:节点没有权限发起连接
92 个节点报 permission denied。这是检测节点所在的网络对该目标有访问限制——比如某些专线、云服务器节点被策略限制,不允许向该目标发起连接。它代表的是节点侧的权限问题,同样不是目标服务器主动拒绝。
少见的几种,各有各的含义
除了三类主因,还有几种出现次数很少的失败原因,一次拨测里可能只出现个位数节点:
- cannot assign requested address(11 个):检测节点本地无法分配请求地址,属于节点本机资源或配置问题。
- no route to host(2 个):节点到目标主机无路由,和 network is unreachable 类似,但更具体地指向「主机」这一层。
- connection refused(1 个):目标端口明确返回「拒绝」,这才是最接近「端口没监听」的信号——本次只有 1 个节点报这个。
- address family not supported(1 个):节点不支持目标使用的地址族(如节点网络不支持 IPv6)。
另一个失败 code:TCP_TARGET_INVALID 是解析问题
失败的 352 个节点里,有 1 个的失败 code 是 TCP_TARGET_INVALID,报错文案是 lookup www.bt.cn: i/o timeout——这是域名解析超时,不是连接失败。它说明该节点在发起连接前,解析域名这一步就卡住了。这类失败和上面 TCP_CONNECT_FAILED 里的各种原因是完全不同的问题,别混为一谈。
怎么读自己的 TCP 拨测失败原因
- 先看失败原因分布:把失败节点的底层错误文案归类,看哪一类最多,是网络不可达、超时还是无权限。
- 再结合节点分布看:成功节点和失败节点分别落在哪些地区、运营商,判断是目标服务器的问题,还是某些节点网络本身的问题。
- 最后回到目标服务器核实:端口到底有没有监听、防火墙怎么配的,要以目标服务器上的实际情况为准,拨测结果只是从外部节点视角给线索。
关于 TCP 测速的目标格式(主机 + 端口)和四种拨测方式的区别,可参阅官方文档《进行一次拨测并查看结果》。如果端口确实没对公网开放、但本机或内网能连上,那「大面积失败」反而是正常的安全配置,可参阅《数据库端口 3306 为什么公网拨测大面积失败?这是安全配置,不是故障》。
信息来源
本文事实以宝塔官方文档《进行一次拨测并查看结果》为准;文中拨测数据为对 www.bt.cn:6379 的真实 TCP 拨测结果,采集于 2026-10-03(北京时间),失败原因分布与节点数均来自本次拨测结果数据,拨测结果会随时间和网络状况变化,以上数值仅代表采集时刻的情况。
常见问题
TCP 拨测报 TCP_CONNECT_FAILED,是不是说明端口一定没开?
不一定。TCP_CONNECT_FAILED 只是一个笼统的失败 code,它下面还藏着多种不同的底层原因,比如 network is unreachable(网络不可达)、permission denied(节点无权限)、i/o timeout(连接超时)等。要先看失败原因的明细,再判断是端口没开、防火墙拦截,还是节点所在网络本身到不了目标。
network is unreachable 和 i/o timeout 有什么区别?
network is unreachable 指节点所在网络到目标 IP 之间没有可达路由,往往连数据包都发不出去;i/o timeout 是连接请求发出去了、但迟迟收不到回应,常见于端口没监听或防火墙把连接静默丢弃。两者指向的问题不同。
permission denied 是什么原因?
permission denied 表示检测节点没有权限发起这次连接,通常是节点所在网络(如某些专线、云服务器节点)对该目标有访问限制,不是目标服务器主动拒绝。
同一个目标,为什么不同节点报的失败原因不一样?
因为各节点所在的网络环境不同。有的节点网络到目标没有 IPv6 路由、有的节点被策略限制、有的能发出请求但收不到回应,所以同一目标在不同节点会报出不同的失败原因。单个节点的失败原因不能代表全局。
怎么用失败原因定位问题?
先看失败原因的分布,找占比最高的那一类;再结合成功节点和失败节点分别落在哪些地区、运营商,判断是目标服务器的问题还是节点网络的问题。端口监听和防火墙设置要以目标服务器上的实际情况为准。