查看博客目录

玩转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 数据包。