菜单

Loen
发布于 2025-07-23 / 0 阅读
0
0

tcpdump命令详解

tcpdump 是 Linux/Unix 系统中一款强大的命令行网络抓包工具,可实时捕获网络接口上的数据包并解析,常用于网络故障排查、协议分析、流量监控等场景。以下从基本语法、核心选项、过滤规则、高级用法及实用案例等方面详细讲解。

一、基本语法

tcpdump 的核心语法结构为:

tcpdump [选项] [过滤表达式]
  • 选项:控制抓包的行为(如指定接口、输出格式、保存文件等)。
  • 过滤表达式:筛选需要捕获的数据包(如指定主机、端口、协议等)。

二、核心选项详解

选项用于调整抓包的范围和输出方式,常用选项如下:

选项 作用 示例
-i <接口> 指定抓包的网络接口(如 eth0、lo);-i any表示所有接口 tcpdump -i eth0(抓 eth0 接口的包)
-n 不进行 DNS 解析(直接显示 IP,不转主机名) tcpdump -n(输出 IP 而非域名)
-nn 不解析 IP 和端口(端口显示数字,不转服务名如 80 不显示 http) tcpdump -nn(IP 和端口均为数字)
-v/-vv/-vvv 增加输出详细程度(v:基本详情;vv:更多协议细节;vvv:最详细) tcpdump -vv(显示较详细的包信息)
-c <数量> 只捕获指定数量的数据包后退出 tcpdump -c 10(抓 10 个包后停止)
-w <文件> 将捕获的原始数据包保存到文件(不解析,需用-r读取) tcpdump -w traffic.pcap(保存到 traffic.pcap)
-r <文件> 从保存的文件中读取数据包(用于离线分析) tcpdump -r traffic.pcap(读取 pcap 文件)
-s <长度> 设置抓包的 “快照长度”(默认 65535 字节,足够捕获完整包) tcpdump -s 0(捕获完整包,0 等价于 65535)
-A 以 ASCII 码显示数据包内容(适合查看 HTTP 等文本协议) tcpdump -A(直观查看数据包的文本内容)
-X 同时以十六进制和 ASCII 码显示数据包内容(兼顾二进制和文本) tcpdump -X(十六进制 + ASCII 混合显示)
-e 显示数据链路层信息(如 MAC 地址、VLAN 标签) tcpdump -e(输出包含源 / 目的 MAC)
-t 不显示时间戳 tcpdump -t(去掉输出中的时间)
-tttt 显示完整时间戳(格式:年 - 月 - 日 时:分: 秒。微秒) tcpdump -tttt(精确到微秒的时间)

三、过滤表达式(核心功能)

过滤表达式是 tcpdump 的灵魂,用于精准筛选目标数据包。表达式由 “类型 + 方向 + 协议” 组合而成,支持逻辑运算(and/or/not)。

1. 按 “类型” 过滤(指定目标对象)

类型用于限定数据包的来源 / 目标是 “主机”“网段” 还是 “端口”。

类型 含义 示例
host <IP/主机名> 匹配指定主机的数据包(源或目的为该主机) tcpdump host 192.168.1.100(抓与 192.168.1.100 相关的包)
net <网段> 匹配指定网段的数据包(如 192.168.1.0/24) tcpdump net 192.168.1.0/24(抓 192.168.1.x 网段的包)
port <端口> 匹配指定端口的数据包(源或目的端口) tcpdump port 80(抓 80 端口的包)
portrange <端口范围> 匹配端口范围(如 1-100) tcpdump portrange 1-100(抓 1 到 100 端口的包)

2. 按 “方向” 过滤(指定数据流向)

方向用于限定数据包是 “发送” 还是 “接收”。

方向 含义 示例
src <对象> 源为指定对象(主机 / 端口 / 网段) tcpdump src 192.168.1.100(抓源 IP 是 192.168.1.100 的包)
dst <对象> 目的为指定对象 tcpdump dst port 443(抓目的端口是 443 的包)
src or dst <对象> 源或目的为指定对象(默认行为,可省略) tcpdump src or dst host 10.0.0.1

3. 按 “协议” 过滤

直接指定协议类型,仅捕获该协议的数据包。

协议 含义 示例
tcp 传输控制协议(如 HTTP/HTTPS) tcpdump tcp(只抓 TCP 包)
udp 用户数据报协议(如 DNS) tcpdump udp(只抓 UDP 包)
icmp 互联网控制消息协议(如 ping) tcpdump icmp(只抓 ICMP 包)
arp 地址解析协议(IP 与 MAC 映射) tcpdump arp(抓 ARP 请求 / 应答包)
ip/ip6 IPv4/IPv6 协议 tcpdump ip6(只抓 IPv6 包)

4. 逻辑运算(组合条件)

