4、抓包工具准备:Wireshark安装与配置、tcpdump基础使用、抓包过滤器的编写
工欲善其事,必先利其器。做端口复用诊断,抓包工具就是你的眼睛。我见过不少同行,分析思路很清晰,结果因为工具没配好,抓到的包不全或者被过滤掉了,白白浪费几个小时。这一章咱们就把地基打牢。
说白了,你只需要掌握两样东西:一个图形化的 Wireshark,一个命令行的 tcpdump。前者适合精细分析,后者适合远程服务器或轻量级环境。两个都得会,缺一不可。
4.1 Wireshark 安装与核心配置
Wireshark 的安装本身没什么难度,但有几个坑我得提前跟你说。我曾经在一台新机器上装完 Wireshark,发现死活抓不到包,折腾了半天才发现是 Npcap 没装对版本。
4.1.1 安装要点
- 选择组件:安装时务必勾选 "Install Npcap"。Wireshark 本身不直接抓包,它依赖 Npcap 这个底层驱动。如果你之前装过 WinPcap,建议先卸载干净,Npcap 是它的升级替代品。
- Npcap 模式:安装 Npcap 时,勾选 "WinPcap API-Compatible Mode"。很多老工具只认 WinPcap 接口,勾上兼容模式能省去后续兼容性问题。
- 管理员权限:抓包需要读取原始网络接口。Windows 下务必右键 "以管理员身份运行" Wireshark。Linux 下要么用 root,要么把用户加入 wireshark 组。
4.1.2 关键配置项
| 配置项 | 路径 | 推荐值 | 说明 |
|---|---|---|---|
| 自动滚动 | Capture → Options → Display Options | 关闭 | 抓实时流量时,自动滚动会让你看不清历史包,建议手动滚动 |
| MAC 地址解析 | View → Name Resolution | 仅勾选 MAC | 网络层和传输层名字解析会拖慢界面,我一般只开 MAC 解析 |
| 时间显示格式 | View → Time Display Format | Seconds Since Beginning of Capture | 分析时序问题时,相对时间比绝对时间直观得多 |
| 自动保存 | Capture → Options → Output | 每 50MB 自动新建文件 | 抓大流量时防止内存溢出,我曾经吃过这个亏,抓了半小时结果软件崩了 |
4.2 tcpdump 基础使用
Wireshark 虽好,但生产服务器上你不可能装图形界面。这时候 tcpdump 就是你的救命稻草。我习惯在跳板机上用 tcpdump 抓完包,再 scp 到本地用 Wireshark 分析。
4.2.1 常用参数速记
tcpdump 的参数很多,但日常诊断端口复用,记住下面这几个就够了:
-i any:监听所有网卡。端口复用可能涉及多个接口,用 any 最保险。-nn:不解析主机名和端口名。解析会发出 DNS 查询,干扰抓包结果,而且慢。-s 0:抓取完整报文。默认只抓前 68 字节,端口复用诊断需要看 payload,必须抓全。-w file.pcap:保存为 pcap 文件。别直接看屏幕输出,保存下来慢慢分析。-c 1000:抓 1000 个包后自动停止。防止磁盘写爆。
实战组合拳:
# 抓取 eth0 网卡上 80 端口的流量,保存到文件
tcpdump -i eth0 -nn -s 0 -w port80.pcap port 80
# 抓取所有网卡上与 192.168.1.100 相关的流量,抓 5000 个包后停止
tcpdump -i any -nn -s 0 -c 5000 -w target.pcap host 192.168.1.100
4.2.2 实时查看技巧
有时候你需要在现场快速看一眼,不想保存文件。我常用的一个组合:
tcpdump -i eth0 -nn -X port 443
-X 参数会同时打印 hex 和 ASCII 内容。嗯,这里要注意,如果流量很大,屏幕会刷得飞快,建议配合 -c 使用。
4.3 抓包过滤器的编写
这是本章的重头戏。很多人抓包时一股脑全抓下来,结果文件几百兆,分析时无从下手。好的过滤器能让你只关注感兴趣的流量,效率翻倍。
Wireshark 和 tcpdump 都支持两种过滤器:抓包过滤器(Capture Filter)和显示过滤器(Display Filter)。前者在抓包时就丢弃不匹配的包,后者只影响显示,数据还在文件里。
4.3.1 抓包过滤器(BPF 语法)
抓包过滤器用的是 Berkeley Packet Filter(BPF)语法。说白了就是一套精简的表达式,写在抓包开始之前。
| 场景 | BPF 表达式 | 说明 |
|---|---|---|
| 只抓特定端口 | port 8080 |
端口复用诊断最常用 |
| 抓源或目的端口 | src port 80 or dst port 80 |
区分方向 |
| 抓特定主机 | host 10.0.0.1 |
只关注某台服务器 |
| 抓特定协议 | tcp 或 udp |
端口复用可能涉及 TCP 或 UDP |
| 组合条件 | tcp and port 443 and host 10.0.0.1 |
用 and/or/not 组合 |
| 抓 SYN 包 | tcp[tcpflags] & tcp-syn != 0 |
分析连接建立过程 |
4.3.2 显示过滤器(Wireshark 专用)
显示过滤器是 Wireshark 的强项。它基于协议字段,表达能力远超 BPF。我一般在抓包时用 BPF 粗筛,保存文件后用显示过滤器精筛。
| 场景 | 显示过滤器表达式 | 说明 |
|---|---|---|
| HTTP 请求 | http.request |
只看 HTTP 请求报文 |
| 特定 TCP 流 | tcp.stream eq 0 |
只看第 1 个 TCP 连接 |
| IP 对 | ip.addr eq 10.0.0.1 and ip.addr eq 10.0.0.2 |
只看两个 IP 之间的流量 |
| 端口复用特征 | tcp.port == 443 and tls.handshake.type == 1 |
只看 443 端口的 TLS Client Hello |
| 排除噪音 | !icmp and !arp |
过滤掉 ping 和地址解析包 |
tcp.port 后按 Tab,会自动补全。如果记不住字段名,点 "Expression..." 按钮,按协议树查找,比硬记快得多。
4.3.3 端口复用场景的过滤器实战
假设你怀疑某台服务器在 443 端口上复用了 SSH 服务。正常的 443 应该是 HTTPS,但你想看看有没有 SSH 握手包混在里面。我会这样操作:
- 抓包阶段:
tcpdump -i any -nn -s 0 -w suspect.pcap port 443 - 分析阶段:在 Wireshark 里打开 suspect.pcap,输入显示过滤器:
tcp.port == 443 and !tls - 进一步确认:如果看到非 TLS 的 payload,再输入
tcp.payload contains "SSH"或查看 payload 的前几个字节是否为 "SSH-2.0"。
你看,过滤器用得好,问题定位就是分分钟的事。下面这张图总结了抓包工具和过滤器的整体关系,方便你对照理解。
4.4 本章小结
工具准备阶段,你只需要记住三件事:
- Wireshark 装好 Npcap,用管理员权限运行,配置好时间显示和自动保存。
- tcpdump 记住
-i any -nn -s 0 -w这个黄金组合,够应付 90% 的场景。 - 过滤器分清楚抓包和显示两种,BPF 做减法,显示过滤器做精确定位。