第215篇:GRE 隧道与 Overlay 网络

关键词:GRE、通用路由封装、Overlay网络、隧道协议、协议号47、MTU调整、隧道接口、Multipoint GRE

一、引言

前面几篇文章系统介绍了 IPsec VPN 的各种应用场景,包括站点到站点 VPN 和远程用户接入。IPsec 提供了加密和认证的安全通道,但其本身只能封装 IP 流量,且加密后的报文无法被中间设备检查。在实际网络中,有时需要在两个站点之间建立一条"透明管道",让任意协议(不仅仅是 IP)穿越公共网络。

GRE(Generic Routing Encapsulation,通用路由封装)协议应运而生。GRE 是一种简单的隧道封装协议,可以在 IP 网络之上承载各种网络层协议,是实现 Overlay 网络的基础技术。

二、核心概念

2.1 GRE 基本原理

GRE 通过在原始报文外层添加一个 GRE 头部和一个新的 IP 头部,将任意网络层协议封装为可在 IP 网络上传输的数据包。GRE 隧道建立后,两台远端设备之间形成一条逻辑上的直接连接,隧道两端的网络仿佛通过一条直连链路相连。

2.2 GRE 报文格式

GRE 报文由外层 IP 头部、GRE 头部和原始报文三部分组成:

字段 长度 说明
外层 IP 头部 20-60 字节 源 IP:隧道源端公网 IP;目的 IP:隧道对端公网 IP;协议号:47(GRE)
GRE 头部 4-8 字节 标志/版本(2 字节)+ 协议类型(2 字节),可选 Key/Seq(4 字节)
原始报文 可变长度 被封装的原始网络层报文

GRE 协议类型字段标识被封装的协议:

协议类型 值 说明
IPv4 0x0800 最常见的被封装协议
IPv6 0x86DD IPv6 报文
Ethernet 0x8137 以太网帧(可承载二层协议)
ARP 0x0806 ARP 请求/响应
IPX 0x0805 IPX 协议(遗留系统)

2.3 GRE 与 IPsec 对比

对比维度 GRE 隧道 IPsec 隧道
加密 无 支持(ESP)
认证 可选(GRE Key) 支持(AH/ESP)
封装协议 任意网络层协议 仅 IP 协议
协议开销 较小(24-28 字节) 较大(36-56 字节)
路由协议 可承载 OSPF、IS-IS 等 可承载(需先 GRE)
MTU 影响 需要调整 MTU 需要调整 MTU(更大)
适用场景 Overlay 网络、路由协议承载 加密通信

2.4 Overlay 网络概念

Overlay 网络(叠加网络)是在底层物理网络(Underlay)之上构建的逻辑网络。Underlay 网络负责实际的物理传输,Overlay 网络提供逻辑连接和灵活的网络策略。

Overlay 网络概念 - 图示

三、技术细节

3.1 GRE 隧道建立与数据传输

GRE 隧道建立与数据传输 - 图示

3.2 GRE 隧道运行 OSPF

在 GRE 隧道接口上运行 OSPF 等路由协议,可以让远端站点之间自动学习路由,无需手动配置静态路由:

  1. GRE 隧道被视为点对点链路
  2. 隧道两端接口配置 OSPF 网络类型(默认点到点)
  3. OSPF Hello 报文在 GRE 隧道中正常传输
  4. 隧道两端自动建立 OSPF 邻接关系

3.3 MTU 与 MSS 调整

GRE 隧道的额外封装(外层 IP 头 20 字节 + GRE 头 4 字节 = 24 字节)会导致原始报文的 MTU 超出物理接口的 MTU。如果不对 MTU 进行调整,大报文在传输过程中会被分片或丢弃。

调整方式 配置 说明
隧道接口 MTU mtu 1476 隧道接口 MTU = 物理MTU(1500) - 封装开销(24)
TCP MSS 钳制 tcp adjust-mss 1452 对 TCP SYN 报文修改 MSS 值,避免分片
IP 分片 默认开启 允许 IP 层对超大数据包进行分片

3.4 Multipoint GRE (mGRE)

标准 GRE 隧道是点到点的,隧道目的地址在创建时固定。Multipoint GRE 允许一个隧道接口连接多个对端,常用于动态隧道场景(如 DMVPN)。

特性 标准 GRE Multipoint GRE
隧道对端 固定 动态(NHRP 解析)
接口类型 点对点 非广播多访问(NBMA)
路由协议 OSPF 点到点 EIGRP / OSPF NBMA
适用场景 固定站点互联 动态分支互联

四、实战配置/案例分析

4.1 华为 AR 路由器:GRE 隧道基础配置

# ========== 站点A配置 ==========
system-view
sysname SiteA-Router

# 公网接口
interface GigabitEthernet 0/0/1
 ip address 203.0.113.1 255.255.255.252
 quit

# 内网接口
interface GigabitEthernet 0/0/0
 ip address 10.1.1.1 255.255.255.0
 quit

