Linux 抓包利器 tcpdump 详解:从入门到实战
网络问题排查、安全事件分析、协议学习验证……在 Linux 环境下,tcpdump 是最常用也最强悍的抓包工具之一。它轻量、高效、功能丰富,几乎所有 Linux 发行版都预装或可通过包管理器快速安装。
本文将从基础用法、过滤表达式、常用选项、实战场景和输出解读五个维度,系统讲解 tcpdump,帮助你真正掌握这把网络分析的瑞士军刀。
一、tcpdump 是什么?
tcpdump 是一款基于命令行的网络抓包工具,利用 libpcap 库捕获网络接口上的数据包,并将其解析为人类可读的格式。它可以:
- • 实时显示网络流量
- • 将流量保存到文件供后续分析
- • 通过丰富的过滤规则精准捕获目标数据包
- • 作为 Wireshark 的“前端采集器”,生成
.pcap 文件
1.1 安装与版本查看
大多数 Linux 发行版默认已安装 tcpdump,如果没有,可通过以下命令安装:
# Debian/Ubuntusudo apt update && sudo apt install tcpdump# CentOS/RHEL/Rockysudo yum install tcpdump# 或sudo dnf install tcpdump# Alpineapk add tcpdump
查看版本:
tcpdump --version
1.2 基本权限说明
tcpdump 需要 root 权限或 CAP_NET_RAW 能力,因为它要直接操作网络接口。普通用户执行时通常会提示权限不足。
二、基础用法
2.1 抓取指定接口
# 抓取 eth0 接口tcpdump -i eth0# 抓取所有接口(慎用,输出会非常混乱)tcpdump -i any
2.2 抓取指定数量后退出
# 抓 100 个包后自动退出tcpdump -i eth0 -c 100
2.3 保存到文件
# 将抓包结果保存到 /tmp/capture.pcaptcpdump -i eth0 -w /tmp/capture.pcap
-w 选项会以原始二进制格式保存,适合用 Wireshark 或 tcpdump -r 后续分析。
2.4 读取抓包文件
# 读取已保存的抓包文件tcpdump -r /tmp/capture.pcap# 读取文件并显示更详细信息tcpdump -r /tmp/capture.pcap -nn -v
2.5 后台静默抓包
# 后台运行,抓包保存到文件tcpdump -i eth0 -w /tmp/capture.pcap -q -U &
-U 表示立即写入数据包,而不是缓冲,适合实时分析场景。
三、常用选项详解
| 选项 | 含义 |
|---|
-i eth0 | 指定监听接口 |
-c 100 | 抓取 100 个包后退出 |
-w file.pcap | 将结果写入文件 |
-r file.pcap | 从文件读取 |
-n | 不解析主机名,直接显示 IP |
-nn | 不解析主机名和端口名 |
-v / -vv / -vvv | 显示越来越详细的协议信息 |
-e | 显示链路层头部(MAC 地址) |
-X | 以十六进制和 ASCII 显示载荷 |
-A | 以 ASCII 显示载荷 |
-s 0 | 抓取完整数据包,不做截断 |
-q | 简洁输出 |
-tttt | 显示完整日期时间 |
-S | 显示绝对序列号 |
3.1 推荐的基础组合
# 最常用组合:显示 IP:端口、时间戳、不做域名解析tcpdump -i eth0 -nn -tttt# 抓完整包并保存tcpdump -i eth0 -nn -s 0 -w /tmp/full.pcap# 查看包内容(适合调试文本协议)tcpdump -i eth0 -nn -A port 80
四、过滤表达式:精准捕获
tcpdump 最强大的能力在于过滤表达式。过滤分为两类:
- • 捕获过滤(Capture Filter):在抓包时由内核丢弃不符合条件的数据包,效率高
- • 显示过滤(Display Filter):tcpdump 自身对抓到的包再做过滤,灵活但消耗更多资源
tcpdump 的捕获过滤语法基于 Berkeley Packet Filter(BPF)。
4.1 按主机过滤
# 抓取与 192.168.1.100 相关的流量tcpdump host 192.168.1.100# 抓取源或目的不是本机的流量tcpdump not host 192.168.1.1# 抓取两个主机之间的流量tcpdump host 192.168.1.100 and host 192.168.1.200
4.2 按网络过滤
# 抓取整个 192.168.1.0/24 网段的流量tcpdump net 192.168.1.0/24# 抓取 10.0.0.0/8 私网流量tcpdump net 10.0.0.0/8
4.3 按端口过滤
# 抓取 80 端口流量tcpdump port 80# 抓取除 22 端口以外的流量tcpdump not port 22# 抓取一段端口范围tcpdump portrange 10000-20000# 源端口或目的端口tcpdump src port 443tcpdump dst port 53
4.4 按协议过滤
# 只抓 TCPtcpdump tcp# 只抓 UDPtcpdump udp# 只抓 ICMPtcpdump icmp# 只抓 ARPtcpdump arp
4.5 组合过滤
# 抓取 192.168.1.100 访问 8.8.8.8:53 的 UDP 流量tcpdump -i eth0 host 192.168.1.100 and host 8.8.8.8 and udp port 53# 抓取访问 80 或 443 端口的流量,排除 SSHtcpdump -i eth0 'tcp port 80 or tcp port 443' and not port 22# 抓取特定网段访问外部 Web 服务的流量tcpdump -i eth0 src net 192.168.1.0/24 and dst port 443
4.6 高级 BPF 过滤
# 抓取 TCP SYN 包tcpdump 'tcp[tcpflags] & tcp-syn != 0'# 抓取 TCP SYN-ACK 包tcpdump 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0'# 抓取 TCP RST 包tcpdump 'tcp[tcpflags] & tcp-rst != 0'# 抓取 HTTP GET 请求tcpdump -i eth0 -s 0 -A 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'# 抓取 HTTP POST 请求tcpdump -i eth0 -s 0 -A 'tcp dst port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354)'
4.7 按包大小过滤
# 抓取大于 100 字节的包tcpdump greater 100# 抓取小于 64 字节的包tcpdump less 64
五、实战场景
5.1 排查 DNS 解析问题
# 抓取本机到 53 端口的 DNS 查询tcpdump -i eth0 -nn -tttt port 53# 保存到文件,便于分析tcpdump -i eth0 -nn -s 0 -w /tmp/dns.pcap port 53
5.2 分析 HTTP 请求
# 实时查看 HTTP 请求头tcpdump -i eth0 -nn -A port 80# 只查看 GET 请求tcpdump -i eth0 -nn -A 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
5.3 排查 SSH 连接问题
# 抓取 SSH 握手过程tcpdump -i eth0 -nn host 192.168.1.100 and port 22# 查看是否有 TCP 三次握手和连接重置tcpdump -i eth0 -nn 'host 192.168.1.100 and port 22 and tcp[tcpflags] & tcp-syn != 0 or tcp[tcpflags] & tcp-rst != 0'
5.4 检测端口扫描
# 抓取 SYN 扫描特征tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack == 0'
5.5 抓取特定时间段的流量
# 使用 timeout 命令控制抓包时长timeout 60 tcpdump -i eth0 -w /tmp/1min.pcap# 或使用 -c 控制包数tcpdump -i eth0 -c 10000 -w /tmp/limit.pcap
5.6 与 Wireshark 配合使用
# 在服务器上抓包tcpdump -i eth0 -nn -s 0 -w /tmp/server.pcap# 下载到本地用 Wireshark 分析# scp /tmp/server.pcap user@local:/tmp/
Wireshark 的图形界面更适合深度协议分析和可视化展示。
六、输出解读
6.1 典型输出格式
tcpdump -i eth0 -nn
输出示例:
14:32:10.123456 IP 192.168.1.100.54321 > 8.8.8.8.53: 12345+ A? example.com. (32)
字段含义:
- •
14:32:10.123456:时间戳 - •
IP:协议类型 - •
192.168.1.100.54321:源 IP 和源端口 - •
>:数据包方向 - •
8.8.8.8.53:目的 IP 和目的端口 - •
12345+:DNS 事务 ID 和递归查询标志 - •
A? example.com.:查询类型和域名 - •
(32):数据包长度
6.2 TCP 输出详解
14:32:10.123456 IP 192.168.1.100.54321 > 192.168.1.1.80: Flags [S], seq 1234567890, win 29200, options [mss 1460,sackOK,TS val 12345 ecr 0,nop,wscale 7], length 0
- •
Flags [S]:SYN 标志 - •
seq:序列号 - •
win:窗口大小 - •
options:TCP 选项 - •
length 0:载荷长度
常见标志组合:
| 标志 | 含义 |
|---|
[S] | SYN |
[.] | ACK |
[S.] | SYN-ACK |
[F] | FIN |
[R] | RST |
[P] | PUSH |
[U] | URGENT |
6.3 使用 -v 查看更多信息
tcpdump -i eth0 -nn -v
可以显示 TTL、IP ID、DF 标志、校验和等更详细的 IP 头部信息。
6.4 使用 -X 查看十六进制载荷
tcpdump -i eth0 -nn -X port 80
适合分析自定义协议或排查二进制数据问题。
七、性能与注意事项
7.1 抓取大流量时的优化
# 只抓包头,减少文件大小tcpdump -i eth0 -s 96 -w /tmp/headers.pcap# 使用 -C 按大小轮转文件tcpdump -i eth0 -w /tmp/rotate.pcap -C 100 -W 5
-C 100 表示每个文件 100MB,-W 5 表示最多保留 5 个文件循环覆盖。
7.2 避免在生产环境长时间抓包
- • 抓包会消耗 CPU、磁盘 I/O 和存储空间
- • 高流量场景下可能丢包
- • 敏感流量可能包含密码、Token、PII 等信息,注意存储安全
7.3 使用 dumpcap 替代大流量场景
如果流量极大,tcpdump 可能无法跟上。可以考虑使用 dumpcap(Wireshark 组件)或 tshark,它们在处理高速流量时更高效。
7.4 权限最小化
# 为普通用户授予抓包能力sudo setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump
授予后,该用户可以无需 sudo 执行 tcpdump。
八、常见问题
8.1 为什么抓不到包?
- • 检查是否使用了正确的网络接口
- • 检查过滤表达式是否过于严格
- • 检查是否有其他进程占用了接口
- • 容器环境中可能需要抓 veth 接口或 br0
8.2 如何抓取本机到本机的流量?
Linux 本地环回流量会经过 lo 接口:
tcpdump -i lo -nn port 8080
8.3 如何抓取 Docker 容器流量?
# 查看容器接口名ip link show# 抓取容器 veth 接口tcpdump -i veth1234567 -nn# 或抓取 docker0 网桥tcpdump -i docker0 -nn
8.4 如何统计流量?
# 统计各 IP 连接数tcpdump -nn -r /tmp/capture.pcap | awk '{print $3}' | cut -d. -f1-4 | sort | uniq -c | sort -rn# 统计各端口流量tcpdump -nn -r /tmp/capture.pcap | awk -F'[.:]' '{print $(NF-1)}' | sort | uniq -c | sort -rn
九、总结
tcpdump 是 Linux 网络排查不可替代的基础工具。掌握它,意味着你能够:
- • 快速定位网络连通性问题
- • 分析应用层协议交互细节
- • 捕获安全事件的关键证据
- • 与 Wireshark 等工具形成高效 workflow
建议从常用组合开始练习:
tcpdump -i eth0 -nn -tttt
然后逐步尝试主机、端口、协议、标志位等过滤条件,最终能够根据实际场景灵活组合。
网络世界的问题,往往都能在数据包中找到答案。用好 tcpdump,就是给自己配了一副 X 光眼镜。
如果这篇文章对你有帮助,欢迎点赞、收藏、转发,让更多运维和安全同行少走弯路。