Linux 网络排查入门:ping、curl、ss 与端口占用定位
Linux 网络排查入门:ping、curl、ss 与端口占用定位
服务突然访问不了,是服务器运维里最常见的故障之一。页面打不开、接口连不上、SSH 连不上,原因可能出在很多环节:本机网络、域名解析、服务没启动、端口被占用、防火墙拦住了。排查网络问题最忌讳上来就重启服务或者乱改配置,正确的做法是按链路一层一层缩小范围:先确认网络通不通,再确认服务在不在,最后确认端口和防火墙。本文介绍排查时最常用的四个工具:ping、curl、ss 和 lsof。
一、ping:先确认网络通不通
ping 是最基础的连通性测试,它向目标发 ICMP 回显请求,看对方回不回:
ping -c 4 example.com
-c 4 表示只发 4 个包就停,不加它会一直发下去。输出里重点看两点:有没有收到回复,以及往返时间大概是多少。能收到回复,说明本机到目标的网络基本是通的;全部丢包,则可能是目标关机、网络不通,也可能是对方禁了 ICMP——很多云服务器默认禁 ping,ping 不通不等于服务挂了,这一点要先记住。
排查时通常按顺序 ping 三个目标:先 ping 网关或者一个公认的地址确认本机出网正常,再 ping 自己的服务器 IP,最后 ping 域名。如果 IP 能 ping 通、域名 ping 不通,问题大概率出在 DNS 解析上,这时可以用 cat /etc/resolv.conf 看 DNS 配置,或者换一个公共 DNS 试试。如果连网关都 ping 不通,先检查本机网络和安全组出方向规则,不要急着动服务器上的配置。
二、curl:服务在不在,用它直接问
ping 通只说明网络层没问题,不代表服务在跑。curl 是直接向服务发 HTTP 请求的工具,能告诉你服务有没有响应、响应是什么:
curl -I https://example.com
-I 只取响应头,适合快速确认服务是否存活。返回 200 OK 说明服务正常;返回 502、503 往往是后端服务没起来或者反向代理配错了;Connection refused 说明目标端口上根本没有程序在监听;Connection timed out 则可能是防火墙拦住了,或者服务绑的地址不对。
需要看完整响应体时去掉 -I,加上 -v 可以看到请求和响应的完整细节,包括 DNS 解析用的哪个地址、TLS 握手是否成功:
curl -v https://example.com
排查本地服务时,直接对本机地址测一次,再对外网地址测一次,对比结果很有用。本机 curl http://127.0.0.1:8080 能通、外网访问不通,问题往往在监听地址或者防火墙上;本机也通不了,那服务本身多半就没起来,先去看服务日志。
三、ss:端口到底被谁占了
服务起不来,报错里经常写着 Address already in use,意思是端口已经被别的程序占了。这时用 ss 查监听状态:
ss -tlnp
这几个选项的意思是:-t 只看 TCP,-l 只看正在监听的,-n 显示数字端口不反查域名,-p 显示占用端口的进程。输出里 0.0.0.0:8080 表示监听所有网卡地址,外网能访问;127.0.0.1:8080 表示只监听本机回环地址,外网访问不到——很多“本地能访问、外网打不开”的问题就是监听地址写错了。
查某个具体端口有没有被占用,可以这样:
ss -tlnp | grep 8080
没有输出,说明这个端口上没有程序在监听,服务可能根本没启动成功,或者配置文件里写的端口不是 8080。有输出但进程不是预期的那个,说明端口被别的程序抢了,要么停掉抢占的程序,要么改自己服务的端口。
ss 的老搭档是 netstat,用法类似,但新系统上 ss 更快、输出更干净,优先用 ss 就够了。
四、lsof:反过来查,某个进程开了哪些端口
ss 是按端口找进程,lsof 可以反过来按进程找端口,也可以查某个文件被谁打开了:
lsof -i :8080
这条命令列出占用 8080 端口的进程,和 ss -tlnp | grep 8080 的作用类似。按进程名查则用:
lsof -i -P -n | grep nginx
它会列出 nginx 打开的所有网络连接。服务日志里写着“启动成功”,但端口查不到监听,多半是服务启动后又立刻退出了,这时不要只看启动命令的回显,一定要回头看服务的日志文件或者 systemctl status 服务名 的输出。
五、一个实用的排查顺序
把上面四个工具串起来,遇到“服务访问不了”可以按这个顺序走:
第一步,ping 目标 IP。 通,说明网络层没问题,往下走;不通,先看是本机出网问题、DNS 问题,还是对方禁了 ICMP,不要直接下结论。
第二步,curl 目标地址。 Connection refused 去查 ss 看端口有没有监听;Connection timed out 去查防火墙和安全组;返回 502、503 去查反向代理和后端服务日志。
第三步,ss 查监听。 确认服务是不是真的在监听预期的端口、监听地址是 0.0.0.0 还是 127.0.0.1。端口没监听,先看服务状态和日志;端口被别的进程占了,先处理冲突。
第四步,看日志定结论。 前面三步只是定位到哪一层,真正的原因几乎都在日志里:配置文件写错、依赖的数据库连不上、磁盘满了导致服务起不来。工具帮你缩小范围,日志告诉你答案。
小结
ping测网络通不通,但对方禁 ICMP 时 ping 不通不等于服务挂了。curl直接问服务有没有响应,-I看状态码、-v看完整握手细节。ss -tlnp查端口被谁监听,监听地址是0.0.0.0还是127.0.0.1决定外网能不能访问。lsof -i :端口反查占用端口的进程,配合服务日志确认服务到底起没起来。- 排查按“网络—服务—端口—日志”的顺序走,先缩小范围再动手改配置,别一上来就重启。
网络排查没有捷径,靠的就是一层一层排除。把 ping、curl、ss、lsof 这四个命令的输出读明白,大多数“访问不了”的问题都能在改配置之前找到真正的环节。
- 点赞
- 收藏
- 关注作者
评论(0)