telnet命令测试端口
排查网络问题时,命令手头没有 nc,测试也懒得装 nmap,端口telnet 其实就能顶一阵。命令它本来是测试用来做远程登录的,但拿它测 TCP 端口通不通,端口意外地顺手。命令命令格式简单到不用记: 先拿一个实际场景说。端口假设有台内网服务器 192.168.1.50,命令跑了 MySQL,测试默认端口 3306。端口你在另一台机器上执行: 如果端口开着,而且 MySQL 在监听,你会看到类似这样的输出: 然后光标卡在那儿,不动了。这不是死机,是 telnet 已经连上,正等着你输入数据。MySQL 不会主动跟你打招呼,所以屏幕就停住了。按 换一种情况。如果端口没开,或者被防火墙拦了,输出会变成: 或者一直停在 还有个小细节。有些 Linux 发行版默认没装 telnet 客户端。Debian/Ubuntu 上 telnet 只能测 TCP,测不了 UDP。像 DNS 的 53 端口,TCP 和 UDP 都监听,但 telnet 只能验证 TCP 那一半。要测 UDP 得换工具,比如 nc -u 或者用 dig 直接查。另外 telnet 不会自动超时退出,连上之后如果对方服务不主动断开,它就一直挂着。脚本里用 telnet 得配合 timeout 命令,不然容易卡死。 这样最多等 3 秒,不管通不通都返回。返回值也能用来判断:0 表示连接成功,非 0 就是失败。写 shell 脚本的时候挺方便。 有人觉得 telnet 太老,明文传输不安全,测端口用 nc 更干净。确实,nc 输出更简洁,还能指定超时。但 telnet 胜在几乎无处不在,尤其是那些不让装额外软件的生产环境。你 ssh 登上一台跳板机,手边只有 telnet,照样能把端口连通性摸清楚。我包里常备一个静态编译的 nc,但真到了客户现场,经常还是先敲 telnet 试试——快,不用传文件,不用改权限。 最后提一个容易踩的坑。telnet 连上之后,如果对方服务会主动发 banner,比如 SMTP 的 25 端口,你会看到类似 测端口这件事,telnet 够用,但别把它当万能。TCP 通不代表服务健康,只代表三次握手成功了。真要确认 MySQL 能不能登录,还得拿客户端连上去跑条 SQL。telnet 只是第一道门禁,门开了,里面什么情况另说。telnet 目标IP 端口号。测试回车之后,端口看它吐什么字,命令基本就能判断端口状态。测试telnet 192.168.1.50 3306Trying 192.168.1.50... Connected to 192.168.1.50. Escape character is '^]'.Ctrl+] 再输入 quit 就能退出。这个“卡住”的状态,恰恰说明端口是通的。Trying 192.168.1.50... telnet: Unable to connect to remote host: Connection refusedTrying... 不动,过很久才报 Connection timed out。这两个错误有区别。Connection refused 通常意味着目标机器收到了你的 SYN 包,但那个端口没有进程在监听,系统直接回了一个 RST。而 timed out 更常见于防火墙丢包,或者目标 IP 根本不可达。我自己的经验是,内网里 refused 多半是服务没起来,timeout 则要先去查安全组和 iptables。telnet 命令可能不存在,得先 apt install telnet。CentOS 7 之后也移除了,要 yum install telnet。Windows 倒是自带,但默认没启用,得去“启用或关闭 Windows 功能”里勾上 Telnet Client。我见过同事在 Windows 上敲 telnet 报“不是内部或外部命令”,折腾半天以为是网络问题,其实就是功能没开。timeout 3 telnet 192.168.1.50 3306220 mail.example.com ESMTP 的欢迎语。这时候别以为命令出问题了,那是服务正常响应。反过来,如果连 80 端口,连上后什么都不发,直接回车可能返回一个 400 Bad Request,因为 HTTP 服务器在等你发请求。这些行为都说明端口是通的,只是应用层协议不同而已。
-
上一篇
-
下一篇