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 再看。