1. 概述
tcpdump 是 Linux 系统自带的命令行网络抓包工具,能够捕获和分析流经网络接口的数据包,是网络故障排查、协议分析、安全审计的必备工具。它支持丰富的过滤表达式,可以精确捕获特定类型的数据包,并以可读格式或文件形式输出,供后续分析使用。
2. 基本语法与常用选项
tcpdump 的基本命令格式为:
bash
tcpdump [选项] [过滤表达式]
2.1 常用选项详解
-i:指定网络接口
默认情况下,tcpdump 会抓取第一个非回环接口的数据包。使用 -i 可以明确指定要监听的网卡。
bash
# 抓取 eth0 网卡的所有数据包
tcpdump -i eth0
# 抓取所有接口的数据包
tcpdump -i any
-c:限制抓包数量
当只需要分析少量数据包时,使用 -c 可以避免抓取过多数据导致输出刷屏或文件过大。
bash
# 只抓取 10 个包
tcpdump -i eth0 -c 10
-w:将抓包数据保存到文件
将原始数据包保存为 .pcap 格式文件,便于使用 Wireshark 等图形化工具进行深入分析。
bash
# 抓取10个包并保存到文件
tcpdump -i eth0 -c 10 -w mypackets.pcap
-r:读取抓包文件
从之前保存的 .pcap 文件中读取并分析数据包。
bash
# 读取并分析保存的抓包文件
tcpdump -r mypackets.pcap
-n:不进行域名解析
默认情况下,tcpdump 会尝试将 IP 地址解析为域名。使用 -n 选项可以禁用此功能,直接显示 IP 地址,加快显示速度并避免因 DNS 查询导致的输出延迟。
bash
# 不解析域名,直接显示IP
tcpdump -n -i eth0 port 80
-nn:不进行端口和域名解析
-nn 是 -n 的增强版,它同时禁止端口号到服务名称的转换(如 80 显示为 http)。
bash
# 不解析域名和端口服务名
tcpdump -nn -i eth0 host 192.168.1.100
-v/-vv/-vvv:增加输出详细程度
-v 系列选项用于控制输出信息的详细级别,-vvv 提供最详细的输出,包括完整的协议解码信息。
3. 核心:过滤表达式
过滤表达式是 tcpdump 的灵魂,它决定了哪些数据包会被捕获。表达式由原语 (类型、方向、协议)和运算符 (and, or, not)组成。
3.1 类型原语
-
host: 指定主机(IP 或域名)bashtcpdump host www.baidu.com tcpdump host 192.168.88.111 -
net: 指定网络段bashtcpdump net 192.168.88.0/24 -
port: 指定端口bashtcpdump port 80 tcpdump port 22 -
portrange: 指定端口范围bashtcpdump portrange 20-23
3.2 方向原语
src: 源地址/端口dst: 目标地址/端口- 不指定方向则匹配双向流量。
3.3 协议原语
tcp,udp,icmp,arp等。
4. 实用案例解析
以下案例基于您提供的问题描述进行详细解释和扩展。
案例 1:抓取指定主机和端口的数据包
bash
# 抓取访问本机 22 端口 (SSH) 的数据包
tcpdump -n -i eth0 dst port 22
# 抓取与 www.baidu.com 在 80 端口通信的数据包
tcpdump -n -i eth0 host www.baidu.com and port 80
案例 2:按源/目标地址过滤
bash
# 只抓取源地址是 192.168.88.111 的数据包
tcpdump -i eth0 -nn src host 192.168.88.111
# 只抓取目标地址是 192.168.88.0/24 网段的数据包
tcpdump -i eth0 -nn dst net 192.168.88.0/24
案例 3:组合条件与排除
bash
# 抓取除 80 端口外的所有 TCP 数据包
tcpdump -i eth0 -vnn tcp and not port 80
# 抓取源网段为 192.168.88.0/24 且目标端口为 80 的数据包
tcpdump -i eth0 -vnn src net 192.168.88.0/24 and dst port 80
案例 4:复杂逻辑组合
使用括号来组合复杂的逻辑条件(注意:在 shell 中通常需要转义或使用引号)。
bash
# 抓取主机 192.168.88.111 访问 22 端口,或主机 192.168.88.112 访问 80 端口的数据包
tcpdump -i eth0 -vnn '(host 192.168.88.111 and port 22) or (host 192.168.88.112 and port 80)'
5. 进阶技巧与输出解读
5.1 解读典型输出
一个典型的 TCP 数据包输出如下:
19:48:32.123456 IP 192.168.1.100.54321 > 93.184.216.34.80: Flags [P.], seq 1:100, ack 1, win 229, length 99
19:48:32.123456: 时间戳IP: 协议为 IPv4192.168.1.100.54321 > 93.184.216.34.80: 源 IP:端口 > 目标 IP:端口Flags [P.]: TCP 标志位 (P=PUSH, . 表示 ACK)seq 1:100: 序列号范围ack 1: 确认号win 229: 窗口大小length 99: 数据段长度
5.2 其他有用选项
-
-A: 以 ASCII 格式打印每个数据包(不包括链路层头部)。适用于查看文本协议(如 HTTP)。 -
-X: 同时以十六进制和 ASCII 格式打印每个数据包。 -
-s: 设置抓取数据包的快照长度(-s 0表示抓取完整数据包)。 -
-l: 使标准输出变为行缓冲,便于通过管道实时查看。bashtcpdump -l -i eth0 port 80 | grep "GET"
6. 总结
tcpdump 功能强大,是每一位系统管理员、网络工程师和安全研究员的必备技能。掌握其核心选项和过滤表达式语法,能够快速定位网络问题、分析应用协议交互、排查安全事件。建议在实际环境中多加练习,结合 -w 选项保存数据包,并使用 Wireshark 进行更直观的图形化分析,以加深理解。