tcpdump 使用详解
tcpdump 使用详解
tcpdump
是 Linux/Unix 系统中最强大、最常用的网络抓包和分析工具,它可以捕获经过网络接口的数据包,并以可读格式显示,用于网络调试、安全分析、性能排查等。
🚀 一、基本语法
tcpdump [选项] [过滤表达式]
🔍 二、常用选项(Options)
选项 | 说明 |
---|---|
-i | 指定监听的网络接口,如 eth0 , wlan0 , any (所有接口) |
-n | 不解析主机名(显示 IP 而不是域名) |
-nn | 不解析主机名和端口名(显示数字端口,如 80 而不是 http) |
-v | 显示详细信息(可叠加: -vv , -vvv 更详细) |
-q | 快速模式,减少输出信息(更简洁) |
-c | 只捕获前 num 个包后自动停止 |
-s | 设置捕获包的长度(字节), -s 0 表示抓完整包 |
-w | 将捕获的数据包写入文件(用于后续分析) |
-r | 从文件读取数据包进行分析(配合 -w 使用) |
-X | 以十六进制和 ASCII 格式显示包内容(用于查看数据) |
-XX | 同 -X ,但包含以太网头部 |
-e | 显示数据链路层(MAC)头部信息 |
🧩 三、常见用法示例
1. 抓取指定接口的所有流量
tcpdump -i eth0
抓取 eth0 接口上的所有数据包。
2. 不解析主机名和端口(推荐)
tcpdump -i any -nn
-nn 让输出更清晰,避免 DNS 查询延迟。
3. 只抓 10 个包就停止
tcpdump -i wlan0 -c 10 -nn
适合快速查看,避免输出太多。
4. 抓包并保存到文件(用于后续分析)
tcpdump -i any -nn -s 0 -w capture.pcap
- w capture.pcap:将原始包保存为 .pcap 文件
- 可用 Wireshark、tcpdump -r 打开分析
5. 从文件读取并分析
tcpdump -r capture.pcap -nn
查看之前保存的抓包文件。
6. 只抓 TCP 流量
tcpdump -i any 'tcp'
使用过滤表达式 ‘tcp’,只抓 TCP 包。
7. 抓指定主机的流量
tcpdump -i any 'host 192.168.1.100'
抓与 192.168.1.100 通信的所有包。
8. 抓指定端口的流量
tcpdump -i any 'port 80'
抓所有使用 80 端口(HTTP)的包。
9. 抓指定 IP 和端口的组合
tcpdump -i any 'host 192.168.1.100 and port 22'
抓 192.168.1.100 的 SSH(端口 22)流量。
10. 抓 HTTP 请求(GET/POST)
tcpdump -i any -A 'tcp port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354)'
- A:以 ASCII 显示包内容
这条命令匹配 GET 或 POST 开头的 HTTP 请求。
11. 显示包内容(十六进制 + ASCII)
tcpdump -i any -X 'port 53'
查看 DNS 查询的原始内容。
12. 抓 ICMP(ping)包
tcpdump -i any 'icmp'
查看 ping 命令产生的流量。
13. 排除某种流量
tcpdump -i any 'not port 22 and not port 53'
抓除 SSH 和 DNS 外的所有流量。
📦 四、过滤表达式语法(BPF - Berkeley Packet Filter)
tcpdump 支持强大的过滤语法:
类型 | 示例 |
---|---|
协议 | tcp , udp , icmp , ip , arp |
主机 | host 192.168.1.1 |
网络 | net 192.168.1.0/24 |
端口 | port 80 , portrange 80-8080 |
方向 | src , dst , src or dst |
逻辑操作 | and , or , not |
示例组合:
# 源 IP 为 192.168.1.100 且目标端口为 443
tcpdump 'src 192.168.1.100 and dst port 443'# 来自或去往 192.168.1.0/24 网络的 UDP 流量
tcpdump 'net 192.168.1.0/24 and udp'
🧪 五、实际应用场景
场景 | 命令示例 |
---|---|
调试网页打不开 | tcpdump -i any -nn ‘host example.com’ |
检查是否被防火墙 drop | 抓包看是否有请求但无响应( drop 无回复, reject 有 RST ) |
分析 DNS 查询 | tcpdump -i any -nn ‘port 53’ |
查看设备是否在发广播 | tcpdump -i any ‘broadcast’ |
抓手机 App 流量 | tcpdump -i wlan0 -w app.pcap ,用 Wireshark 分析 |
📂 六、保存和分析
# 抓包保存
tcpdump -i any -s 0 -w /tmp/debug.pcap -c 100
# 用 Wireshark 分析
wireshark /tmp/debug.pcap
- pcap 文件是标准格式,可用 Wireshark、tshark、CloudShark 等工具打开。
⚠️ 七、注意事项
- 需要 root 权限 或 CAP_NET_RAW 能力:sudo tcpdump …
- 抓包可能影响性能,避免长时间全量抓包
- s 0 抓完整包,否则可能截断数据
- 生产环境慎用,避免泄露敏感数据
BPF 过滤表达式基本语法
tcpdump 使用 BPF(Berkeley Packet Filter) 作为其过滤语言。它是一种基于表达式的语言,用于描述“哪些数据包需要捕获”。
一、基本结构:
[原语] [逻辑操作符] [原语] …
- 原语(Primitives):描述包的某个特征(如端口、IP、协议等)
- 逻辑操作符:and、or、not(也可用 &&、||、!)
二、可用的过滤属性(原语)
以下是 tcpdump 支持的主要过滤属性,分为几大类:
1. 协议(Protocol)
表达式 | 说明 |
---|---|
tcp | 只抓 TCP 包 |
udp | 只抓 UDP 包 |
icmp | 只抓 ICMP 包(如 ping) |
ip | IPv4 包 |
ip6 | IPv6 包 |
arp | ARP 请求/响应 |
ether | 以太网帧 |
示例:
tcpdump 'tcp' # 只抓 TCP
tcpdump 'icmp or arp' # 抓 ICMP 或 ARP
2. 主机(Host)
表达式 | 说明 |
---|---|
host 192.168.1.1 | 抓与该 IP 通信的所有包 |
src host 1.1.1.1 | 只抓源 IP 为 1.1.1.1 的包 |
dst host 8.8.8.8 | 只抓目标 IP 为 8.8.8.8 的包 |
示例:
tcpdump 'host 192.168.1.100'
tcpdump 'src host 10.0.0.5'
3. 网络(Network)
表达式 | 说明 |
---|---|
net 192.168.1.0/24 | 抓与该网段通信的包 |
src net 10.0.0.0/8 | 源网络 |
dst net 172.16.0.0/16 | 目标网络 |
示例:
tcpdump 'net 192.168.1.0/24'
4. 端口(Port)
表达式 | 说明 |
---|---|
port 80 | 抓使用 80 端口的包(TCP/UDP) |
src port 53 | 源端口为 53(DNS) |
dst port 443 | 目标端口为 443(HTTPS) |
portrange 80-8080 | 抓端口在 80 到 8080 范围内的包 |
示例:
tcpdump 'port 80 or port 443' # HTTP 和 HTTPS
tcpdump 'src port 1024-65535' # 高端口(客户端端口)
5. 方向(Direction)
表达式 | 说明 |
---|---|
src | 源(source) |
dst | 目标(destination) |
src or dst | 源或目标 |
src and dst | 源和目标(通常用于组合) |
示例:
tcpdump 'src host 192.168.1.100 and dst port 80'
6. 数据包内容(Payload)
表达式 | 说明 |
---|---|
tcp[12] & 0xf0 > 0 | 查看 TCP 头部长度 |
tcp[tcpflags] & tcp-syn != 0 | 抓 SYN 包 |
tcp[tcpflags] & tcp-ack != 0 | 抓 ACK 包 |
ip[6] & 0x20 != 0 | 抓 IP 分片包 |
高级示例:抓 HTTP GET 请求
tcpdump 'tcp port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420)'
0x47455420 是 "GET " 的十六进制 ASCII 值
7. 广播与多播(Broadcast / Multicast)
表达式 | 说明 |
---|---|
broadcast | 抓广播包(如 ARP) |
multicast | 抓多播包 |
示例:
tcpdump 'broadcast' # 如 DHCP 请求
tcpdump 'multicast'
8. 包长度(Packet Length)
表达式 | 说明 |
---|---|
greater 100 | 包大小大于 100 字节 |
less 500 | 包大小小于 500 字节 |
示例:
tcpdump 'greater 1500' # 抓超大包(可能分片)
三、逻辑操作符(Logical Operators)
操作符 | 说明 | 优先级 |
---|---|---|
not 或 ! | 取反 | 高 |
and 或 && | 与 | 中 |
or 或 || | 或 | 低 |
优先级示例:
# 等价于: (host 192.168.1.100) and (port 80 or port 443)
tcpdump 'host 192.168.1.100 and port 80 or port 443'# 更清晰写法(推荐加括号):
tcpdump 'host 192.168.1.100 and (port 80 or port 443)'
⚠️ 注意:and 优先级高于 or,复杂表达式建议使用括号明确逻辑。
四、实用组合示例
需求 | 命令 |
---|---|
抓某 IP 的 HTTP/HTTPS 流量 | tcpdump ‘host 192.168.1.100 and (port 80 or port 443)’ |
抓外网入站 SYN 包 | tcpdump ‘src net 0.0.0.0/0 and dst port 22 and tcp[tcpflags] & tcp-syn != 0’ |
抓 DNS 查询 | tcpdump ‘udp port 53 and dst port 53’ |
抓非本地流量 | tcpdump ‘not net 192.168.0.0/16’ |
抓 TCP 建立连接(SYN) | tcpdump ‘tcp[tcpflags] & tcp-syn != 0’ |
抓 TCP 断开连接(FIN) | tcpdump ‘tcp[tcpflags] & tcp-fin != 0’ |
五、注意事项
- 引号:建议用单引号 ’ 包裹表达式,防止 shell 解析 ()、$ 等字符。
- 括号:复杂逻辑必须用括号 () 明确优先级。
- 性能:过滤越精确,性能越好,避免抓全量包。
- 权限:需要 root 或 CAP_NET_RAW 权限。