首页/网络/抓包与流量分析速查/隧道内层流量判读
丢包与时延定位60 条

隧道内层流量判读

VXLAN/GRE/IPIP 等隧道:抓包默认看外层,需按内层协议再解析;丢包定位要分别看"外层可达性"与"内层完整性"。

隧道流量的双层结构

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 == 4789VXLAN 默认端口改成非默认端口时先用实际端口过滤
vxlan.vni隧道标识按 VNI 分组,避免多租户流量混淆
vxlan.flags标志位确认 VNI 字段是否有效
ip.proto == 47GRE 封装GRE 没有端口,只能靠协议号识别
frame.len整帧长度包含外层开销,不能直接当内层 MTU 用
隧道环境要预留外层开销:外层 IP 头、UDP 头、VXLAN 头与内层以太头合计约 50 字节。物理链路 MTU 1500 时内层可用约 1450,配置成 1500 会直接造成内层大包丢失,这也是「ping 小包正常、传文件卡住」的常见原因。
同一 VNI 在不同主机上抓包时必须给文件或抓包点打标签(主控文件名或注释),否则内层流量混在一起,时序推导很容易得出错误结论。

排查顺序

  • 先确认外层隧道有流量:VNI 或协议号能否过滤出封装包
  • 再看内层是否有对应报文,判断问题在隧道还是业务
  • 检查两端 MTU 与分片设置,重点看内层大包是否被丢
  • 核对两端封装参数:VNI、目的端口、协议号是否一致
  • 多点抓包对照,明确丢包发生在隧道的哪一段

易错点

  • 只看外层就下结论:外层正常不代表内层完整,两层必须分别统计
  • 忽略封装开销直接按 1500 配内层 MTU:大包必然被丢,且现象容易被误判成应用故障
  • 按内层字段直接过滤而不限定外层:同名字段在外层也会命中,统计口径混乱
  • 把多主机、多 VNI 的抓包合并分析而不加标识:时序与丢包结论都会失真

数据来源与参考

  • RFC 7348(VXLAN)
  • RFC 2784(GRE)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