TCP 端口不通?telnet 通了也不代表服务正常
排查服务连不上,很多人第一步就是 telnet。通了就放心了,然后继续在应用日志里翻半天。
问题是,telnet 通只证明了一件事:三次握手成功。
TCP 通不等于服务好
握手是内核完成的,只要端口在监听、防火墙放行,内核就回 SYN-ACK,跟后面的程序有没有卡死没关系。
所以会出现:telnet 秒通,HTTP 请求发过去石沉大海。这种情况服务进程可能卡在死循环、连接池耗尽、或者被 accept 队列堵住。
端口检测能分三种结果
连接成功。 端口开着,服务在监听。
连接被拒绝。 收到 RST,端口没开,或者被防火墙 REJECT。
连接超时。 没有任何回应,包被丢弃了,安全组或中间设备的问题。
三种结果对应三条排查路径,比「通/不通」两个状态有用得多。
常见误判
本地 telnet 通、外地不通:监听地址是 127.0.0.1,或者安全组只放行了本机网段。
telnet 通、浏览器打不开:那要看应用层,可能返回 502 或者卡住,跟端口无关。
IPv4 通、IPv6 不通:监听只绑了 IPv4。
排查顺序
先确认服务在听(ss -lntp),再看监听地址是不是 0.0.0.0,然后看安全组和本机防火墙。
这三步走完,再谈应用层。跳过任何一步,都容易在白忙。
一个细节
telnet 在某些系统上默认没装,用 nc -vz IP 端口 或者 curl -v telnet://IP:端口 也一样。看输出里是 refused 还是 timeout,比「通没通」信息量大。
多地区测同一个端口,用 TCP 测速,能直接看出是全局不通还是只有某些线路不通。