Linux 抓包入门:tcpdump 如何定位网络问题?
1. 前言
当ping、curl、ss都不能完全说明问题时,就需要抓包。
抓包可以直接看到网络数据包有没有到达服务器、有没有返回、端口是否正确、连接是否被重置。
Linux 中最常用的命令行抓包工具是:
tcpdump它适合在服务器上快速定位网络问题。
本文重点讲解:
- tcpdump 基本用法;
- 如何按网卡、主机、端口过滤;
- 如何保存 pcap 文件;
- 如何分析 TCP 三次握手;
- 常见网络问题如何用 tcpdump 判断。
2. 安装 tcpdump
Ubuntu / Debian:
sudo apt install tcpdumpCentOS / RHEL:
sudo yum install tcpdump查看版本:
tcpdump --version抓包通常需要 root 权限。
3. 查看网卡
抓包前先查看网卡:
ip addr常见网卡:
eth0 ens33 ens160 lo如果不确定抓哪张网卡,可以使用:
sudo tcpdump -D列出可抓包接口。
4. 基本抓包命令
抓取 eth0 上的数据包:
sudo tcpdump -i eth0抓取并不解析域名和端口名:
sudo tcpdump -i eth0 -nn推荐加-nn,输出更清晰。
限制抓 10 个包:
sudo tcpdump -i eth0 -nn -c 105. 按主机过滤
只抓某个 IP 相关的数据包:
sudo tcpdump -i eth0 -nn host 192.168.1.10只抓源 IP:
sudo tcpdump -i eth0 -nn src host 192.168.1.10只抓目标 IP:
sudo tcpdump -i eth0 -nn dst host 192.168.1.106. 按端口过滤
抓取 80 端口:
sudo tcpdump -i eth0 -nn port 80抓取目标端口 8080:
sudo tcpdump -i eth0 -nn dst port 8080抓取源端口 8080:
sudo tcpdump -i eth0 -nn src port 8080抓取 TCP 80:
sudo tcpdump -i eth0 -nn tcp port 80抓取 UDP 53:
sudo tcpdump -i eth0 -nn udp port 537. 组合过滤条件
抓某个客户端访问本机 8080:
sudo tcpdump -i eth0 -nn host 192.168.1.20 and port 8080抓来自某 IP 且目标端口为 443:
sudo tcpdump -i eth0 -nn src host 192.168.1.20 and dst port 443抓 80 或 443:
sudo tcpdump -i eth0 -nn 'port 80 or port 443'复杂表达式建议加引号,避免被 Shell 解析。
8. 显示包内容
以 ASCII 显示数据内容:
sudo tcpdump -i eth0 -nn -A port 80以十六进制和 ASCII 显示:
sudo tcpdump -i eth0 -nn -X port 80HTTP 明文请求可以看到部分内容。
HTTPS 是加密的,通常看不到明文请求体。
9. 保存抓包文件
保存为 pcap 文件:
sudo tcpdump -i eth0 -nn port 8080 -w capture.pcap之后可以用 Wireshark 打开分析。
读取 pcap 文件:
tcpdump -nn -r capture.pcap抓包文件适合发给其他人协助分析。
10. TCP 三次握手怎么看
TCP 建立连接时会出现三次握手:
SYN SYN, ACK ACK抓 8080 端口:
sudo tcpdump -i eth0 -nn tcp port 8080如果看到:
client > server: Flags [S] server > client: Flags [S.] client > server: Flags [.]说明 TCP 连接建立成功。
Flags 含义:
| 标志 | 含义 |
|---|---|
S | SYN |
. | ACK |
F | FIN |
R | RST |
P | PUSH |
11. 常见问题判断
11.1 服务器收不到包
客户端访问时,服务器抓包:
sudo tcpdump -i eth0 -nn host 客户端IP and port 8080如果完全没有包,说明请求没有到达服务器。
可能原因:
- 客户端没发出;
- 路由不通;
- 云安全组拦截;
- 上游防火墙拦截;
- 抓错网卡。
11.2 服务器收到 SYN,但没有 SYN ACK
如果只看到客户端发 SYN:
client > server: Flags [S]但没有服务器返回 SYN ACK,可能原因:
- 服务没监听端口;
- 本机防火墙丢包;
- 内核没有响应;
- 目标端口不对。
先检查:
ss -lntp | grep ':8080' iptables -L -n firewall-cmd --list-all11.3 服务器返回 RST
如果看到:
server > client: Flags [R.]说明连接被重置。
常见原因:
- 端口没有服务监听;
- 应用主动拒绝;
- 中间设备重置连接;
- 协议不匹配。
11.4 TCP 建立成功,但 HTTP 没响应
能看到三次握手,但 curl 一直等待。
说明网络层通了,问题可能在应用层:
- 应用线程阻塞;
- 后端处理慢;
- 数据库卡住;
- 反向代理超时;
- 应用没有返回响应。
这时继续看应用日志和服务状态。
12. 抓 DNS 请求
DNS 通常使用 UDP 53。
sudo tcpdump -i eth0 -nn udp port 53测试:
nslookup www.baidu.com如果没有 DNS 请求发出,可能是本机解析配置问题。
如果请求发出但没有响应,可能是 DNS 服务器不可达。
13. 抓 ICMP ping 包
抓 ping:
sudo tcpdump -i eth0 -nn icmp另一个终端执行:
ping 目标IP可以看到 ICMP echo request 和 echo reply。
14. tcpdump 常用参数总结
| 参数 | 作用 |
|---|---|
-i | 指定网卡 |
-nn | 不解析域名和端口名 |
-c | 指定抓包数量 |
-w | 保存到文件 |
-r | 读取 pcap 文件 |
-A | ASCII 显示内容 |
-X | 十六进制和 ASCII 显示 |
host | 按主机过滤 |
src | 源地址 |
dst | 目标地址 |
port | 按端口过滤 |
tcp | TCP 协议 |
udp | UDP 协议 |
icmp | ICMP 协议 |
15. 小结
tcpdump 的价值在于:
直接看到数据包有没有到达、有没有返回、返回了什么。常用命令:
sudo tcpdump -i eth0 -nn sudo tcpdump -i eth0 -nn host 192.168.1.10 sudo tcpdump -i eth0 -nn port 8080 sudo tcpdump -i eth0 -nn tcp port 80 sudo tcpdump -i eth0 -nn -w capture.pcap排查网络问题时,可以这样判断:
抓不到包:请求没到服务器 只看到 SYN:服务或防火墙可能有问题 看到 RST:连接被拒绝或重置 握手成功但无响应:应用层问题掌握 tcpdump 后,网络排查就不再只能靠猜。