一 介绍
tcpdump,是 Linux/Unix 系统下强大的网络抓包工具,能够捕获和分析网络流量。用简单的语言概括就是dump the traffic on a network,是一个运行在linux平台可以根据使用者需求对网络上传输的数据包进行捕获的抓包工具,windows平台有sniffer等工具,tcpdump可以将网络中传输的数据包的"包头"全部捕获过来进程分析,其支持网络层、特定的传输协议、数据发送和接收的主机、网卡和端口的过滤,并提供and、or、not等语句进行逻辑组合捕获数据包或过滤掉不用的信息。
二 语法及选项(按功能划分)
1. 基本语法
tcpdump [选项] [过滤表达式]
- 关于 proto:可选有 ip, arp, rarp, tcp, udp, icmp, ether 等,默认是所有协议的包
- 关于 dir:可选有 src, dst, src or dst, src and dst,默认为 src or dst
- 关于 type:可选有 host, net, port, portrange(端口范围,比如 21-42),默认为 host
2.命令选项
|-------|------------------------------------------------------|
| 参数 | 解析 |
| -a | 将网络地址和广播地址转变成名字 |
| -A | 以ASCII格式打印出所有分组,并将链路层的头最小化 |
| -b | 数据链路层上选择协议,包括ip/arp/rarp/ipx都在这一层 |
| -c | 指定收取数据包的次数,即在收到指定数量的数据包后退出tcpdump |
| -d | 将匹配信息包的代码以人们能够理解的汇编格式输出 |
| -dd | 将匹配信息包的代码以c语言程序段的格式输出 |
| -ddd | 将匹配信息包的代码以十进制的形式输出 |
| -D | 打印系统中所有可以监控的网络接口 |
| -e | 在输出行打印出数据链路层的头部信息 |
| -f | 将外部的Internet地址以数字的形式打印出来,即不显示主机名 |
| -F | 从指定的文件中读取表达式,忽略其他的表达式 |
| -i | 指定监听网络接口 |
| -l | 使标准输出变为缓冲形式,可以数据导出到文件 |
| -L | 列出网络接口已知的数据链路 |
| -n | 不把网络地址转换为名字 |
| -N | 不输出主机名中的域名部分,例如www.baidu.com只输出www |
| -nn | 不进行端口名称的转换 |
| -P | 不将网络接口设置为混杂模式 |
| -q | 快速输出,即只输出较少的协议信息 |
| -r | 从指定的文件中读取数据,一般是-w保存的文件 |
| -w | 将捕获到的信息保存到文件中,且不分析和打印在屏幕 |
| -s | 从每个组中读取在开始的snaplen个字节,而不是默认的68个字节 |
| -S | 将tcp的序列号以绝对值形式输出,而不是相对值 |
| -T | 将监听到的包直接解析为指定的类型的报文,常见的类型有rpc(远程过程调用)和snmp(简单网络管理协议) |
| -t | 在输出的每一行不打印时间戳 |
| -tt | 在每一行中输出非格式化的时间戳 |
| -ttt | 输出本行和前面以后之间的时间差 |
| -tttt | 在每一行中输出data处理的默认格式的时间戳 |
| -u | 输出未解码的NFS句柄 |
| -v | 输出稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息 |
| -vv | 输出详细的报文信息 |
2.1. 地址与名称解析选项
|-------|----------------------------------------------------|---------------------------|
| -a
| 将网络地址和广播地址转换为名称(如 192.168.1.1
→ router.local
)。 | tcpdump -a
(显示主机名而非 IP) |
| -n
| 禁用所有名称解析(IP/端口均显示数字)。 | tcpdump -n
(不解析任何名称) |
| -nn
| 禁用端口和协议名称解析(端口 80
不显示为 http
)。 | tcpdump -nn
(强制显示数字端口) |
| -N
| 不输出主机名的域名部分(如 www.baidu.com
→ www
)。 | tcpdump -N
(简化主机名输出) |
| -f
| 强制以数字形式显示外部 Internet 地址(禁用反向 DNS)。 | tcpdump -f
(避免 DNS 查询延迟) |
2.2. 数据链路层与协议选项
|------|---------------------------------------|----------------------------|
| -e
| 输出数据链路层头部(如 MAC 地址、VLAN 标签)。 | tcpdump -e
(查看源/目标 MAC) |
| -b
| 指定数据链路层协议(如 ip
/arp
/rarp
/ipx
)。 | tcpdump -b arp
(仅抓 ARP 包) |
| -L
| 列出接口支持的数据链路类型(如 ETHERNET
/Wi-Fi
)。 | tcpdump -L -i eth0
|
2.3. 输出格式控制
|------|-------------------------------|---------------------------------|
| -A
| 以 ASCII 格式显示数据(适合 HTTP/文本协议)。 | tcpdump -A port 80
(查看网页内容) |
| -X
| 同时以十六进制和 ASCII 显示数据(二进制协议分析)。 | tcpdump -X port 443
(分析 HTTPS) |
| -q
| 快速输出模式(减少协议详情,仅显示基本信息)。 | tcpdump -q
(简洁流量摘要) |
| -v
| 增加输出详细度(-vv
/-vvv
更详细)。 | tcpdump -vv
(显示 TTL、服务类型等) |
| -S
| 以绝对值显示 TCP 序列号(默认显示相对值)。 | tcpdump -S
(分析序列号跳跃) |
2.4. 时间戳选项
|---------|------------------|---------------------------|
| -t
| 不显示时间戳。 | tcpdump -t
(仅输出协议数据) |
| -tt
| 显示 Unix 时间戳(秒级)。 | tcpdump -tt
(用于时间对齐分析) |
| -ttt
| 显示包与包之间的时间差(毫秒)。 | tcpdump -ttt
(分析网络延迟) |
| -tttt
| 显示带日期的完整时间戳。 | tcpdump -tttt
(记录完整时间日志) |
2.5. 文件与输入输出控制
|-----------|--------------------------|---------------------------|
| -w <文件>
| 将原始数据包保存到文件(.pcap
格式)。 | tcpdump -w traffic.pcap
|
| -r <文件>
| 从文件读取抓包数据(离线分析)。 | tcpdump -r traffic.pcap
|
| -F <文件>
| 从文件加载过滤表达式(避免长命令行)。 | tcpdump -F filter.txt
|
| -l
| 启用行缓冲(适合实时管道处理)。 | `tcpdump -l |
2.6. 包捕获控制
|-----------|---------------------------|------------------------------|
| -c <数量>
| 捕获指定数量的包后退出。 | tcpdump -c 10
(抓 10 个包) |
| -s <长度>
| 设置每个包的捕获长度(默认 262144 字节)。 | tcpdump -s 100
(只抓前 100 字节) |
| -P
| 禁用混杂模式(仅捕获目标为本机的流量)。 | tcpdump -P
(避免抓取无关流量) |
2.7. 高级解析与调试
|-----------|----------------------------|-------------------------------|
| -d
| 将过滤表达式转为汇编代码(调试用)。 | tcpdump -d 'port 80'
|
| -dd
| 将过滤表达式转为 C 代码片段。 | tcpdump -dd 'icmp'
|
| -ddd
| 将过滤表达式转为十进制数字。 | tcpdump -ddd 'host 1.1.1.1'
|
| -T <类型>
| 强制解析为指定协议(如 rpc
/snmp
)。 | tcpdump -T snmp
|
| -u
| 输出未解码的 NFS 句柄(NFS 调试专用)。 | tcpdump -u port 2049
|
2.8. 特殊场景选项
|------|-------------------|---------------------------|
| -D
| 列出所有可用接口(不抓包)。 | tcpdump -D
(选择监控接口) |
| -K
| 禁用校验和验证(抓取错误校验包)。 | tcpdump -K
(抓取损坏的包) |
| -U
| 包到达时立即写入文件(实时保存)。 | tcpdump -w file.pcap -U
|
三 关键字及协议类型
1. 常见协议关键字
关键字 | 协议类型 | 示例命令 | 说明 |
---|---|---|---|
tcp |
TCP 协议 | tcpdump tcp |
抓取所有 TCP 流量 |
udp |
UDP 协议 | tcpdump udp |
抓取所有 UDP 流量 |
icmp |
ICMP 协议(Ping/路由) | tcpdump icmp |
抓取 ICMP 包(如 ping ) |
arp |
ARP 协议 | tcpdump arp |
抓取 ARP 请求/响应(MAC 地址) |
ip |
IPv4 协议 | tcpdump ip |
抓取所有 IPv4 流量 |
ip6 |
IPv6 协议 | tcpdump ip6 |
抓取所有 IPv6 流量 |
http |
HTTP 协议 | tcpdump port 80 |
HTTP 默认端口 80 |
https |
HTTPS 协议 | tcpdump port 443 |
HTTPS 默认端口 443 |
dns |
DNS 协议 | tcpdump port 53 |
DNS 查询(UDP/TCP) |
ssh |
SSH 协议 | tcpdump port 22 |
SSH 默认端口 22 |
ftp |
FTP 协议 | tcpdump port 21 |
FTP 控制端口 21 |
smtp |
SMTP 协议(邮件发送) | tcpdump port 25 |
邮件发送协议 |
dhcp |
DHCP 协议 | tcpdump port 67 or port 68 |
DHCP 请求/响应 |
vrrp |
VRRP 协议(虚拟路由) | tcpdump vrrp |
路由器高可用协议 |
stp |
STP 协议(生成树) | tcpdump stp |
交换机防环协议 |
2**.数据类型关键字**
|-------------|-----------|-----------------------|------------------|
| host
| 主机(IP/域名) | host 192.168.1.1
| 未指定类型时默认生效 |
| net
| 网络段 | net 192.168.0.0/24
| 支持 CIDR 表示法 |
| port
| 端口号 | port 22
| 需结合协议(如 tcp/udp) |
| portrange
| 端口范围 | portrange 8000-9000
| 替代多个 or
条件 |
3.方向关键字
|---------------|------------|------------------------------|-------------------------------|
| src
| 仅源地址 | src 192.168.1.1
| ether src 00:11:22:33:44:55
|
| dst
| 仅目标地址 | dst port 53
| ether dst 00:11:22:33:44:55
|
| src or dst
| 双向流量(默认行为) | host 192.168.1.1
| 隐含方向 |
| src and dst
| 严格匹配源和目标 | src 192.168.1.1 and dst 80
| 精确会话过滤 |
4.逻辑运算符
|------------|-------|-------------------------------------|--------------|
| and
/&&
| 逻辑与 | tcp && port 80
| 无 |
| or
/` | | ` | 逻辑或 |
| not
/!
| 逻辑非 | !udp
| 需引号 |
| ()
| 分组优先级 | (port 80 or 443) and host 1.1.1.1
| 需转义为 \( \)
|
四 常用案例
bash
抓取指定网卡上的所有数据包
tcpdump -i eth0
不加任何参数的情况下,默认抓取第一块网卡的数据
tcpdump
指定网卡上抓取关于指定IP的所有数据
tcpdump -i eth0 host 10.0.0.3
在网卡(eth0)上抓取关于指定IP的所有数据,将主机名显示为IP地址不进行DNS解析
tcpdump -i eth0 host 10.0.0.3 -n
抓取网卡(eth0)上的源地址是(10.0.0.3)的数据
tcpdump -i eth0 src 10.0.0.3
抓取网卡(eth0)上的目的IP是(10.0.0.3)的数据
tcpdump -i eth0 dst 10.0.0.3
抓取网卡(eth0)上的关于网段(10.0.0.0/24)的数据
tcpdump -i eth0 net 10.0.0.3
抓取网卡(eth0)上的所有关于443端口的数据
tcpdump -i eth0 port 443
抓取网卡(eth0)上关于icmp协议的数据
tcpdump -i eth0 icmp
抓取网卡(eth0)上的icmp报文或者tcp报文
tcpdump -i eth0 icmp or tcp
抓取指定数目的包
tcpdump -c 2 -i eth0
将抓到包写入文件中
tcpdump -w 20250606.pcap -i eth0
读取tcpdump保存文件
tcpdump -r 20250606.pcap
从文件读取并过滤
tcpdump -r 20250606.pcap 'port 80'
增加抓包时间戳(-tttt选项)
tcpdump -n -tttt -i eth0
指定抓包的协议类型
tcpdump -i eth0 arp
抓取特定目标ip和端口的包
tcpdump -i eth0 dst 10.0.0.3 and port 22
tcpdump -i eth0 -nn -s0 -v port 80
-i : 选择要捕获的接口,通常是以太网卡或无线网卡,也可以是 vlan 或其他特殊接口。如果该系统上只有一个网络接口,则无需指定。
-nn : 单个 n 表示不解析域名,直接显示 IP;两个 n 表示不解析域名和端口。这样不仅方便查看 IP 和端口号,而且在抓取大量数据时非常高效,因为域名解析会降低抓取速度。
-s0 : tcpdump 默认只会截取前 96 字节的内容,要想截取所有的报文内容,可以使用 -s number, number 就是你要截取的报文字节数,如果是 0 的话,表示截取报文全部内容。
-v : 使用 -v,-vv 和 -vvv 来显示更多的详细信息,通常会显示更多与特定协议相关的信息。
port 80 : 这是一个常见的端口过滤器,表示仅抓取 80 端口上的流量,通常是 HTTP。
额外再介绍几个常用参数:
-p : 不让网络接口进入混杂模式。默认情况下使用 tcpdump 抓包时,会让网络接口进入混杂模式。一般计算机网卡都工作在非混杂模式下,此时网卡只接受来自网络端口的目的地址指向自己的数据。当网卡工作在混杂模式下时,网卡将来自接口的所有数据都捕获并交给相应的驱动程序。如果设备接入的交换机开启了混杂模式,使用 -p 选项可以有效地过滤噪声。
-e : 显示数据链路层信息。默认情况下 tcpdump 不会显示数据链路层信息,使用 -e 选项可以显示源和目的 MAC 地址,以及 VLAN tag 信息。