测试端口通不通命令
上周帮朋友处理一个线上问题,测试数据库连不上,端口他第一反应是通不通命“网络肯定没问题”。我让他跑一条命令,测试三秒后他闭嘴了。端口端口不通这件事,通不通命猜是测试没用的,得测。端口
最顺手的通不通命是 telnet。用法粗暴:telnet 目标IP 端口。测试比如 telnet 192.168.1.10 3306。端口通的通不通命话,屏幕会卡住或者显示一串乱码,测试那说明TCP三次握手成了。端口不通的通不通命话,通常秒回 Connection refused,或者一直挂在那儿直到超时。注意,很多新系统默认没装telnet客户端,Ubuntu上得 apt install telnet,CentOS是 yum install telnet。别问为什么连不上,先看命令存不存在。
有人嫌telnet太老,喜欢用 nc。命令是 nc -zv 目标IP 端口。加 -z 表示只扫描不发数据,-v 是啰嗦模式。返回 succeeded 就是通,refused 就是不通。nc还能扫一段端口:nc -zv 192.168.1.10 20-80。我见过一个运维在跳板机上用nc测防火墙策略,比telnet利索,因为nc超时时间可以自己定,-w 2 就是两秒断念想。
Windows那边,Test-NetConnection 是PowerShell的亲儿子。命令长一点:Test-NetConnection -ComputerName 10.0.0.5 -Port 443。输出里 TcpTestSucceeded 为True就是通。比telnet强的地方在于,它同时告诉你ping通不通、路由跳数、甚至DNS解析结果。有一次我排查一个只允许特定源IP访问的端口,用这个命令一眼看出TCP失败但ICMP能过,直接锁定是防火墙ACL的问题。
没有nc也没有telnet怎么办?/dev/tcp 是bash内置的,不用装任何东西。echo > /dev/tcp/10.0.0.5/80 没报错就是通,报 Connection refused 就是不通。这招在容器里特别管用,很多精简镜像连bash都没有,那就用 sh 的 /dev/tcp 写法,但注意不是所有sh都支持。我试过在Alpine的默认shell里跑,不行,得换bash。
还有一种情况:端口通了,但服务没起来。比如你telnet 80端口,连接建立,但发HTTP请求没响应。这时候 curl -v telnet://IP:端口 更直观,能看到TCP连接成功但后续交互超时。别把“端口通”和“服务正常”混为一谈。我见过有人测完端口通就拍胸脯说没问题,结果服务进程挂了,端口是内核在listen,照样通,但业务全死。
超时时间要留心。默认telnet可能等几十秒,急性子受不了。用 timeout 3 telnet IP 端口 强制三秒退出,配合 $? 看返回码。0表示连接成功,1表示失败。脚本里这么写最干净:timeout 2 bash -c 'cat < /dev/tcp/10.0.0.5/3306' && echo open || echo closed。别小看这个,批量测几百台机器的时候,比一个个telnet快得多。
防火墙和云安全组是另一个坑。你本地测端口不通,未必是目标机器的问题。中间可能隔着iptables、firewalld、云厂商的ACL。有一次我在阿里云内网测RDS的3306,死活不通,最后发现是安全组没放行我的ECS内网IP。换一台同安全组的机器一测就通。所以测端口不通时,先确认你从哪台机器发起的,路径上每一跳都可能掐断。
最后说一个反直觉的:ping通不代表端口通,ping不通也不代表端口不通。ICMP和TCP是两套逻辑,很多服务器禁ping但端口开放。我见过新手因为ping不通就放弃测端口,白白绕了半小时弯路。记住,测端口就是测TCP,别拿ping当依据。
工具就这些,挑顺手的用。关键就一句:别猜,跑命令。









