隧道流量的双层结构
VXLAN、GRE、IPIP 这类隧道会在原始报文外面再封装一层。抓包工具默认只解析外层,要看被封装的内层流量必须让解析器展开内层协议。丢包定位要分两步:外层可达性,也就是封装包能否从隧道一端走到另一端;内层完整性,也就是内层报文有没有被丢或截断。这两类问题的现象与结论完全不同,混在一起分析最容易跑偏。
基本信息
| 常见封装 | VXLAN(UDP 4789)、Geneve(UDP 6081)、GRE(IP 协议号 47)、IPIP(协议号 4) |
|---|---|
| 关键字段 | vxlan.vni、vxlan.flags、ip.proto、gre.proto |
| 外层开销 | VXLAN 约 50 字节(外层 IP、UDP、VXLAN 头与内层以太头之和) |
| 适用平台 | Wireshark 4.x 会分层显示 Outer 与 Inner 字段 |
典型使用场景
- 跨机房或容器网络里定位内层业务不通,先分清是隧道断还是业务断
- 排查内层大包丢失而小包正常:封装后 MTU 变小导致的典型现象
- 按 VNI 区分不同租户或网段的流量,避免跨租户混看
- 核对隧道两端封装参数是否匹配(VNI、端口、协议号)
- 佐证问题层级:外层通而内层不通,指向封装与 MTU 而不是底层链路
解开隧道看内层
解开隧道看内层
tshark -r t.pcap -Y "vxlan" -T fields -e ip.src -e ip.dst -e vxlan.vni
# 外层端点与 VNI,先确认隧道有流量
tshark -r t.pcap -Y "vxlan.vni==100" -T fields -e frame.number -e frame.len
# 只看指定 VNI,frame.len 含外层开销,评估 MTU 时要减去
tshark -r t.pcap -Y "ip.proto==47 || udp.port==4789" -q -z io,phs
# 先看封装协议占比,再决定展开哪一层字段逐项读法
| 字段 | 含义 | 提示 |
|---|---|---|
| udp.port == 4789 | VXLAN 默认端口 | 改成非默认端口时先用实际端口过滤 |
| vxlan.vni | 隧道标识 | 按 VNI 分组,避免多租户流量混淆 |
| vxlan.flags | 标志位 | 确认 VNI 字段是否有效 |
| ip.proto == 47 | GRE 封装 | GRE 没有端口,只能靠协议号识别 |
| frame.len | 整帧长度 | 包含外层开销,不能直接当内层 MTU 用 |
隧道环境要预留外层开销:外层 IP 头、UDP 头、VXLAN 头与内层以太头合计约 50 字节。物理链路 MTU 1500 时内层可用约 1450,配置成 1500 会直接造成内层大包丢失,这也是「ping 小包正常、传文件卡住」的常见原因。
同一 VNI 在不同主机上抓包时必须给文件或抓包点打标签(主控文件名或注释),否则内层流量混在一起,时序推导很容易得出错误结论。
排查顺序
- 先确认外层隧道有流量:VNI 或协议号能否过滤出封装包
- 再看内层是否有对应报文,判断问题在隧道还是业务
- 检查两端 MTU 与分片设置,重点看内层大包是否被丢
- 核对两端封装参数:VNI、目的端口、协议号是否一致
- 多点抓包对照,明确丢包发生在隧道的哪一段