当前位置:首页>Linux>Linux 抓包利器 tcpdump 详解:从入门到实战

Linux 抓包利器 tcpdump 详解:从入门到实战

  • 2026-09-10 17:36:37
Linux 抓包利器 tcpdump 详解:从入门到实战

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 光眼镜。


如果这篇文章对你有帮助,欢迎点赞、收藏、转发,让更多运维和安全同行少走弯路。

最新文章

随机文章