tcpdump 是 Linux/Unix 系统中一款强大的命令行网络抓包工具,可实时捕获网络接口上的数据包并解析,常用于网络故障排查、协议分析、流量监控等场景。以下从基本语法、核心选项、过滤规则、高级用法及实用案例等方面详细讲解。
一、基本语法
tcpdump 的核心语法结构为:
tcpdump [选项] [过滤表达式]
- 选项:控制抓包的行为(如指定接口、输出格式、保存文件等)。
- 过滤表达式:筛选需要捕获的数据包(如指定主机、端口、协议等)。
二、核心选项详解
选项用于调整抓包的范围和输出方式,常用选项如下:
选项 | 作用 | 示例 |
---|---|---|
-i <接口> | 指定抓包的网络接口(如 eth0、lo);-i any表示所有接口 | tcpdump -i eth0(抓 eth0 接口的包) |
-n | 不进行 DNS 解析(直接显示 IP,不转主机名) | tcpdump -n(输出 IP 而非域名) |
-nn | 不解析 IP 和端口(端口显示数字,不转服务名如 80 不显示 http) | tcpdump -nn(IP 和端口均为数字) |
-v/-vv/-vvv | 增加输出详细程度(v:基本详情;vv:更多协议细节;vvv:最详细) | tcpdump -vv(显示较详细的包信息) |
-c <数量> | 只捕获指定数量的数据包后退出 | tcpdump -c 10(抓 10 个包后停止) |
-w <文件> | 将捕获的原始数据包保存到文件(不解析,需用-r读取) | tcpdump -w traffic.pcap(保存到 traffic.pcap) |
-r <文件> | 从保存的文件中读取数据包(用于离线分析) | tcpdump -r traffic.pcap(读取 pcap 文件) |
-s <长度> | 设置抓包的 “快照长度”(默认 65535 字节,足够捕获完整包) | tcpdump -s 0(捕获完整包,0 等价于 65535) |
-A | 以 ASCII 码显示数据包内容(适合查看 HTTP 等文本协议) | tcpdump -A(直观查看数据包的文本内容) |
-X | 同时以十六进制和 ASCII 码显示数据包内容(兼顾二进制和文本) | tcpdump -X(十六进制 + ASCII 混合显示) |
-e | 显示数据链路层信息(如 MAC 地址、VLAN 标签) | tcpdump -e(输出包含源 / 目的 MAC) |
-t | 不显示时间戳 | tcpdump -t(去掉输出中的时间) |
-tttt | 显示完整时间戳(格式:年 - 月 - 日 时:分: 秒。微秒) | tcpdump -tttt(精确到微秒的时间) |
三、过滤表达式(核心功能)
过滤表达式是 tcpdump 的灵魂,用于精准筛选目标数据包。表达式由 “类型 + 方向 + 协议” 组合而成,支持逻辑运算(and/or/not)。
1. 按 “类型” 过滤(指定目标对象)
类型用于限定数据包的来源 / 目标是 “主机”“网段” 还是 “端口”。
类型 | 含义 | 示例 |
---|---|---|
host <IP/主机名> | 匹配指定主机的数据包(源或目的为该主机) | tcpdump host 192.168.1.100(抓与 192.168.1.100 相关的包) |
net <网段> | 匹配指定网段的数据包(如 192.168.1.0/24) | tcpdump net 192.168.1.0/24(抓 192.168.1.x 网段的包) |
port <端口> | 匹配指定端口的数据包(源或目的端口) | tcpdump port 80(抓 80 端口的包) |
portrange <端口范围> | 匹配端口范围(如 1-100) | tcpdump portrange 1-100(抓 1 到 100 端口的包) |
2. 按 “方向” 过滤(指定数据流向)
方向用于限定数据包是 “发送” 还是 “接收”。
方向 | 含义 | 示例 |
---|---|---|
src <对象> | 源为指定对象(主机 / 端口 / 网段) | tcpdump src 192.168.1.100(抓源 IP 是 192.168.1.100 的包) |
dst <对象> | 目的为指定对象 | tcpdump dst port 443(抓目的端口是 443 的包) |
src or dst <对象> | 源或目的为指定对象(默认行为,可省略) | tcpdump src or dst host 10.0.0.1 |
3. 按 “协议” 过滤
直接指定协议类型,仅捕获该协议的数据包。
协议 | 含义 | 示例 |
---|---|---|
tcp | 传输控制协议(如 HTTP/HTTPS) | tcpdump tcp(只抓 TCP 包) |
udp | 用户数据报协议(如 DNS) | tcpdump udp(只抓 UDP 包) |
icmp | 互联网控制消息协议(如 ping) | tcpdump icmp(只抓 ICMP 包) |
arp | 地址解析协议(IP 与 MAC 映射) | tcpdump arp(抓 ARP 请求 / 应答包) |
ip/ip6 | IPv4/IPv6 协议 | tcpdump ip6(只抓 IPv6 包) |
4. 逻辑运算(组合条件)
支持and(且)、or(或)、not(非)组合多个条件,复杂条件可用括号()包裹(需转义\(`和`\))。
运算 | 示例 | 含义 |
---|---|---|
and | tcpdump host 192.168.1.100 and port 80 | 抓与 192.168.1.100 相关且端口为 80 的包 |
or | tcpdump port 80 or port 443 | 抓 80 端口或 443 端口的包 |
not | tcpdump not host 192.168.1.1 | 抓排除 192.168.1.1 的所有包 |
组合 | tcpdump src 10.0.0.2 and\(port 80 or port 443\) | 抓源为 10.0.0.2 且端口是 80 或 443 的包 |
四、高级过滤规则(协议细节)
针对特定协议的细节(如 TCP 标志位、数据包长度)过滤,适合深度分析。
规则 | 含义 | 示例 |
---|---|---|
tcp flags <标志> | 匹配 TCP 标志位(SYN/RST/ACK 等) | tcpdump tcp flags syn(抓 TCP SYN 包,用于检测连接请求) |
tcp [flags] & <掩码> != 0 | 更灵活的 TCP 标志匹配(如 SYN+ACK) | tcpdump ‘tcp [13] & 0x12 != 0’(抓 SYN 或 ACK 包,0x12 对应 SYN (0x02)+ACK (0x10)) |
len <长度> | 匹配数据包长度(小于 / 大于 / 等于) | tcpdump len > 100(抓长度大于 100 字节的包) |
icmp[icmptype] = <类型> | 匹配 ICMP 类型(如 echo-request 是 ping 请求,echo-reply 是应答) | tcpdump ‘icmp[icmptype] = icmp-echo’(抓 ping 请求包) |
vlan | 抓指定 VLAN ID 的包(需配合-e显示 VLAN 标签) | tcpdump vlan 100(抓 VLAN 100 的包) |
五、输出格式解读
tcpdump 的输出格式包含多个字段,以典型 TCP 包为例:
20:30:15.123456 IP 192.168.1.100.54321 > 203.0.113.5.80: Flags [P.], seq 12345:12390, ack 54321, win 65535, length 45
各字段含义:
- 20:30:15.123456:时间戳(默认精确到微秒);
- IP:网络层协议(此处为 IPv4);
- 192.168.1.100.54321:源地址:源端口;
- 203.0.113.5.80:目的地址:目的端口;
- Flags [P.]:TCP 标志位(P表示 Push,.表示 ACK);
- seq 12345:12390:TCP 序列号范围(该包数据从 12345 到 12390,长度 45 字节);
- ack 54321:确认号(期望接收对方的下一个序列号);
- win 65535:接收窗口大小(流量控制用);
- length 45:数据包数据部分长度(字节)。
六、实用案例
结合上述知识,以下是常见场景的实战命令:
1. 监控特定端口的 HTTP 流量(80 端口)
tcpdump -i eth0 -nn -A 'port 80'
- -A:以 ASCII 显示内容,可直接看到 HTTP 请求头 / 响应体;
- 适合快速查看网页访问的 URL、参数等。
2. 捕获 ping(ICMP)交互
tcpdump -i any -tttt -vv 'icmp[icmptype] = icmp-echo or icmp[icmptype] = icmp-echoreply'
- 抓取 ping 请求(icmp-echo)和应答(icmp-echoreply),-tttt显示完整时间,便于分析延迟。
3. 分析 TCP 三次握手 / 四次挥手
tcpdump -i eth0 -nn 'tcp port 80 and (tcp flags syn or tcp flags fin or tcp flags rst)'
- 捕获 TCP 连接建立(SYN)、关闭(FIN)、重置(RST)的标志位包,用于分析连接异常(如频繁 RST 可能是服务崩溃)。
4. 保存抓包文件供后续分析(如用 Wireshark)
tcpdump -i eth0 -w traffic.pcap 'host 192.168.1.100' # 保存到文件tcpdump -r traffic.pcap # 读取文件分析
- 大流量场景下,先保存到.pcap文件,再用 Wireshark 图形化分析更高效。
5. 排除 DNS 流量(减少干扰)
tcpdump -i any -nn 'not port 53'
- DNS 默认端口是 53(UDP/TCP),排除后可聚焦业务流量。
七、注意事项
- 权限:tcpdump 需要 root 权限(或CAP_NET_RAW能力),普通用户执行会报错;
- 性能:无过滤条件时会捕获所有包,可能占用大量 CPU / 磁盘 IO,建议用过滤表达式缩小范围;
- 快照长度:默认-s 65535可捕获完整包,若只需分析头部,可减小(如-s 128)提升效率;
- 输出干扰:实时抓包时输出会刷屏,可结合tee保存到文件同时查看:tcpdump … | tee capture.log。
通过上述内容,可掌握 tcpdump 的核心用法,结合实际场景灵活组合选项和过滤规则,即可高效完成网络分析任务。