Linux tcpdump 抓包实战指南
AI摘要
本文详细介绍了Linux下强大的命令行抓包工具tcpdump的使用方法,包括安装、基本语法、查看网络接口、过滤表达式详解、常用抓包场景、实战排查TCP连接问题、读懂tcpdump输出、配合Wireshark深度分析以及权限说明。通过掌握tcpdump的核心用法,结合Wireshark进行可视化分析,可以应对几乎所有网络层面的问题定位。
Linux tcpdump 抓包实战:从入门到分析
网络问题排查时,抓包是最直接有效的手段。tcpdump 是 Linux 下最强大的命令行抓包工具,本文从安装到实战分析,系统介绍其使用方法。
安装 tcpdump
大多数 Linux 发行版默认已安装,可先检查:
tcpdump --version若未安装,根据发行版执行:
# Debian / Ubuntu
sudo apt install tcpdump
# CentOS / RHEL / Rocky Linux
sudo yum install tcpdump
# 或
sudo dnf install tcpdump
# Alpine
apk add tcpdump基本语法
tcpdump [选项] [过滤表达式]常用选项:
| 选项 | 说明 |
|---|---|
-i <网卡> | 指定监听网卡,any 表示所有网卡 |
-n | 不解析主机名,直接显示 IP |
-nn | 不解析主机名和端口名 |
-v / -vv / -vvv | 详细程度,层层递增 |
-c <数量> | 捕获指定数量的包后退出 |
-w <文件> | 将数据包写入 .pcap 文件 |
-r <文件> | 从 .pcap 文件读取并分析 |
-s <字节> | 捕获每个包的字节数,0 表示完整包 |
-A | 以 ASCII 显示包内容(适合 HTTP) |
-X | 以十六进制 + ASCII 显示包内容 |
-e | 显示链路层头部(MAC 地址) |
-t | 不显示时间戳 |
-l | 行缓冲模式,配合管道使用 |
查看网络接口
在抓包前,先确认本机有哪些网卡:
tcpdump -D
# 或
ip link show输出示例:
1.eth0
2.lo
3.any过滤表达式详解
tcpdump 使用 BPF(Berkeley Packet Filter)语法,灵活强大。
按主机过滤
# 过滤所有与 192.168.1.1 通信的包
tcpdump -i eth0 host 192.168.1.1
# 只看来自某 IP 的包
tcpdump -i eth0 src host 192.168.1.1
# 只看发往某 IP 的包
tcpdump -i eth0 dst host 192.168.1.1按端口过滤
# 过滤 80 端口(HTTP)
tcpdump -i eth0 port 80
# 过滤 443 端口(HTTPS)
tcpdump -i eth0 port 443
# 过滤端口范围
tcpdump -i eth0 portrange 8000-9000
# 过滤来源端口
tcpdump -i eth0 src port 22按协议过滤
tcpdump -i eth0 tcp
tcpdump -i eth0 udp
tcpdump -i eth0 icmp
tcpdump -i eth0 arp逻辑组合
# AND
tcpdump -i eth0 host 192.168.1.1 and port 80
# OR
tcpdump -i eth0 port 80 or port 443
# NOT
tcpdump -i eth0 not port 22
# 复杂组合(用括号分组,需转义或加引号)
tcpdump -i eth0 'host 192.168.1.1 and (port 80 or port 443)'按网段过滤
tcpdump -i eth0 net 192.168.1.0/24常用抓包场景
1. 抓取 HTTP 明文请求
tcpdump -i eth0 -A -nn port 80-A 以 ASCII 输出,可以直接看到 HTTP 请求/响应头和 Body。
2. 抓取 DNS 查询
tcpdump -i eth0 -nn port 533. 抓取与某主机的 TCP 握手
tcpdump -i eth0 -nn 'host 10.0.0.1 and tcp'查看 SYN、SYN-ACK、ACK 三次握手过程。
4. 只抓 ICMP(ping)
tcpdump -i eth0 icmp5. 排除 SSH 避免干扰
远程操作时 SSH 流量会污染抓包结果:
tcpdump -i eth0 -nn not port 226. 保存抓包文件
# 抓 100 个包并保存
tcpdump -i eth0 -nn -c 100 -w /tmp/capture.pcap
# 抓取指定时长(配合 timeout 命令)
timeout 30 tcpdump -i eth0 -nn -w /tmp/capture.pcap
# 按文件大小切割:每 10MB 生成新文件
tcpdump -i eth0 -nn -C 10 -w /tmp/cap.pcap7. 分析已有的 pcap 文件
# 读取并显示
tcpdump -r /tmp/capture.pcap
# 读取时加过滤
tcpdump -r /tmp/capture.pcap port 80
# 详细输出
tcpdump -r /tmp/capture.pcap -nn -vv实战:排查 TCP 连接问题
以访问某服务(如 10.0.0.5:8080)失败为例:
tcpdump -i eth0 -nn 'host 10.0.0.5 and port 8080'常见现象与含义:
| 现象 | 说明 |
|---|---|
| 只有 SYN,没有 SYN-ACK | 服务端未监听该端口,或防火墙拦截 |
| 有 SYN-ACK,但随即 RST | 服务端拒绝连接 |
| 有 ACK,但数据迟迟不来 | 服务端处理慢,可能是性能问题 |
| 出现大量重传(Retransmission) | 网络丢包严重 |
读懂 tcpdump 输出
一行典型输出:
14:23:01.234567 IP 192.168.1.10.52341 > 10.0.0.1.80: Flags [S], seq 1234567890, win 65535, length 0字段解释:
14:23:01.234567— 时间戳(精确到微秒)IP— 网络层协议192.168.1.10.52341— 源 IP:端口10.0.0.1.80— 目标 IP:端口Flags [S]— TCP 标志位seq— 序列号win— 窗口大小length— 数据载荷长度
TCP Flags 对照表:
| 标志 | 含义 |
|---|---|
[S] | SYN(建立连接) |
[S.] | SYN-ACK |
[.] | ACK |
[P.] | PSH+ACK(推送数据) |
[F.] | FIN(正常关闭) |
[R] | RST(强制重置) |
配合 Wireshark 深度分析
命令行查看终究不够直观,生产环境通常的做法是:
- 在服务器上用 tcpdump 将数据包保存为
.pcap文件 - 将文件传输到本地
- 用 Wireshark 打开进行可视化分析
# 服务器端抓包
tcpdump -i eth0 -nn -w /tmp/capture.pcap
# 传输到本地(Mac/Linux)
scp user@server:/tmp/capture.pcap ~/Downloads/Wireshark 有以下实用功能:
- Follow TCP Stream:还原完整 TCP 会话,一键查看完整 HTTP 请求响应
- Statistics → IO Graph:流量图,一眼看出流量波峰
- Expert Info:自动标注重传、乱序、连接拒绝等异常
- 过滤语法:
http.request.method == "POST"等高级过滤
权限说明
tcpdump 默认需要 root 权限,因为需要访问原始套接字:
sudo tcpdump -i eth0如果不想每次都用 sudo,可以将 tcpdump 二进制设置 capabilities:
sudo setcap cap_net_raw,cap_net_admin=eip $(which tcpdump)之后普通用户即可直接运行 tcpdump(注意评估安全风险)。
常用命令速查
# 查看所有网卡
tcpdump -D
# 抓取所有流量(不推荐在繁忙服务器用)
tcpdump -i any -nn
# 抓 HTTP 请求并显示内容
tcpdump -i eth0 -A -nn port 80
# 抓取与某 IP 的通信并保存
tcpdump -i eth0 -nn -w cap.pcap host 10.0.0.1
# 读取 pcap 文件
tcpdump -r cap.pcap -nn -v
# 抓包同时输出到文件和终端
tcpdump -i eth0 -nn -l | tee /tmp/cap.txt小结
tcpdump 是网络排查的瑞士军刀。掌握它的核心用法后,结合 Wireshark 做可视化分析,几乎能应对所有网络层面的问题定位。建议:
- 日常先用
-nn避免 DNS 解析拖慢输出 - 线上抓包务必加
-w保存文件,再离线分析 - 过滤表达式越精确越好,减少无关噪音
- 结合
ss、netstat、ping、traceroute综合判断