前言
在日常开发中,我们经常遇到服务连不上的情况:
"为什么我的本地代码连不上阿里云的数据库?" "为什么我的API接口调不通,报Connection Refused?"
大多数人的第一反应是打开终端敲一个 ping ip地址。
- 如果
ping通了,就觉得网络没问题,然后陷入迷茫。 - 其实,Ping通了只代表服务器活着(网络层通了),并不代表你的服务端口是通的(传输层/应用层)!
今天我们介绍两个网络排查神器:Telnet(客户端排查)和 Netstat(服务端排查),助你精准定位“路”到底断在哪里。
神器一:Telnet —— 在客户端“敲门”
当你作为客户端(Client),想要确认能不能连上远程服务器的某个特定端口(比如 MySQL 的 3306,或者 Redis 的 6379),ping 是无能为力的,这时候要用 telnet。
(注:Windows和Mac通常自带Telnet,Linux如果没有,可以通过 yum install telnet 安装)
1. 命令语法
Bash
telnet [服务器IP] [端口号]
2. 结果分析(这才是重点!)
情况 A:连接成功如果你看到屏幕变成全黑,或者出现 Escape character is '^]'. 字样,恭喜你,端口是通的!(此时按 Ctrl + ] 然后输入 quit 即可退出)
情况 B:Connection refused(连接被拒绝)
Plaintext
Trying 192.168.1.100... telnet: connect to address 192.168.1.100: Connection refused
诊断: 网络是通的,防火墙也没拦你,但是服务器上的目标端口没开。可能原因: 后端服务挂了(进程没起),或者服务端口配置错了。
情况 C:Connect Timeout(连接超时/一直转圈)
Plaintext
Trying 192.168.1.100... (一直卡在这里不动)
诊断: 请求发出去了,但就像石沉大海。可能原因: 防火墙(安全组)屏蔽了端口,或者中间网络线路不通。这时候你要去检查阿里云安全组或 Firewalld 设置。
神器二:Netstat —— 在服务端“自查”
当你发现 Telnet 连不上(Connection refused)时,你需要登录到服务器内部,确认一下服务到底有没有在监听端口。这时候用 netstat。
1. 命令语法
我们需要查看:TCP协议、Listening(监听中)、Numeric(显示数字端口不显示别名)、Process(显示进程PID)。
Bash
netstat -nltp
2. 结果分析
输出结果通常长这样:
Plaintext
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginx tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 5678/mysqld
关键点看 Local Address:
- 情况 A:
0.0.0.0:80
- 含义: 服务正在监听本机所有网卡的80端口。
- 结论: 外部可以访问(前提是防火墙放行)。
- 情况 B:
127.0.0.1:3306(新手最容易踩的坑!)
- 含义: 服务只监听了本地回环地址。
- 结论: 这个服务只能在服务器内部访问,外网IP无论如何都连不上!
- 解决: 修改服务的配置文件(如
my.cnf或redis.conf),将bind 127.0.0.1改为bind 0.0.0.0。
- 情况 C:查不到该端口
- 结论: 服务压根没启动,或者已经挂了。请先去启动服务。
补充:新一代工具 ss
在一些较新的 Linux 发行版中,netstat 可能默认未安装,取而代之的是性能更强的 ss 命令。用法几乎一样:
Bash
# 查看监听端口 ss -nltp
总结:网络排查三板斧
当你遇到“连不上”的问题时,请按这个顺序排查:
- Ping一下: 确认服务器IP是不是活的。(网络层)
- Telnet一下:
telnet IP 端口,确认是不是防火墙拦了,或者服务没开。(传输层) - Netstat一下: 登录服务器查
netstat -nltp,确认服务是不是只监听了127.0.0.1。(应用层)