1. 引言
在网络故障排查、安全分析、协议学习等场景中,tcpdump 和 Wireshark 是黄金搭档。tcpdump 作为命令行抓包利器,轻量高效,常部署在 Linux 服务器上捕获原始流量;Wireshark 则以其强大的图形界面和深度解析能力,在本地工作站上对抓包文件进行可视化分析。
本文将详细讲解如何将两者结合使用,形成一套高效的网络数据包捕获与分析工作流,并重点剖析两个工具的常用过滤语法,助你精准定位网络问题。
2. 工具准备与环境说明
2.1 tcpdump (Linux 服务器端)
-
作用 :在服务器上捕获网络接口上的原始数据包,并保存为
.pcap或.pcapng格式的文件。 -
安装 :大多数 Linux 发行版已预装。若未安装,可使用包管理器安装。
bash# CentOS/RHEL/Fedora sudo yum install tcpdump # 或 sudo dnf install tcpdump # Debian/Ubuntu sudo apt-get install tcpdump -
权限 :抓包通常需要
root权限或CAP_NET_RAW能力。建议使用sudo执行。
2.2 Wireshark (本地分析端)
- 作用:图形化数据包分析工具,支持数百种协议的深度解析、过滤、统计和图形展示。
- 安装 :从 Wireshark 官网 下载对应操作系统的安装包。
- 文件传输 :需要将服务器上 tcpdump 抓取的
.pcap文件传输到本地。常用方法:scp:scp user@server:/path/to/capture.pcap ./rsync、sftp或直接下载(如果服务器有 web 服务)。
3. tcpdump 使用手顺
3.1 基本抓包命令
bash
# 1. 捕获所有经过 eth0 网卡的数据包,显示在屏幕上
sudo tcpdump -i eth0
# 2. 捕获指定数量(如10个)包后自动停止
sudo tcpdump -i eth0 -c 10
# 3. 不将IP地址解析为主机名(-n),不解析端口号为服务名(-nn),提升显示速度
sudo tcpdump -i eth0 -nn
# 4. 将抓包结果保存到文件(-w),供后续分析
sudo tcpdump -i eth0 -w capture.pcap
# 5. 组合使用:不解析、抓100个包、保存文件
sudo tcpdump -i eth0 -nn -c 100 -w capture.pcap
3.2 常用命令行选项
| 选项 | 说明 |
|---|---|
-i <interface> |
指定网络接口,如 eth0, any(所有接口) |
-c <count> |
捕获指定数量的数据包后退出 |
-w <file> |
将原始数据包写入文件(二进制格式) |
-r <file> |
读取之前保存的抓包文件并显示/分析 |
-n |
不进行主机名解析(显示IP地址) |
-nn |
不进行主机名和端口号解析(显示IP和端口数字) |
-v / -vv / -vvv |
增加输出详细程度(更多协议头信息) |
-s <snaplen> |
设置抓取每个数据包的字节数(0表示抓取完整包) |
-A |
以ASCII格式打印每个数据包(查看HTTP文本内容有用) |
-X |
同时以十六进制和ASCII格式打印数据包内容 |
4. tcpdump 过滤语法详解
tcpdump 使用 伯克利包过滤(BPF) 语法,功能强大且灵活。
4.1 基础过滤:按主机、端口、网络
bash
# 抓取与特定主机(IP)相关的所有流量
sudo tcpdump host 192.168.1.100
# 抓取源IP或目的IP为指定主机的流量
sudo tcpdump src host 192.168.1.100
sudo tcpdump dst host 192.168.1.200
# 抓取特定端口的流量(TCP/UDP)
sudo tcpdump port 80
sudo tcpdump port 443
sudo tcpdump portrange 8000-8010
# 抓取源端口或目的端口
sudo tcpdump src port 22
sudo tcpdump dst port 53
# 抓取特定网段的流量
sudo tcpdump net 192.168.1.0/24
sudo tcpdump src net 10.0.0.0/8
4.2 协议与传输层过滤
bash
# 按协议过滤
sudo tcpdump icmp
sudo tcpdump arp
sudo tcpdump tcp
sudo tcpdump udp
# 组合协议与端口
sudo tcpdump tcp port 80
sudo tcpdump udp port 53
4.3 高级过滤:按标志位、数据内容
bash
# TCP标志位过滤(常用于排查连接问题)
sudo tcpdump 'tcp[tcpflags] & (tcp-syn) != 0' # 只抓SYN包(新建连接)
sudo tcpdump 'tcp[tcpflags] & (tcp-ack) != 0' # 只抓ACK包
sudo tcpdump 'tcp[tcpflags] & (tcp-fin) != 0' # 只抓FIN包(连接关闭)
# 抓取包含特定字符串的数据包(例如HTTP GET请求)
sudo tcpdump -A -s0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' | grep -i "GET"
# 更精确的负载内容匹配(需计算偏移,较复杂,通常用Wireshark更直观)
4.4 逻辑运算符组合
bash
# 与(and 或 &&)
sudo tcpdump host 192.168.1.100 and port 80
# 或(or 或 ||)
sudo tcpdump port 80 or port 443
# 非(not 或 !)
sudo tcpdump not port 22 # 抓取除SSH外的所有流量
# 使用括号分组,控制优先级
sudo tcpdump '(src host 192.168.1.1 and dst port 80) or (dst host 192.168.1.2)'
5. 将抓包文件传输到本地并导入 Wireshark
-
在服务器上使用 tcpdump 抓包并保存:
bashsudo tcpdump -i eth0 -nn -w /tmp/server_capture.pcap # 按 Ctrl+C 停止抓包 -
将文件传输到本地(以 scp 为例):
bash# 在本地终端执行 scp username@your_server_ip:/tmp/server_capture.pcap ./ -
使用 Wireshark 打开文件:
- 启动 Wireshark。
- 点击菜单
File->Open,选择下载的server_capture.pcap文件。
6. Wireshark 使用手顺与过滤语法
Wireshark 的过滤分为两种:
- 捕获过滤器(Capture Filters) :在开始抓包前设置,语法与 tcpdump 的 BPF 语法完全兼容。用于减少抓包数量,减轻负载。
- 显示过滤器(Display Filters):在抓包完成后,对已捕获的数据包进行筛选显示。语法更强大、更易读。
6.1 捕获过滤器(同 tcpdump)
在 Wireshark 开始捕获的界面直接输入。
host 192.168.1.100 and port 80
not arp
src net 192.168.0.0/24
6.2 显示过滤器(核心分析工具)
显示过滤器使用 Wireshark 自有的、更直观的语法。
6.2.1 基础字段过滤
bash
# IP地址
ip.addr == 192.168.1.100
ip.src == 10.0.0.1
ip.dst == 8.8.8.8
# 端口
tcp.port == 80
udp.port == 53
tcp.srcport == 5000
tcp.dstport == 443
# 协议
http
dns
icmp
tcp
udp
6.2.2 协议特定字段过滤
bash
# HTTP
http.request.method == "GET"
http.response.code == 404
http contains "User-Agent: Mozilla"
# DNS
dns.flags.response == 1 # 响应包
dns.qry.name contains "google.com"
# TCP
tcp.flags.syn == 1
tcp.flags.reset == 1
tcp.analysis.retransmission # 重传包
tcp.stream eq 10 # 跟踪特定TCP流(会话)
# ICMP
icmp.type == 8 # Echo request (ping)
icmp.type == 0 # Echo reply
6.2.3 逻辑运算符与比较
bash
# 与、或、非
ip.addr == 192.168.1.100 and tcp.port == 80
http or dns
!(arp or icmp)
# 包含
frame contains "GET /index.html"
http.request.uri contains "login"
# 比较运算符
tcp.len > 1000
http.time > 1
6.2.4 高级技巧:跟踪会话与导出对象
- 跟踪TCP流 :右键数据包 ->
Follow->TCP Stream。Wireshark 会重组该会话的所有数据,并以明文或十六进制显示,对分析 HTTP、SMTP 等协议极其有用。 - 导出对象 :
File->Export Objects->HTTP。可以导出通过 HTTP 传输的文件(如图片、文档)。
7. 实战工作流示例:分析 Web 服务器访问慢
场景 :用户反馈访问 http://your_server 很慢。
-
在服务器上抓取相关流量:
bashsudo tcpdump -i eth0 -nn host 客户端IP and port 80 -w web_slow.pcap -
传输文件到本地,用 Wireshark 打开。
-
应用显示过滤器:
http:只看 HTTP 协议。tcp.analysis.retransmission:查看是否有 TCP 重传(网络不稳定)。http.time > 0.5:筛选响应时间大于 0.5 秒的请求。
-
分析:
- 查看
Statistics->Conversations,检查 TCP 会话是否有大量重传或零窗口。 - 跟踪一个慢请求的 TCP 流 (
Follow TCP Stream),查看服务端响应是否延迟。 - 检查
Statistics->HTTP->Packet Counter,看是否有大量 4xx/5xx 错误。
- 查看
8. 总结与最佳实践
| 阶段 | 工具选择 | 关键动作 |
|---|---|---|
| 捕获 | tcpdump | 1. 使用 -nn 避免解析开销。 2. 使用 -w 保存原始文件。 3. 使用 捕获过滤器 缩小范围,避免抓全流量。 |
| 传输 | scp/rsync |
将 .pcap 文件安全地移到分析环境。 |
| 分析 | Wireshark | 1. 使用 显示过滤器 进行多维筛选。 2. 利用 Follow TCP Stream、Export Objects 等高级功能。 3. 查看 Statistics 菜单进行整体分析。 |
| 过滤语法 | 牢记区别 | tcpdump (BPF) :用于捕获时过滤。 Wireshark 显示过滤:用于捕获后分析,更强大易用。 |
常用过滤速查:
- 找问题连接 :
tcp.flags.reset == 1或tcp.analysis.retransmission - 看特定会话 :
tcp.stream eq <编号>或ip.addr==x.x.x.x and ip.addr==y.y.y.y - 抓取关键协议 :在服务器上用
tcpdump port 80 or port 443,在 Wireshark 中用http or ssl
掌握 tcpdump 和 Wireshark 的过滤语法,能让你从海量网络数据中迅速定位关键信息,是网络工程师和开发者的必备技能。