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)。
类型用于限定数据包的来源 / 目标是 “主机”“网段” 还是 “端口”。
类型 | 含义 | 示例 |
---|---|---|
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 端口的包) |
方向用于限定数据包是 “发送” 还是 “接收”。
方向 | 含义 | 示例 |
---|---|---|
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 |
直接指定协议类型,仅捕获该协议的数据包。
协议 | 含义 | 示例 |
---|---|---|
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 包) |
支持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
各字段含义:
结合上述知识,以下是常见场景的实战命令:
tcpdump -i eth0 -nn -A 'port 80'
tcpdump -i any -tttt -vv 'icmp[icmptype] = icmp-echo or icmp[icmptype] = icmp-echoreply'
tcpdump -i eth0 -nn 'tcp port 80 and (tcp flags syn or tcp flags fin or tcp flags rst)'
tcpdump -i eth0 -w traffic.pcap 'host 192.168.1.100' # 保存到文件tcpdump -r traffic.pcap # 读取文件分析
tcpdump -i any -nn 'not port 53'
通过上述内容,可掌握 tcpdump 的核心用法,结合实际场景灵活组合选项和过滤规则,即可高效完成网络分析任务。