首页/网络/抓包与流量分析速查/tcpdump 抓 ESP 加密流量

tcpdump 抓 ESP 加密流量

IPsec 的 ESP(协议号 50)承载加密载荷,抓包只能看到外层地址、SPI 与序列号;用于确认隧道是否建立、报文是否到达。

ESP 报文与抓包边界

IPsec 的 ESP 使用 IP 协议号 50 承载加密载荷,报文里只有外层 IP 头、安全参数索引(SPI)与序列号是明文的,内层原始数据包整体被封装加密。因此对 ESP 抓包能回答的问题是有限的:隧道有没有真正建立、双向报文是否都在走、封装后的长度是否符合预期、有没有被策略静默丢弃。想看内层应用内容,只能在两端解密后或借助设备上的解密能力。

基本信息

适用平台Linux、BSD、macOS 的 tcpdump;Wireshark 同样可解
过滤语法ip proto esp 或 ip proto 50,可再叠加 host
相关协议AH 协议号 51;NAT 穿越场景封装在 UDP 4500
权限要求需要 root 或具备抓包能力(cap_net_raw)

典型使用场景

  • VPN 隧道建不起来,确认两端之间到底有没有 ESP 报文往来
  • 单向能通双向不通,核对两个方向是否都有封装流量
  • 对比封装前后报文长度,判断加密与封装开销是否合理
  • 验证 NAT 穿越场景下是否已改用 UDP 4500 承载
  • 设备侧策略变更后确认是否把 ESP 一并拦掉了
  • 为「内网应用看不到」类问题提供「已被加密承载」的直接证据

常用示例

常用示例
tcpdump -i eth0 -nn 'ip proto 50' -c 10                 # 只看前 10 个 ESP 报文
tcpdump -i eth0 -nn 'ip proto 50 and host 198.51.100.7' # 限定对端
# 加上 -v 可以看到 SPI 与序列号等字段
# 抓不到时先确认隧道是否已建立、规则是否拦掉了协议 50
# NAT 场景改看 UDP 4500: tcpdump -i eth0 -nn 'udp port 4500'

输出逐列读法

输出内容含义正常与异常
时间戳报文到达时间用于与两端日志对齐,注意设备时钟
源与目的地址隧道两端外层地址方向缺失说明单向不通或抓包点偏离
ESP(spi=0x…)安全参数索引,标识一条安全联盟同一隧道的 SPI 应稳定,频繁变化需查协商
seq=0x…抗重放序列号同一 SPI 下应单调递增,跳变可提示重建
length封装后总长度明显偏小或为整倍数异常时查封装参数
ESP 没有端口概念,用端口过滤一定抓不到;按协议号过滤才是正确入口。
NAT 场景下 ESP 会被封装进 UDP 4500,抓不到协议 50 并不代表隧道没通,改抓 4500 再看。

易错点

  • 按端口过滤 ESP:ESP 不带端口信息,过滤条件写错会得出「隧道完全没流量」的错误结论
  • 抓不到协议 50 就判定隧道故障:NAT 穿越与部分实现会改用 UDP 4500 封装,判据不完整
  • 在中间设备上抓包忽视策略影响:被过滤的报文不会出现在抓包点,需要与两端日志交叉验证
  • 直接尝试解析内层内容:ESP 载荷加密,未解密时只能核对封装与流量存在性

数据来源与参考

  • man 8 pcap-filter
  • RFC 4303(IPsec ESP)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