支持and(且)、or(或)、not(非)组合多个条件,复杂条件可用括号()包裹(需转义\(`和`\))。

运算 示例 含义
and tcpdump host 192.168.1.100 and port 80 抓与 192.168.1.100 相关且端口为 80 的包
or tcpdump port 80 or port 443 抓 80 端口或 443 端口的包
not tcpdump not host 192.168.1.1 抓排除 192.168.1.1 的所有包
组合 tcpdump src 10.0.0.2 and\(port 80 or port 443\) 抓源为 10.0.0.2 且端口是 80 或 443 的包

四、高级过滤规则(协议细节)

针对特定协议的细节(如 TCP 标志位、数据包长度)过滤,适合深度分析。

规则 含义 示例
tcp flags <标志> 匹配 TCP 标志位(SYN/RST/ACK 等) tcpdump tcp flags syn(抓 TCP SYN 包,用于检测连接请求)
tcp [flags] & <掩码> != 0 更灵活的 TCP 标志匹配(如 SYN+ACK) tcpdump ‘tcp [13] & 0x12 != 0’(抓 SYN 或 ACK 包,0x12 对应 SYN (0x02)+ACK (0x10))
len <长度> 匹配数据包长度(小于 / 大于 / 等于) tcpdump len > 100(抓长度大于 100 字节的包)
icmp[icmptype] = <类型> 匹配 ICMP 类型(如 echo-request 是 ping 请求,echo-reply 是应答) tcpdump ‘icmp[icmptype] = icmp-echo’(抓 ping 请求包)
vlan 抓指定 VLAN ID 的包(需配合-e显示 VLAN 标签) tcpdump vlan 100(抓 VLAN 100 的包)

五、输出格式解读

tcpdump 的输出格式包含多个字段,以典型 TCP 包为例:

20:30:15.123456 IP 192.168.1.100.54321 > 203.0.113.5.80: Flags [P.], seq 12345:12390, ack 54321, win 65535, length 45

各字段含义:

  • 20:30:15.123456:时间戳(默认精确到微秒);
  • IP:网络层协议(此处为 IPv4);
  • 192.168.1.100.54321:源地址:源端口;
  • 203.0.113.5.80:目的地址:目的端口;
  • Flags [P.]:TCP 标志位(P表示 Push,.表示 ACK);
  • seq 12345:12390:TCP 序列号范围(该包数据从 12345 到 12390,长度 45 字节);
  • ack 54321:确认号(期望接收对方的下一个序列号);
  • win 65535:接收窗口大小(流量控制用);
  • length 45:数据包数据部分长度(字节)。

六、实用案例

结合上述知识,以下是常见场景的实战命令:

1. 监控特定端口的 HTTP 流量(80 端口)

tcpdump -i eth0 -nn -A 'port 80'
  • -A:以 ASCII 显示内容,可直接看到 HTTP 请求头 / 响应体;
  • 适合快速查看网页访问的 URL、参数等。

2. 捕获 ping(ICMP)交互

tcpdump -i any -tttt -vv 'icmp[icmptype] = icmp-echo or icmp[icmptype] = icmp-echoreply'
  • 抓取 ping 请求(icmp-echo)和应答(icmp-echoreply),-tttt显示完整时间,便于分析延迟。

3. 分析 TCP 三次握手 / 四次挥手

tcpdump -i eth0 -nn 'tcp port 80 and (tcp flags syn or tcp flags fin or tcp flags rst)'
  • 捕获 TCP 连接建立(SYN)、关闭(FIN)、重置(RST)的标志位包,用于分析连接异常(如频繁 RST 可能是服务崩溃)。

4. 保存抓包文件供后续分析(如用 Wireshark)

tcpdump -i eth0 -w traffic.pcap 'host 192.168.1.100'  # 保存到文件tcpdump -r traffic.pcap  # 读取文件分析
  • 大流量场景下,先保存到.pcap文件,再用 Wireshark 图形化分析更高效。

5. 排除 DNS 流量(减少干扰)

tcpdump -i any -nn 'not port 53'
  • DNS 默认端口是 53(UDP/TCP),排除后可聚焦业务流量。

七、注意事项

  1. 权限:tcpdump 需要 root 权限(或CAP_NET_RAW能力),普通用户执行会报错;
  2. 性能:无过滤条件时会捕获所有包,可能占用大量 CPU / 磁盘 IO,建议用过滤表达式缩小范围;
  3. 快照长度:默认-s 65535可捕获完整包,若只需分析头部,可减小(如-s 128)提升效率;
  4. 输出干扰:实时抓包时输出会刷屏,可结合tee保存到文件同时查看:tcpdump … | tee capture.log。

通过上述内容,可掌握 tcpdump 的核心用法,结合实际场景灵活组合选项和过滤规则,即可高效完成网络分析任务。


评论