在Linux系统中使用Wireshark进行抓包是网络分析和故障排查的常用手段,其核心依赖于命令行工具tcpdump与Wireshark图形界面的配合,或直接通过Wireshark的命令行参数实现高效抓包,以下是详细操作指南及关键命令解析。

基础抓包命令
直接使用Wireshark命令行抓包
Wireshark提供了tshark命令行工具,功能与图形界面一致,适合服务器环境或远程操作,基本语法为:
tshark [选项] -i 网卡名 -f 过滤表达式 -w 文件名.pcap
-i:指定监听网卡,可通过ip a或ifconfig查看网卡名称(如eth0、ens33)。-f:设置BPF过滤表达式,仅捕获符合条件的数据包(如tcp port 80过滤HTTP流量)。-w:将抓包结果保存为.pcp文件,便于后续分析。
示例:
监听eth0网卡,捕获目标IP为168.1.100的所有TCP流量并保存为capture.pcap:
tshark -i eth0 -f "tcp and host 192.168.1.100" -w capture.pcap
使用tcpdump配合Wireshark分析
tcpdump是Linux原生抓包工具,轻量级且高效,抓包后可通过Wireshark打开文件进行深度分析,基本命令:
tcpdump [选项] -i 网卡名 -c 抓包数量 -s snaplen -w 文件名.pcap
-c:指定抓包数量,如-c 1000捕获1000个包后自动停止。-s:设置抓包长度(snaplen),默认为65535字节,可缩短为-s 0捕获完整数据包。
示例:
抓取ens33网卡上源或目标端口为22(SSH)的前500个包,保存为ssh_capture.pcap:

tcpdump -i ens33 -c 500 -s 0 "port 22" -w ssh_capture.pcap
抓包完成后,用Wireshark打开文件:
wireshark ssh_capture.pcap
高级过滤与实时分析
常用BPF过滤表达式
| 过滤条件 | 说明 | 示例 |
|---|---|---|
| 协议过滤 | 指定协议(tcp/udp/icmp等) | tcp、udp、icmp |
| 端口过滤 | 指定源/目标端口 | port 80、src port 53 |
| IP地址过滤 | 指定源/目标IP | host 192.168.1.1 |
| 网段过滤 | 指定网段 | net 192.168.1.0/24 |
| 组合过滤 | 逻辑与(and)、或(or)、非(not) | tcp and port 80 and not host 192.168.1.100 |
实时抓包并显示
若需实时查看抓包内容(不保存文件),可使用tcpdump的-v(详细)或-vv(更详细)选项:
tcpdump -i eth0 -vv "tcp port 80" -A # -A以ASCII显示数据包内容
常见问题与优化
- 权限问题:抓包需要root权限,普通用户需使用
sudo执行命令。 - 网卡选择错误:若提示
No such device,检查网卡名称是否正确(虚拟机网卡可能为ens33、eth1等)。 - 性能优化:高流量场景下,可使用
-Q(强制退出模式)或限制抓包长度(-s 96)减少资源占用。
相关问答FAQs
Q1: 如何在抓包时只捕获HTTP请求和响应的完整内容?
A1: 可结合BPF过滤和tshark的-T fields参数提取HTTP层信息,例如捕获HTTP方法、URL和状态码:
tshark -i eth0 -f "tcp port 80" -T fields -e http.request.method -e http.request.uri -e http.response.code
若需保存完整数据包,直接使用-w选项保存后,在Wireshark中通过http协议过滤分析。
Q2: 抓包时出现“packet dropped”提示,如何解决?
A2: 该提示表明网络流量过大,导致缓冲区溢出,解决方案:
- 使用更快的网卡或增加缓冲区大小(
tcpdump -i eth0 -B 65536,-B设置缓冲区单位为KB)。 - 启用
tcpdump的-Q选项减少处理开销,或改用-j(将数据包直接写入文件而不解析)。 - 若使用
tshark,可添加-z io,stat,1每秒统计流量,避免实时显示消耗资源。
