查看博客目录

玩转tcpdump:网络工程师必会的抓包技能

在网络管理和故障排除中,实时监控和分析网络流量是至关重要的。TCPDump 是一个强大的命令行工具,它允许用户捕获和分析通过网络接口的原始数据包。本文将详细介绍如何在 CentOS 操作系统中安装和使用 TCPDump,以及如何通过它来诊断和解决网络问题。

一、安装 TCPDump

在 CentOS 中安装 TCPDump 非常简单。

安装 TCPDump:

yum install tcpdump -y

安装完成后,你可以通过输入 tcpdump 来验证安装是否成功:

tcpdump --version

二、常用参数

参数描述
-a尝试将网络和广播地址转换成名称。
-A以 ASCII 码方式显示每一个数据包,方便查看应用层数据。
-b在 ARPA Internet 协议上同时显示数据包匹配和数据链路层头。
-B设置操作系统捕获缓冲区大小。
-c收到指定数量的数据包后停止。
-C保存数据包前检查文件大小,超过指定大小时新建文件。
-d将编译过的数据包匹配代码以可读汇编格式输出。
-dd以 C 语言形式输出数据包匹配代码。
-ddd以十进制数形式输出数据包匹配代码。
-D列出可用于抓包的接口。
-e在输出行打印数据链路层头部信息。
-E指定解密 IPSEC 流量的方法。
-f将外部 Internet 地址以数字形式打印出来。
-F使用文件作为过滤表达式输入,忽略命令行上的表达式。
-G允许单个文件按时间戳保存多个抓包结果。
-h获取 TCPDump 帮助信息。
-H尝试检测 802.11s 草案网状网络。
-i监听指定的网络接口。
-I将网络接口置于无监控模式,用于 802.11 无线网络。
-j设置抓包时间戳类型为 jiffies。
-J列出支持的时间戳类型。
-k显示数据包时强制显示时间戳。
-K不验证 IP、TCP 或 UDP 校验和。
-L列出网络接口的已知数据链路类型。
-m从文件模块中加载 SMI MIB 模块定义。
-M使用指定方式快速缓存会话密钥。
-n不把网络地址转换成名字。
-N不打印主机名的域名限定。
-O不运行数据包匹配代码优化器。
-p不让网络接口进入混杂模式。
-q快速输出较少的协议信息。
-r从指定文件中读取数据包。
-R设定 TCPDump 的默认历史数据包匹配行为为不匹配。
-s设置数据包捕获长度。
-S打印 TCP 绝对序列号而不是相对序列号。
-t不在输出的每一行打印时间戳。
-tt在每一行中输出非格式化时间戳。
-T将数据包强制解释为指定类型。
-U-w 选项产生的数据文件以 packet-buffered 方式写入。
-v输出稍微详细的信息。
-vv输出更详细的信息。
-vvv输出非常详细的信息。
-w将捕获的数据包直接写入文件。
-W限制文件数量。
-x以十六进制和 ASCII 码打印数据包内容。
-X以十六进制和 ASCII 码打印数据包内容,并包括连接层。
-Y使用数据链路层匹配代码。
-z修改数据包和文件输出统计计数器。
-Z改变用户 ID 或组 ID。

这些选项允许用户根据需要调整 TCPDump 的行为,从而进行更精确的网络数据包捕获和分析。请注意,使用某些选项可能需要特定的权限或系统配置,且不同版本的 TCPDump 可能支持的选项有所不同。

