Linux 网络排查实战:ping、telnet、curl、ss 怎么配合用?

1. 前言

Linux 服务器出现网络问题时,很多人第一反应就是“网络不通”。
但网络不通其实有很多层含义:

  • IP 不通;
  • DNS 解析失败;
  • 端口没开;
  • 服务没启动;
  • 防火墙拦截;
  • 路由不对;
  • HTTP 服务异常;
  • 应用接口报错。

所以排查网络问题不能只靠一个命令。
本文用 pingtelnetcurlss 组合出一套常用排查流程。


2. 网络排查的基本思路

可以按下面顺序排查:


1. ping:检查 IP 层是否可达
2. nslookup/dig:检查 DNS 是否正常
3. telnet/nc:检查 TCP 端口是否能连上
4. ss:检查本机服务是否监听端口
5. curl:检查 HTTP/HTTPS 服务是否正常
6. 防火墙/路由:检查是否被拦截或走错路径

不要一上来就看应用代码。
很多问题其实卡在网络层、端口层或防火墙层。


3. ping:检查主机是否可达

ping 用于测试目标 IP 是否可达。


ping 8.8.8.8

限制发送 4 个包:


ping -c 4 8.8.8.8

测试域名:


ping -c 4 www.baidu.com

如果 IP 能 ping 通,但域名 ping 不通,通常说明 DNS 有问题。

常见结果:


64 bytes from 8.8.8.8: icmp_seq=1 ttl=118 time=20.1 ms

说明网络可达。

如果出现:


Destination Host Unreachable

可能是路由、网关、目标主机不可达。

如果出现:


Request timeout

可能是目标禁 ping、防火墙拦截、链路异常。


4. ping 不通不一定代表服务不可用

很多服务器会禁用 ICMP。
所以 ping 不通,不代表 HTTP、SSH、数据库一定不通。

例如:


ping example.com

失败,但:


curl -I https://example.com

可能成功。

因此,ping 只能说明 ICMP 探测情况,不能完全代表业务端口状态。


5. telnet:检查 TCP 端口

telnet 常用于测试某个 TCP 端口是否能连上。

测试 80 端口:


telnet example.com 80

测试 SSH 端口:


telnet 192.168.1.10 22

如果连接成功,通常会看到:


Connected to example.com.

如果失败,常见结果:


Connection refused

说明目标主机可达,但端口没有服务监听,或者服务拒绝连接。


Connection timed out

说明可能被防火墙拦截、路由不通,或者目标主机无响应。


6. nc 可以替代 telnet

很多系统默认没有 telnet,可以使用 nc


nc -vz example.com 80

参数说明:

参数 含义
-v 显示详细信息
-z 只扫描端口,不发送数据

示例:


nc -vz 192.168.1.10 3306

用于测试 MySQL 端口是否可达。


7. ss:检查本机监听端口

如果你在服务器本机排查服务,可以用 ss 查看监听端口。

查看 TCP 监听端口:


ss -lntp

参数说明:

参数 含义
-l listening,只看监听
-n 不解析服务名,直接显示数字端口
-t TCP
-p 显示进程信息

示例输出:


LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))

说明 Nginx 正在监听 80 端口。

查看某个端口:


ss -lntp | grep ':80'


8. curl:检查 HTTP 服务

curl 用来测试 HTTP/HTTPS 服务非常方便。

查看响应头:


curl -I http://example.com

查看完整响应:


curl http://example.com

显示详细连接过程:


curl -v http://example.com

测试接口:


curl http://127.0.0.1:8080/health

如果 TCP 端口通,但 curl 返回 500,说明网络层基本通了,问题可能在应用层。


9. 本机服务排查示例

问题:访问服务器 8080 端口失败。

9.1 先看服务是否监听

ss -lntp | grep ':8080'

如果没有输出,说明本机没有进程监听 8080。
需要检查服务是否启动:


systemctl status myapp

或:


ps -ef | grep myapp

9.2 本机 curl 测试

curl -v http://127.0.0.1:8080

如果本机访问失败,优先查应用日志。

9.3 远程端口测试

在另一台机器上:


nc -vz 服务器IP 8080

如果本机 curl 正常,但远程端口不通,重点排查防火墙、安全组、监听地址。


10. 监听 127.0.0.1 和 0.0.0.0 的区别

查看:


ss -lntp

如果看到:


127.0.0.1:8080

说明服务只监听本机回环地址。
外部机器无法访问。

如果看到:


0.0.0.0:8080

说明服务监听所有 IPv4 地址,外部机器可以访问。

很多应用配置中有:


host=127.0.0.1

如果希望外部访问,通常要改成:


host=0.0.0.0


11. DNS 排查

如果访问域名失败,先检查 DNS。


nslookup example.com

或:


dig example.com

查看系统 DNS:


cat /etc/resolv.conf

如果 IP 可以访问,域名不能访问,基本就是 DNS 问题。


12. 常见问题判断

现象 可能原因
ping IP 不通 路由、网关、防火墙、目标不可达
ping IP 通,ping 域名不通 DNS 问题
telnet 端口 refused 服务未启动或端口未监听
telnet 端口 timeout 防火墙、安全组、网络链路问题
ss 看不到端口 本机服务未监听
curl 返回 500 应用层错误
curl 返回 404 路径或路由错误
curl 超时 服务无响应或网络阻塞

13. 推荐排查流程


ping -c 4 目标IP
nslookup 域名
nc -vz 目标IP 端口
ss -lntp | grep 端口
curl -v http://目标IP:端口
systemctl status 服务名
journalctl -u 服务名 -n 100

这套流程可以覆盖大多数 Linux 网络故障。


14. 小结

四个命令可以这样记:


ping:测 IP 通不通
telnet/nc:测 TCP 端口通不通
ss:看本机端口有没有监听
curl:测 HTTP 服务是否正常

实际排查时,要一层一层定位:


网络可达
↓
DNS 正常
↓
端口可达
↓
服务监听
↓
HTTP 正常
↓
应用逻辑正常

这样排查效率会比直接猜问题高很多。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