# GRE隧道接口
interface Tunnel 0
 ip address 169.254.0.1 255.255.255.252
 tunnel-protocol gre
 tunnel source 203.0.113.1
 tunnel-destination 198.51.100.1
 mtu 1476
 quit

# 到站点B内网的路由
ip route-static 10.2.1.0 255.255.255.0 Tunnel 0
# 站点B内网到公网的兜底路由
ip route-static 10.2.1.0 255.255.255.0 169.254.0.2

# ========== 站点B配置 ==========
system-view
sysname SiteB-Router

# 公网接口
interface GigabitEthernet 0/0/1
 ip address 198.51.100.2 255.255.255.252
 quit

# 内网接口
interface GigabitEthernet 0/0/0
 ip address 10.2.1.1 255.255.255.0
 quit

# GRE隧道接口
interface Tunnel 0
 ip address 169.254.0.2 255.255.255.252
 tunnel-protocol gre
 tunnel source 198.51.100.2
 tunnel-destination 203.0.113.1
 mtu 1476
 quit

# 到站点A内网的路由
ip route-static 10.1.1.0 255.255.255.0 Tunnel 0

4.2 GRE 隧道上运行 OSPF

# ========== 站点A:在GRE隧道上运行OSPF ==========
interface Tunnel 0
 ospf network-type p2p
 quit

ospf 1 router-id 1.1.1.1
 area 0
  network 169.254.0.0 0.0.0.3
  network 10.1.1.0 0.0.0.255
 quit
quit

# ========== 站点B:在GRE隧道上运行OSPF ==========
interface Tunnel 0
 ospf network-type p2p
 quit

ospf 1 router-id 2.2.2.2
 area 0
  network 169.254.0.0 0.0.0.3
  network 10.2.1.0 0.0.0.255
 quit
quit

4.3 故障排查案例:GRE 隧道 ping 通但 OSPF 无法建立邻接

故障现象:两台路由器之间的 GRE 隧道已配置完成,隧道两端可以互相 ping 通隧道 IP,但 OSPF 邻居始终无法建立。

排查步骤:

  1. 检查隧道接口状态
display interface Tunnel 0

显示隧道接口 UP,物理接口 UP,MTU 为 1476。

  1. 检查 OSPF 邻居状态
display ospf peer

显示无 OSPF 邻居。

  1. 抓包分析 OSPF 报文
packet-capture capture-name ospf-gra interface Tunnel 0
ospf
display packet-capture ospf-gra

发现 OSPF Hello 报文正常发出,但无回应。

  1. 检查对端隧道 IP 路由
display ip routing-table 198.51.100.1

发现到达对端公网 IP 的路由指向了错误的出口接口(存在两条到达对端 IP 的路由,一条通过运营商 A,一条通过运营商 B,静态路由优先级导致走了不通的路径)。

  1. 根因分析 GRE 隧道的建立依赖底层 IP 路由。如果到达对端隧道目的 IP(公网 IP)的路由不正确,GRE 报文无法到达对端。虽然 ping 隧道 IP 可以通(因为 ping 使用的是默认路由),但 OSPF Hello 报文封装在 GRE 中传输,如果底层路由不一致,可能导致报文绕行或丢失。

  2. 解决方案

# 方法一:使用策略路由确保GRE报文走正确路径
traffic classifier GRE-Traffic
 if-match destination-ip address 198.51.100.1 32
quit

traffic behavior GRE-Behavior
 apply outgoing-interface GigabitEthernet 0/0/1
quit

traffic policy GRE-Policy
 classifier GRE-Traffic behavior GRE-Behavior
quit

interface GigabitEthernet 0/0/0
 traffic-policy GRE-Policy outbound
quit

# 方法二(推荐):修正静态路由优先级
ip route-static 198.51.100.0 255.255.255.252 203.0.113.2 preference 60

五、总结

知识点 要点
GRE 隧道 在 IP 网络上承载任意网络层协议的隧道技术
协议号 GRE 使用 IP 协议号 47
封装开销 外层 IP 头 20 字节 + GRE 头 4 字节 = 24 字节
MTU 调整 隧道接口 MTU = 物理 MTU - 24,建议同时调整 TCP MSS
路由协议 GRE 隧道可承载 OSPF、IS-IS 等路由协议
mGRE 支持多对端动态隧道,用于 DMVPN 场景
无加密 GRE 本身不提供加密,需与 IPsec 配合实现安全隧道
常见故障 底层路由错误导致 GRE 报文无法到达对端

思考

  1. GRE 隧道不提供加密,如果直接在公网上传输 GRE 流量,会带来哪些安全风险?有哪些方案可以为 GRE 隧道添加加密保护?
  2. GRE 隧道的 MTU 比物理接口小 24 字节,如果在 GRE 隧道中再叠加 IPsec 加密,总的封装开销是多少?此时隧道接口的 MTU 应该设置为多少?
  3. 为什么 OSPF 在 GRE 隧道上可以正常运行,而 IS-IS 需要特殊配置才能在 GRE 隧道上运行?

下篇预告:第216篇:GRE over IPsec 实现安全隧道