第215篇:GRE 隧道与 Overlay 网络

关键词

GRE、通用路由封装、Overlay 网络、隧道技术、多协议传输、GRE Keepalive、隧道接口


一、GRE 概述

1.1 什么是 GRE

GRE(Generic Routing Encapsulation,通用路由封装)是一种轻量级隧道协议,可以将一种协议的报文封装在另一种协议中传输:

GRE 隧道的基本概念:

Overlay 网络(逻辑网络) 私网 IP 10.0.0.0/8 ─── GRE 隧道 ─── 私网 IP
│ 封装
┌────────┴────────┐
│ Underlay 网络 │
│ 公网 IP 层 │
│ 202.1.1.1→203.1.1.1│
└─────────────────┘

GRE 的核心特点:

特点 说明
协议无关 可以封装 IPv4、IPv6、IPX 等
轻量级 无加密,无认证,纯粹封装
多点支持 支持点到点、点到多点
标准开放 RFC 2784 / RFC 2890
IP 协议号 47

1.2 GRE 与 IPsec 的定位

GRE vs IPsec:

GRE:
  纯封装,不加密
  开销小(4-8 字节 GRE 头)
  适合传递路由协议(OSPF、EIGRP)
  常与 IPsec 组合使用

IPsec:
  加密 + 认证
  开销大(50-86 字节)
  不适合传递组播/路由协议
  可保护 GRE 隧道

最佳组合:GRE over IPsec
  先用 GRE 建立隧道 + 传递路由
  再用 IPsec 加密整个 GRE 隧道
  → 既支持路由协议,又保证安全

二、GRE 报文封装

2.1 封装结构

原始报文: | 原始 IP 头 S=10.0.0.1 D=10.0.0.2 | TCP/UDP/其他 | 数据 | | --- | --- | --- |

GRE 隧道封装后: | 外部 IP 头 S=202.1.1.1 D=203.1.1.1 协议=47(GRE) | GRE 头 协议类型 0x0800 | 原始 IP 头 S=10.0.0.1 D=10.0.0.2 | TCP/UDP | 数据 | | --- | --- | --- | --- | --- |

GRE 头结构(4 字节基础头,可选扩展): | C/R | K/S | S | Res | Version | (2 字节 Flag/Version) | | --- | --- | --- | --- | --- | --- | | 协议类型 (2 字节) | ← 如 0x0800 = IPv4 | | | | | | (可选) 校验和 (4 字节) (可选) 密钥 (4 字节) (可选) 序列号 (4 字节) | | | | | |

封装开销: 基础 GRE 头:4 字节 外部 IP 头:20 字节 总计:24 字节额外开销

2.2 GRE 支持的多协议

GRE 可以封装多种协议(协议类型字段标识):

协议类型值      协议
────────────────────
0x0800          IPv4
0x86DD          IPv6
0x8847          MPLS 单播
0x8848          MPLS 组播
0x8035          RARP
0x809B          AppleTalk
0x8137          IPX

三、GRE 隧道配置

3.1 点到点 GRE 隧道

# 路由器 A(202.1.1.1)
interface Tunnel0/0/0
 ip address 10.255.255.1 255.255.255.252    # 隧道接口 IP
 tunnel-protocol gre                         # GRE 隧道
 source 202.1.1.1                            # 源地址(公网 IP)
 destination 203.1.1.1                       # 目的地址(对端公网 IP)
 keepalive 5 3                               # Keepalive 检测(5s 间隔 3 次)
!
# 路由:将远端私网路由指向隧道接口
ip route-static 192.168.2.0 255.255.255.0 Tunnel0/0/0

# 路由器 B(203.1.1.1)
interface Tunnel0/0/0
 ip address 10.255.255.2 255.255.255.252
 tunnel-protocol gre
 source 203.1.1.1
 destination 202.1.1.1
 keepalive 5 3
!
ip route-static 192.168.1.0 255.255.255.0 Tunnel0/0/0

3.2 在 GRE 隧道上运行动态路由

# 在 GRE 隧道上运行 OSPF(让两端自动学习路由)

# 路由器 A
interface Tunnel0/0/0
 ip address 10.255.255.1 255.255.255.252
 tunnel-protocol gre
 source 202.1.1.1
 destination 203.1.1.1
!
ospf 1
 area 0.0.0.0
  network 10.255.255.0 0.0.0.255
  network 192.168.1.0 0.0.0.255               # 本端私网

# 路由器 B
interface Tunnel0/0/0
 ip address 10.255.255.2 255.255.255.252
 tunnel-protocol gre
 source 203.1.1.1
 destination 202.1.1.1
!
ospf 1
 area 0.0.0.0
  network 10.255.255.0 0.0.0.255
  network 192.168.2.0 0.0.0.255               # 本端私网

# 效果:
# 两台路由器通过 GRE OSPF 自动学习对方私网路由
# 无需配置静态路由

四、GRE 与 IPsec 组合

4.1 GRE over IPsec

GRE over IPsec 的组合方式:先 GRE 封装,再 IPsec 加密

IPsec 加密保护 ┌─────────────────────┐ GRE 隧道(逻辑) OSPF/路由协议运行 在 GRE 隧道上