三、过滤表达式

  1. 基于协议的过滤

  • tcp

    : 过滤 TCP 协议数据包。

  • udp

    : 过滤 UDP 协议数据包。

  • icmp

    : 过滤 ICMP 协议数据包。

  • arp

    : 过滤 ARP 协议数据包。

  • ip

    : 过滤 IP 协议数据包。

  • ether

    : 过滤以太网帧。

  • wlan

    : 过滤无线局域网数据包。

  1. 基于地址的过滤

  • host

    : 过滤特定主机的数据包。例如 host 192.168.1.100

  • net

    : 过滤特定网络的数据包。例如 net 192.168.1.0/24

  • port

    : 过滤特定端口的数据包。例如 port 80

  • src和`dst`: 分别过滤源地址和目的地址的数据包。例如 `src 192.168.1.100` 或 `dst 192.168.1.100`。

  1. 基于端口的过滤

  • tcp port

    : 过滤特定 TCP 端口的数据包。例如 tcp port 80

  • udp port

    : 过滤特定 UDP 端口的数据包。例如 udp port 53

  1. 逻辑操作符

  • and

    : 同时满足两个条件。例如 host 192.168.1.100 and tcp port 80

  • or

    : 满足任一条件。例如 host 192.168.1.100 or host 192.168.1.101

  • not或`!`: 排除满足条件的数据包。例如 `not host 192.168.1.100`。

  1. 基于数据包内容的过滤

  • contains

    : 检查数据包是否包含特定字符串。例如 tcp[20:] contains "GET"

  • less

    , greater: 比较数据包长度。例如 less 1500

  • =, `!=`, `>`, `<`: 比较操作符,用于 IP 地址、端口号等。

  1. 基于时间戳的过滤

  • less, `greater`: 基于时间戳的比较。
  1. 基于MAC地址的过滤

  • ether host

    : 过滤特定 MAC 地址的数据包。例如 ether host 00:11:22:33:44:55

  1. 基于VLAN的过滤

  • vlan

    : 过滤特定 VLAN 的数据包。例如 vlan 10

  1. 基于TCP标志的过滤

  • tcp flags

    : 基于 TCP 标志位过滤。例如 tcp[tcpflags] & tcp-syn != 0

  1. 基于IP选项的过滤

  • ip options

    : 基于 IP 选项过滤。

这些过滤方式可以组合使用,以实现更复杂的过滤逻辑。

例如,tcpdump host 192.168.1.100 and tcp port 80 将捕获来自或发往 192.168.1.100 且端口为 80 的 TCP 数据包。通过灵活运用这些过滤表达式,可以有效地捕获和分析网络中的特定流量。

四、实例

1. 捕获特定主机的所有流量

tcpdump host 192.168.1.100

这个命令将捕获所有源或目的地址为 192.168.1.100 的数据包。

2. 捕获特定端口的流量

tcpdump port 80

这个命令将捕获所有端口为 80(通常是 HTTP 服务)的数据包。

3. 捕获特定协议的流量

tcpdump tcp

这个命令将捕获所有 TCP 协议的数据包。

4. 捕获特定网络的流量

tcpdump net 192.168.1.0/24

这个命令将捕获所有源或目的地址在 192.168.1.0/24 网络范围内的数据包。

5. 捕获源地址或目的地址为特定主机的流量

tcpdump src or dst host 192.168.1.100

这个命令将捕获源或目的地址为 192.168.1.100 的数据包

6. 捕获特定端口和主机的流量

tcpdump src host 192.168.1.100 and port 80

这个命令将捕获源地址为 192.168.1.100 且端口为 80 的数据包。

7. 捕获特定 MAC 地址的流量

tcpdump ether host 00:11:22:33:44:55

这个命令将捕获源或目的 MAC 地址为 00:11:22:33:44:55 的数据包

8. 捕获特定 VLAN 的流量

tcpdump vlan 10

这个命令将捕获 VLAN ID 为 10 的数据包

9. 捕获特定 TCP 标志位的流量

tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0'

这个命令将捕获带有 SYN 或 ACK 标志位的 TCP 数据包

10. 捕获 HTTP GET 请求

tcpdump -nn -vv -X 'tcp[20:] matches "^GET |^Host: "

这个命令将捕获包含 “GET ” 或 “Host: ” 字符串的 HTTP 请求数据包,并以十六进制和 ASCII 码形式显示数据包内容

11. 捕获并保存数据包到文件

tcpdump -w capture.pcap

这个命令将捕获所有数据包并保存到名为 capture.pcap 的文件中,以便后续分析。

12. 从保存的文件中读取数据包

tcpdump -r capture.pcap

这个命令将从 capture.pcap 文件中读取并显示数据包。

13. 捕获特定时间范围内的数据包

tcpdump -G 3600 -W 1 -w capture -C 200

这个命令将每小时创建一个新的数据包文件,每个文件大小不超过 200MB,最多保留一个文件。

14. 捕获特定 TCP 端口的 SYN 数据包

tcpdump 'tcp[tcpflags] & tcp-syn != 0 and tcp port 80'

这个命令将捕获端口 80 上的 TCP SYN 数据包。