Tcpdump

概述

tcpdump 是 Linux 系统中强大的网络抓包工具,支持按 IP 地址、端口号、协议类型等条件过滤数据包,适用于网络故障排查、流量分析等场景。

核心能力

  • 支持多种过滤条件(IP、端口、协议、网段)
  • 支持将抓包结果保存为文件,便于 Wireshark 等工具分析
  • 支持实时查看数据包内容
  • 支持容器内部网络抓包

常用示例

1. 抓取指定 IP 的数据包

tcpdump host 10.0.0.5

2. 抓取指定网段的数据包

tcpdump net 192.168.1.0/24

3. 抓取指定端口的数据包

tcpdump port 80

4. 抓取多个端口的数据包

tcpdump port 80 or port 443 or port 8080

5. 抓取指定 IP + 端口的数据包

tcpdump host 192.168.1.10 and port 8080

6. 抓包保存到文件

tcpdump host 192.168.1.10 and port 8080 -w /tmp/test.cap

7. 读取抓包文件

tcpdump -r /tmp/test.cap

8. Docker 容器内抓包

# 获取容器 PID
docker inspect --format "{{ .State.Pid }}" f6b48371b16d
# 示例输出:25235

# 根据容器 PID 抓取网卡 eth0 包
nsenter -n -t 25235 tcpdump -i eth0 -w /tmp/test.cap

9. HTTP 明文内容查看

tcpdump -A host 192.168.1.10 and port 80

10. 抓取指定数量的包后自动退出

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:"

参考链接