优点: 1. 同时获得 GRE 的多协议支持和 IPsec 的加密 2. 路由协议(OSPF、EIGRP)可以在 IPsec 上运行 3. 组播/广播流量可以加密传输

4.2 配置示例

# GRE over IPsec 配置

# 步骤 1:创建 GRE 隧道
interface Tunnel0/0/0
 ip address 10.255.255.1 255.255.255.252
 tunnel-protocol gre
 source 202.1.1.1
 destination 203.1.1.1
!
# 步骤 2:在 GRE 隧道上运行 OSPF
ospf 1
 area 0.0.0.0
  network 10.255.255.0 0.0.0.255
  network 192.168.1.0 0.0.0.255
!
# 步骤 3:创建 IPsec 策略保护 GRE 流量
acl number 3001
 rule 5 permit gre source 202.1.1.1 0 destination 203.1.1.1 0  # 保护 GRE 协议
!
ipsec proposal GRE_IPSEC
 esp authentication-algorithm sha256
 esp encryption-algorithm aes-256
!
ike peer GRE_PEER
 ike-proposal 1
 pre-shared-key Huawei@123
 remote-address 203.1.1.1
!
ipsec policy GRE_POLICY 10 isakmp
 security acl 3001
 ike-peer GRE_PEER
 proposal GRE_IPSEC
!
# 步骤 4:IPsec 应用到物理接口(而非 Tunnel 接口)
interface GigabitEthernet0/0/0
 ip address 202.1.1.1 255.255.255.0
 ipsec policy GRE_POLICY                  # IPsec 在物理接口上

五、GRE Keepalive 与故障检测

5.1 Keepalive 机制

GRE 隧道本身没有状态检测机制,需要通过 Keepalive 来检测对端状态:

Keepalive 工作原理:
  本地 ─── GRE Keepalive 请求 ──→ 对端
  本地 ←── GRE Keepalive 应答 ───  对端

  如果连续 N 次未收到应答:
  → 宣告对端不可达
  → Tunnel 接口状态变为 Down
  → 触发路由切换

配置:
  interface Tunnel0/0/0
   keepalive 10 3                    # 每 10 秒发一次,连续 3 次失败=故障

查看 Keepalive 状态:
  display interface Tunnel0/0/0
  Tunnel0/0/0 current state: UP
    Keepalive: 10 seconds, retry times: 3
    Keepalive packet: sent 100, received 99

5.2 BFD for GRE

对更快的故障检测需求,可以在 GRE 隧道上启用 BFD:

interface Tunnel0/0/0
 bfd min-tx-interval 10
 bfd min-rx-interval 10
 bfd detect-multiplier 3
!
# BFD 检测时间 = 10ms × 3 = 30ms
# 远快于 Keepalive 的 30 秒

六、典型应用场景

6.1 站点间 VPN 基础(GRE + IPsec)

总部 ─── GRE Tunnel ─── IPsec 保护 ─── 分支
  │                                        │
  │  运行 OSPF(自动学习路由)               │
  │  组播/广播通过 GRE 传输                  │
  │  IPsec 提供加密保护                     │

6.2 MPLS over GRE

GRE 可以承载 MPLS 标签报文(协议类型 0x8847):

           ┌───────────┐
           │  MPLS 核心  │
           └─────┬─────┘
                 │ (MPLS 标签)
        ┌────────┴────────┐
        │ GRE 隧道封装 MPLS │
        └────────┬────────┘
           ┌─────┴─────┐
           │  非 MPLS 域  │
           └───────────┘

场景:非 MPLS 网络承载 MPLS 流量

6.3 IPv6 over IPv4 GRE

IPv6 站点通过 IPv4 互联网互联(IPv6 过渡期):

┌──────────────┐        GRE 隧道       ┌──────────────┐
│ IPv6 站点 A  │ ══════════════════════ │ IPv6 站点 B  │
│ 2001:db8::1  │       (over IPv4)      │ 2001:db8::2  │
└──────────────┘                        └──────────────┘

配置:
  interface Tunnel0/0/0
   ipv6 enable
   ipv6 address 2001:db8:ff::1/64
   tunnel-protocol gre
   source 202.1.1.1
   destination 203.1.1.1

七、总结

知识点 核心要点
GRE 通用路由封装,轻量级隧道,无加密
封装开销 GRE 头 4 字节 + 外部 IP 头 20 字节 = 24 字节
多协议 IPv4、IPv6、MPLS、IPX 等都可封装
GRE 隧道 Tunnel 接口,源 + 目的地址定义隧道端点
GRE + IPsec GRE 传递路由/组播,IPsec 加密保护
Keepalive 检测 GRE 隧道对端状态
动态路由 GRE 隧道上可运行 OSPF/EIGRP 等

八、思考

  1. GRE 隧道和 IPsec 隧道有什么本质区别?为什么有时需要两者组合使用?
  2. GRE 报文封装后,外层 IP 头和内层 IP 头分别代表什么?
  3. GRE 隧道上运行动态路由协议有什么好处?没有它只能怎么做?
  4. GRE over IPsec 和 IPsec alone 相比,有哪些优势?
  5. GRE Keepalive 的作用是什么?如果对端故障了,Keepalive 如何触发切换?

下篇预告:第216篇《GRE over IPsec 实现安全隧道》——详解 GRE over IPsec 的最佳实践,包括配置优化和故障排查。