个人认为,理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。
因此本文将在 GRE 协议报文的基础上进行介绍。
GRE 相关 RFC 文档:
- 关于 GRE 的基本内容介绍,可参考RFC1701-Generic Routing Encapsulation (GRE)。
- 关于 IPv4 GRE 的可选 Routing 字段格式,可参考RFC1702-Generic Routing Encapsulation over IPv4 networks。
- 关于增强 GRE header 的封装格式,可参考RFC2637-Point-to-Point Tunneling Protocol (PPTP)。
- 关于 GRE 的基本内容介绍,可参考RFC2784-Generic Routing Encapsulation (GRE)。
- 关于扩展 GRE header 的相关原理,可参考RFC2890-Key and Sequence Number Extensions to GRE。
- 关于移动网络下的扩展 GRE header,可参考RFC6245-Generic Routing Encapsulation (GRE) Key Extension for Mobile IPv4。
其他相关资料可参考:
- 关于Ethernet帧中标识上层协议类型的Type字段的分类,可参考IANA发布的IEEE 802 Numbers。
- 关于IPv4/IPv6包中标识上层协议类型的Protocol字段的分类,可参考IANA发布的Protocol Numbers。
- 关于GRE header的格式分类,可参考IANA发布的Generic Routing Encapsulation (GRE) Parameters。
…
GRE的原理还存在其他相关RFC,感兴趣者可查阅相关资料。
个人能力有限,有问题可私信交流。
目录
Generic Routing Encapsulation
1.背景介绍
Tunnel:隧道本质上是一种绕过传统路由机制的源路由。隧道提供了绕过路由故障、避免网关和路由域损坏或建立确定性试验路径的方法。同时隧道可以提供报文在异种网络中传输的功能。GRE 就是这种隧道协议。
GRE:Generic Routing Encapsulation,通用路由封装。GRE 协议是一种通用的隧道封装协议,可以将一种协议的报文封装在另一种协议报文中的机制。
Passenger Protocol:乘客协议。作为 GRE 封装的源数据/源数据协议。
Transport Protocol:传输协议。GRE 完成封装后,由传输协议将封装数据进行传输。从报文上体现为添加了一个 Delivery Header。
GRE的应用:GRE 作为隧道,可以实现 IPv4/IPv6 孤岛互通。这种效果也是一种 VPN 的实现效果。此外,由于 Passenger Protocol 在传输过程中作为 Payload 不变,这样也可以实现超 TTL=255 网络的访问。
2.GRE基本原理
2.1.GRE封装格式-RFC1701/RFC2784
在 1994 年发布的《RFC1701-Generic Routing Encapsulation (GRE)》 中将 GRE 的工作原理解释为:
内层协议作为 Payload 经 GRE 封装后被外层协议承载。
此处展示一个 IPv4 Over IPv4 GRE 的报文实例。
同时在 RFC1701 中定义了 GRE Header 格式:
C-bit:1-bit,Checksum Present。如果 C-bit 置位,则 GRE Header 将包含 2 字节的 Checksum 字段。
R-bit:1-bit,Routing Present。如果 R-bit 置位,则 GRE Header 将包含 2 字节的 Offset 和不定长的 Routing 字段,同时也包含 Checksum 字段。
K-bit:1-bit,Routing Present。如果 K-bit 置位,则 GRE Header 将包含 4 字节的 Key 字段。
S-bit:1-bit,Sequence Number Present。如果 S-bit 置位,则 GRE Header 将包含 4 字节的 Sequence Number 字段。
s-bit:1-bit,Strict Source Route。仅在所有路由信息都由严格源路由组成时才将此位置位。
Recur-bit:3-bit,Recursion Control。应默认为 0。
Flags:5-bit,应默认为 0。用于指示包含允许的附加封装数量。
Version:3-bit,Version Number。标识版本,应置为 0。
当 Version Number=1 时,表示 Enhanced GRE Header。
在RFC2637中定义了Enhanced GRE Header格式。
Protocol Type:2 字节,用于指示内层乘客协议类型。关于Ethernet帧中标识上层协议类型的Type字段的分类,可参考IANA发布的IEEE 802 Numbers。
自动换行
Checksum:2 字节的可选字段。对 GRE 头及其负载的校验和。
Offset:2 字节的可选字段。表示从 Routing 字段的开始到要检查的活动 Source Route Entry 的第一个八位字节的八位字节偏移量。
Key:4 字节的可选字段。封装节点封装该字段,解封装节点用于验证数据包。
Sequence Number:4 字节的可选字段。封装节点封装该字段,解封装节点确定数据包从封装器传输到接收方的顺序。
Routing:不定长的可选字段。包含一系列 Source Route Entries (SREs)。
每一条 Source Route Entry 具有如下格式:
Address Family:2 字节,指示 Routing Information 字段的语法和语义。
SRE Offset:1 字节,指示从 Routing Information 字段的起点到要检查的 Active SRE 的偏移量。
SRE Length:1 字节,指示 SRE 的字节数。如果为 0,表示这是最后一个 SRE。
Routing Information:不定长,可用于路由此数据包的数据。
同时在 RFC2784 中定义了 GRE Header 格式:
在 2000 年发布的《RFC2784-Generic Routing Encapsulation (GRE)》 中定义了新的 GRE Header。
Reserved0:12-bits 的保留字段。如果 1–5 bits 不是全0,则该报文会被丢弃。其他字段应设置为 0。
Reserved1:2 字节的保留字段。仅当 Checksum 字段存在时,Reserved1 字段才存在且必须以零形式传输。
尽管 RFC2784 已抛弃 RFC1701 中的定义的各种 Flag 字节,但仍接受兼容处理。也即除非接收方实现 RFC1701,否则必须丢弃 Reserved0 字段中第 1-5 位中任何 bit 为非零位的数据包。
2.2.GRE配置示例
此处只提供了 CE1/PE1 设备的关键配置,而省略了打通 underlay 的相关配置。有能力者可自行进行其它设备的配置。
有需要者可私信联系提供模拟器源文件及配置。
interface GigabitEthernet0/0/1
ipv6 enable
ipv6 address 2001:DB8:1::1/64
ipv6 address FE80:1::1 link-local
#
interface LoopBack1
ip address 1.1.1.1 255.255.255.255
#
interface Tunnel0/0/0
ipv6 enable
ipv6 address FE80:12::1 link-local
tunnel-protocol gre
keepalive period 30 retry-times 2
source 1.1.1.1
destination 2.2.2.2
gre key 10
gre checksum
#
ip route-static 2.2.2.2 255.255.255.255 10.1.2.2
#
ipv6 route-static 2001:DB8:2:: 64 Tunnel0/0/0
#
经如上配置,C-bit 置位,K-bit 置位。
GRE隧道保活报文。
3.扩展阅读之ERSPAN
当前最常见的网络监控和故障排除工具之一是 SPAN (Switch Port Analyzer,交换端口分析) 功能,也称为端口镜像。它允许用户以非侵入性方式监控网络流量,并将受监控流量的副本发送到本地或远程设备,这些设备可以是嗅探器、入侵检测系统 (IDS) 或其他类型的网络分析工具。
ERSPAN (Encapsulated Remote Switch Port Analyzer,远程封装镜像分析) 功能是指源网络设备将用户感兴趣的流量部分,过滤复制封装到特殊“容器超级帧”作为载荷中一直路由到接收器设备中。接收器设备将其解封装并完全恢复原始受监控的以太网帧或其选定部分。
在IANA机构 2017 年发布的草案Draft-foschiano-erspan-03-(Cisco Systems’ Encapsulated Remote Switch Port Analyzer (ERSPAN))中定义的 ERSPAN 功能中借用 GRE 协议来封装数据流。
其中定义了 3 种 ERSPAN type。
3.1.三种 ERSPAN type
ERSPAN Type I:
此种 GRE Header 中标识内层协议 Code=0x88BE。其他字段置 0。这种格式的优点是尺寸比 II 型更紧凑,因此实施成本更低。
其中GRE Header的protocol字段取0x88BE表示进行ERSPAN封装。同时GRE Header其他字段置0。
自动换行
ERSPAN Type II:
在 ERSPAN Type II 中 GRE Header 中 S-bit=1,因此还包含 4 字节的 Sequence Number 字段,用于标识数据包传递顺序。同时包含了 ERSPAN Header 和 CRC 字段。
但是封装的原始镜像帧不包括原始 CRC,ERSPAN 帧解封装后无法验证原始帧的CRC 正确性。
ERSPAN Type II Header:
Version:4-bits,Type II时取1。
VLAN:12-bits,原始帧的VLAN。EN 字段取11时,置0。
COS:3-bits,优先级字段。
EN:2-bits, ERSPAN 源端口关联的封装类型。取00时表示不带 VLAN 标记;01表示ISL封装;10表示802.1Q封装;11表示帧中保留的 VLAN 标记。
T:1-bit,Truncated截断标识。在ERSPAN封装超过MTU时出现。
Session ID:10-bits,标识 ERSPAN 会话。ERSPAN的源和目的应当唯一。
Index:20-bits,标识 ERSPAN 源端口号及流量方向。
自动换行
ERSPAN Type III:
Type III 引入了更大、更灵活的复合头,以支持对网络管理、入侵检测、性能和延迟分析等应用有用的其他字段,这些应用需要了解镜像帧的所有原始参数,包括原始帧本身中不存在的参数。
ERSPAN Type III Header:
BSO:2-bits,用于标识载荷完整性校验。取00时表示不带无错误或未知完整性;01表示短帧;10表示超帧;11表示CRC错误帧或排列错误。
Timestamp:4字节,用于数据同步。
SGT:2字节,Security Group Tag。
P-bit:1-bit,标识上层协议为Ethernet。
FT:5-bits,Frame Type标识镜像帧是否跳过L2 encapsulation header。
Hw ID:6-bits,Hardware ID用于ESRPAN系统唯一标识。
D-bit:1-bit,Direction标识。取0标识Ingress,取1标识Egress。
Gra:2-bis,Timestamp Granularity时间戳单位。
O-bit:1-bit,Optional-bit标识是否具有8字节的Platform Specific SubHeader字段。
自动换行
8字节的Platform Specific SubHeader:
Platf ID:6-bits,标识解析随后的可选特定于平台的Sub-Header。
Platform Specific Info:58-bits,特殊设备使用。
在草案原文中给出了Platform Specific SubHeader的详细分类,此处不再介绍。感兴趣者可阅读原文
3.2.ERSPAN configuration
此处仅记录下,可查到的 ERSPAN 配置资料。设备实际配置请查阅相关资料。
Switch1:
Switch1(config)# monitor session 1 type erspan-source
Switch1 (config-mon-erspan-src)# source interface fa0/1
Switch1 (config-mon-erspan-src)# destination
Switch1 (config-mon-erspan-src-dst)# erspan-id 110 < — This ID must be the same on Switch2
Switch1 (config-mon-erspan-src-dst)# ip address 10.10.10.10 < — ip address on switch2
Switch1(config-mon-erspan-src-dst)# origin ip address 172.16.10.10 < — ip address on switch 1
Switch2:
Switch2_Remote (config)# monitor session 1 type erspan-destination
Switch2_Remote (config-mon-erspan-dst)# destination interface fa0/5
Switch2_Remote (config-mon-erspan-dst)# source
Switch2_Remote (config-mon-erspan-dst-src)# erspan-id 110
Switch2_Remote (config-mon-erspan-dst-src)# ip address 10.10.10.10 < — IP address on switch 2
对于Cisco ASR1000、Catalyst 6500 or 7600可支持如上配置。