查看博客目录
玩转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 可能支持的选项有所不同。
三、过滤表达式
-
tcp: 过滤 TCP 协议数据包。
-
udp: 过滤 UDP 协议数据包。
-
icmp: 过滤 ICMP 协议数据包。
-
arp: 过滤 ARP 协议数据包。
-
ip: 过滤 IP 协议数据包。
-
ether: 过滤以太网帧。
-
wlan: 过滤无线局域网数据包。
-
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`。
-
tcp port: 过滤特定 TCP 端口的数据包。例如
tcp port 80。 -
udp port: 过滤特定 UDP 端口的数据包。例如
udp port 53。
-
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`。
-
contains: 检查数据包是否包含特定字符串。例如
tcp[20:] contains "GET"。 -
less,
greater: 比较数据包长度。例如less 1500。 -
=, `!=`, `>`, `<`: 比较操作符,用于 IP 地址、端口号等。
less, `greater`: 基于时间戳的比较。
-
ether host: 过滤特定 MAC 地址的数据包。例如
ether host 00:11:22:33:44:55。
-
vlan: 过滤特定 VLAN 的数据包。例如
vlan 10。
-
tcp flags: 基于 TCP 标志位过滤。例如
tcp[tcpflags] & tcp-syn != 0。
-
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 数据包。