Linux网络抓包利器:tcpdump 详细使用指南

1. 概述

tcpdump 是 Linux 系统自带的命令行网络抓包工具,能够捕获和分析流经网络接口的数据包,是网络故障排查、协议分析、安全审计的必备工具。它支持丰富的过滤表达式,可以精确捕获特定类型的数据包,并以可读格式或文件形式输出,供后续分析使用。

2. 基本语法与常用选项

tcpdump 的基本命令格式为:

bash 复制代码
tcpdump [选项] [过滤表达式]

2.1 常用选项详解

-i:指定网络接口

默认情况下,tcpdump 会抓取第一个非回环接口的数据包。使用 -i 可以明确指定要监听的网卡。

bash 复制代码
# 抓取 eth0 网卡的所有数据包
tcpdump -i eth0

# 抓取所有接口的数据包
tcpdump -i any
-c:限制抓包数量

当只需要分析少量数据包时,使用 -c 可以避免抓取过多数据导致输出刷屏或文件过大。

bash 复制代码
# 只抓取 10 个包
tcpdump -i eth0 -c 10
-w:将抓包数据保存到文件

将原始数据包保存为 .pcap 格式文件,便于使用 Wireshark 等图形化工具进行深入分析。

bash 复制代码
# 抓取10个包并保存到文件
tcpdump -i eth0 -c 10 -w mypackets.pcap
-r:读取抓包文件

从之前保存的 .pcap 文件中读取并分析数据包。

bash 复制代码
# 读取并分析保存的抓包文件
tcpdump -r mypackets.pcap
-n:不进行域名解析

默认情况下,tcpdump 会尝试将 IP 地址解析为域名。使用 -n 选项可以禁用此功能,直接显示 IP 地址,加快显示速度并避免因 DNS 查询导致的输出延迟。

bash 复制代码
# 不解析域名,直接显示IP
tcpdump -n -i eth0 port 80
-nn:不进行端口和域名解析

-nn-n 的增强版,它同时禁止端口号到服务名称的转换(如 80 显示为 http)。

bash 复制代码
# 不解析域名和端口服务名
tcpdump -nn -i eth0 host 192.168.1.100
-v/-vv/-vvv:增加输出详细程度

-v 系列选项用于控制输出信息的详细级别,-vvv 提供最详细的输出,包括完整的协议解码信息。

3. 核心:过滤表达式

过滤表达式是 tcpdump 的灵魂,它决定了哪些数据包会被捕获。表达式由原语 (类型、方向、协议)和运算符and, or, not)组成。

3.1 类型原语

  • host : 指定主机(IP 或域名)

    bash 复制代码
    tcpdump host www.baidu.com
    tcpdump host 192.168.88.111
  • net : 指定网络段

    bash 复制代码
    tcpdump net 192.168.88.0/24
  • port : 指定端口

    bash 复制代码
    tcpdump port 80
    tcpdump port 22
  • portrange : 指定端口范围

    bash 复制代码
    tcpdump portrange 20-23

3.2 方向原语

  • src: 源地址/端口
  • dst: 目标地址/端口
  • 不指定方向则匹配双向流量。

3.3 协议原语

  • tcp , udp , icmp , arp 等。

4. 实用案例解析

以下案例基于您提供的问题描述进行详细解释和扩展。

案例 1:抓取指定主机和端口的数据包

bash 复制代码
# 抓取访问本机 22 端口 (SSH) 的数据包
tcpdump -n -i eth0 dst port 22

# 抓取与 www.baidu.com 在 80 端口通信的数据包
tcpdump -n -i eth0 host www.baidu.com and port 80

案例 2:按源/目标地址过滤

bash 复制代码
# 只抓取源地址是 192.168.88.111 的数据包
tcpdump -i eth0 -nn src host 192.168.88.111

# 只抓取目标地址是 192.168.88.0/24 网段的数据包
tcpdump -i eth0 -nn dst net 192.168.88.0/24

案例 3:组合条件与排除

bash 复制代码
# 抓取除 80 端口外的所有 TCP 数据包
tcpdump -i eth0 -vnn tcp and not port 80

# 抓取源网段为 192.168.88.0/24 且目标端口为 80 的数据包
tcpdump -i eth0 -vnn src net 192.168.88.0/24 and dst port 80

案例 4:复杂逻辑组合

使用括号来组合复杂的逻辑条件(注意:在 shell 中通常需要转义或使用引号)。

bash 复制代码
# 抓取主机 192.168.88.111 访问 22 端口,或主机 192.168.88.112 访问 80 端口的数据包
tcpdump -i eth0 -vnn '(host 192.168.88.111 and port 22) or (host 192.168.88.112 and port 80)'

5. 进阶技巧与输出解读

5.1 解读典型输出

一个典型的 TCP 数据包输出如下:

复制代码
19:48:32.123456 IP 192.168.1.100.54321 > 93.184.216.34.80: Flags [P.], seq 1:100, ack 1, win 229, length 99
  • 19:48:32.123456: 时间戳
  • IP: 协议为 IPv4
  • 192.168.1.100.54321 > 93.184.216.34.80: 源 IP:端口 > 目标 IP:端口
  • Flags [P.]: TCP 标志位 (P=PUSH, . 表示 ACK)
  • seq 1:100: 序列号范围
  • ack 1: 确认号
  • win 229: 窗口大小
  • length 99: 数据段长度

5.2 其他有用选项

  • -A: 以 ASCII 格式打印每个数据包(不包括链路层头部)。适用于查看文本协议(如 HTTP)。

  • -X: 同时以十六进制和 ASCII 格式打印每个数据包。

  • -s : 设置抓取数据包的快照长度(-s 0 表示抓取完整数据包)。

  • -l : 使标准输出变为行缓冲,便于通过管道实时查看。

    bash 复制代码
    tcpdump -l -i eth0 port 80 | grep "GET"

6. 总结

tcpdump 功能强大,是每一位系统管理员、网络工程师和安全研究员的必备技能。掌握其核心选项和过滤表达式语法,能够快速定位网络问题、分析应用协议交互、排查安全事件。建议在实际环境中多加练习,结合 -w 选项保存数据包,并使用 Wireshark 进行更直观的图形化分析,以加深理解。