1. 服务访问异常排障:当Ping通但服务不可用时的深度解析
在Linux网络故障排查中,最令人困惑的场景之一就是:你能ping通远程主机,但关键的HTTP(80)、SSH(22)等服务却无法访问。这种情况通常意味着问题出在传输层(TCP/UDP)或应用层,而非底层的网络连通性。作为一名运维老兵,我处理过数百次这类问题,今天就把最实用的排查方法分享给大家。
1.1 核心排查工具:tcpdump的实战应用
tcpdump是Linux网络排查的瑞士军刀,但很多新手面对其复杂的输出望而却步。其实只要掌握几个关键场景的命令组合,就能快速定位问题:
bash复制# 基础抓包命令模板
tcpdump -nn -i [网卡名] [过滤条件]
这里的-nn表示不解析主机名和端口名(直接显示IP和端口号),-i指定监听的网卡(如ens33、eth0等)。过滤条件是我们排查不同问题的关键。
注意:执行tcpdump需要root权限,普通用户请使用sudo。如果不知道网卡名,可以用
ip a或ifconfig查看。
1.2 四大典型场景的针对性抓包策略
场景一:访问特定IP的所有服务都失败
bash复制tcpdump -nn -i ens33 host 10.0.0.12
这个命令会捕获所有与10.0.0.12的通信。关键要看TCP三次握手是否完成:
-
如果客户端发出了SYN包,但服务器没有回复SYN+ACK:
- 可能是服务器防火墙拦截了连接
- 也可能是目标服务根本没有启动
-
如果服务器回复了RST包:
- 这明确表示目标端口没有监听服务
- 需要检查服务是否启动,或者是否监听在正确端口
场景二:特定端口服务无法访问(如HTTP 80)
bash复制tcpdump -nn -i ens33 port 80
这个过滤条件只看80端口的流量。排查要点:
- 请求是否到达了服务器?
- 服务器是否有响应?
- 响应是否被中间设备拦截?
我曾经遇到过一个案例:客户端能发送SYN到服务器,服务器也回复了SYN+ACK,但客户端就是收不到。最后发现是客户端的本地防火墙静默丢弃了入站包。
