tcpdump 的用法
tcpdump
是一款强大的命令行网络抓包工具,用于捕获和分析网络流量。以下是其核心用法指南:
一、基础命令格式
sudo tcpdump [选项] [过滤表达式]
权限要求:需
root
权限(使用sudo
)
二、常用选项
选项 | 说明 |
---|---|
-i <接口> | 指定监听的网络接口(如 eth0 , any 表示所有接口) |
-n | 禁用主机名解析(直接显示 IP 地址) |
-nn | 禁用主机名和端口号解析(显示原始数值) |
-w <文件> | 将捕获的流量写入文件(.pcap 格式,可用 Wireshark 分析) |
-r <文件> | 读取已保存的抓包文件 |
-c <数量> | 捕获指定数量的数据包后自动停止 |
-s <长度> | 设置每个包的捕获长度(如 -s 0 捕获完整数据包) |
-v | 详细输出(-vv 或 -vvv 显示更详细信息) |
-q | 简化输出(仅显示基本信息) |
-A | 以 ASCII 格式显示数据内容(适用于 HTTP/文本协议) |
-X | 同时以十六进制和 ASCII 格式显示数据 |
三、过滤表达式
1. 按协议过滤
tcpdump tcp # 仅捕获 TCP 流量
tcpdump udp # 仅捕获 UDP 流量
tcpdump icmp # 仅捕获 ICMP 流量
tcpdump arp # 仅捕获 ARP 流量
2. 按 IP 地址过滤
tcpdump host 192.168.1.100 # 捕获与指定主机的所有通信
tcpdump src 10.0.0.1 # 捕获源 IP 为 10.0.0.1 的流量
tcpdump dst 172.16.0.5 # 捕获目的 IP 为 172.16.0.5 的流量
3. 按端口过滤
tcpdump port 80 # 捕获端口 80 的流量(HTTP)
tcpdump src port 22 # 捕获源端口为 22 的流量(SSH)
tcpdump dst port 443 # 捕获目的端口为 443 的流量(HTTPS)
4. 组合条件
tcpdump 'tcp and port 80 and host 192.168.1.1' # 捕获指定主机的 TCP 80 端口流量
tcpdump 'udp and (port 53 or port 67)' # 捕获 DNS 或 DHCP 流量
tcpdump 'icmp and src 10.0.0.5' # 捕获来自 10.0.0.5 的 ICMP 包
四、实用示例
1. 捕获所有流量并保存到文件
sudo tcpdump -i any -s 0 -w full_traffic.pcap
2. 实时分析 HTTP 请求
sudo tcpdump -i eth0 -nnA 'tcp port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420)'
说明:匹配 HTTP GET 请求(十六进制
47455420
对应 "GET ")
3. 捕获 DNS 查询
sudo tcpdump -i eth0 -nn 'udp port 53'
4. 分析 SSH 连接
sudo tcpdump -i eth0 'tcp port 22 and (tcp[tcpflags] & (tcp-syn|tcp-ack) != 0)'
5. 读取抓包文件
tcpdump -r full_traffic.pcap -nn 'icmp'
五、输出解读
- 时间戳:如
12:34:56.789012
表示捕获时间 - 协议类型:如
IP
、TCP
、UDP
等 - 源和目的地址:格式
源IP.端口 > 目的IP.端口
- 标志位:如
[S]
(SYN)、[.]
(ACK)、[P]
(PSH)、[F]
(FIN) - 数据包长度:如
length 60
表示包大小(字节)
六、高级技巧
-
排除特定流量:
tcpdump 'not port 22' # 不捕获 SSH 流量
-
按包大小过滤:
tcpdump 'greater 1000' # 捕获大于 1000 字节的包
-
显示 MAC 地址:
tcpdump -e # 显示源/目的 MAC 地址
七、注意事项
- 避免在生产环境长时间抓包(可能生成大文件)
- 使用
-w
保存文件后,可用 Wireshark 图形化分析 - 敏感信息(如密码)可能以明文传输,抓包需谨慎
通过 man tcpdump
可查看完整手册。