Tcpdump
概述
tcpdump 是 Linux 系统中强大的网络抓包工具,支持按 IP 地址、端口号、协议类型等条件过滤数据包,适用于网络故障排查、流量分析等场景。
核心能力:
- 支持多种过滤条件(IP、端口、协议、网段)
- 支持将抓包结果保存为文件,便于 Wireshark 等工具分析
- 支持实时查看数据包内容
- 支持容器内部网络抓包
常用示例
1. 抓取指定 IP 的数据包
tcpdump host 10.0.0.52. 抓取指定网段的数据包
tcpdump net 192.168.1.0/243. 抓取指定端口的数据包
tcpdump port 804. 抓取多个端口的数据包
tcpdump port 80 or port 443 or port 80805. 抓取指定 IP + 端口的数据包
tcpdump host 192.168.1.10 and port 80806. 抓包保存到文件
tcpdump host 192.168.1.10 and port 8080 -w /tmp/test.cap7. 读取抓包文件
tcpdump -r /tmp/test.cap8. Docker 容器内抓包
# 获取容器 PID
docker inspect --format "{{ .State.Pid }}" f6b48371b16d
# 示例输出:25235
# 根据容器 PID 抓取网卡 eth0 包
nsenter -n -t 25235 tcpdump -i eth0 -w /tmp/test.cap9. HTTP 明文内容查看
tcpdump -A host 192.168.1.10 and port 8010. 抓取指定数量的包后自动退出
tcpdump -c 100 port 80常用辅助选项
| 选项 | 作用 | 示例 |
|---|---|---|
-i |
指定抓包网卡(any 表示所有网卡) |
tcpdump -i eth0 port 80 |
-w |
保存抓包结果到文件 | tcpdump -i any host 192.168.1.10 -w capture.pcap |
-r |
读取保存的抓包文件 | tcpdump -r capture.pcap |
-n |
不解析域名(显示 IP 地址,加快抓包速度) | tcpdump -n port 443 |
-nn |
不解析域名和端口名称(显示原始端口号) | tcpdump -nn host 203.0.113.5 |
-v |
显示详细抓包信息(-vv 更详细,-vvv 最详细) |
tcpdump -v tcp port 22 |
-c |
指定抓包数量,抓够后自动退出 | tcpdump -c 100 port 80 |
-A |
以 ASCII 格式显示数据包内容 | tcpdump -A host 192.168.1.10 and port 80 |
-s |
设置抓包长度(默认 262144 字节) | tcpdump -s 0 -w capture.pcap(抓取完整包) |
过滤表达式速查
主机过滤
| 表达式 | 说明 |
|---|---|
host 10.0.0.5 |
指定 IP 地址 |
src host 10.0.0.5 |
源 IP 为 10.0.0.5 |
dst host 10.0.0.5 |
目标 IP 为 10.0.0.5 |
net 192.168.1.0/24 |
指定网段 |
端口过滤
| 表达式 | 说明 |
|---|---|
port 80 |
指定端口(源或目标) |
src port 80 |
源端口为 80 |
dst port 80 |
目标端口为 80 |
portrange 8000-9000 |
端口范围 |
协议过滤
| 表达式 | 说明 |
|---|---|
tcp |
TCP 协议 |
udp |
UDP 协议 |
icmp |
ICMP 协议(ping) |
arp |
ARP 协议 |
逻辑运算符
| 表达式 | 说明 | 示例 |
|---|---|---|
and / && |
与 | host 10.0.0.5 and port 80 |
or / || |
或 | port 80 or port 443 |
not / ! |
非 | not arp |
常见问题与注意事项
权限不足
# tcpdump 需要 root 权限
sudo tcpdump -i eth0抓包文件过大
# 限制抓包数量
tcpdump -c 1000 -w capture.pcap
# 限制每个包的大小
tcpdump -s 256 -w capture.pcap网卡混杂模式
# 启用混杂模式(抓取所有经过网卡的数据包)
tcpdump -i eth0 -p
# -p 表示不启用混杂模式查看可用网卡
tcpdump -D实时查看 HTTP 请求内容
tcpdump -A -s 0 port 80 | grep -E "GET|POST|Host:"