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

关键词:GRE over IPsec、安全隧道、GRE封装、IPsec封装、多协议加密、隧道中隧道、NAT穿越、IKE动态隧道

一、引言

在第215篇中,我们学习了 GRE 隧道的基本原理和配置方法。GRE 提供了一种灵活隧道机制,可以承载任意网络层协议。然而,GRE 本身不提供任何加密和认证能力。当 GRE 隧道跨越公网时,所有传输的数据以明文形式暴露,存在严重的泄密风险。

将 GRE 与 IPsec 结合使用(GRE over IPsec),可以同时获得 GRE 的灵活性和 IPsec 的安全性。GRE 负责隧道封装,IPsec 负责对 GRE 报文进行加密和认证,形成一条安全的多协议隧道。

二、核心概念

2.1 GRE over IPsec 架构

GRE over IPsec 将 GRE 报文作为 IPsec 的保护流量。IPsec 对包含 GRE 头部的完整 IP 报文进行加密和封装,形成"隧道中隧道"的结构。

2.2 封装层次

GRE over IPsec 采用多层封装结构,原始报文依次经过 GRE 封装和 IPsec 封装:

封装层次 - 图示

层次 协议 说明
第 1 层 原始报文 被传输的业务数据(IP/IPv6/ARP/IPX 等)
第 2 层 GRE 头 标识被封装的协议类型
第 3 层 外层 IP 头 GRE 隧道源/目的 IP,协议号 47
第 4 层 ESP 头/尾 IPsec 加密和认证
第 5 层 最外层 IP 头 IPsec 隧道源/目的 IP

2.3 GRE over IPsec vs 纯 IPsec

对比维度 纯 IPsec VPN GRE over IPsec
支持协议 仅 IP 任意网络层协议(IP、IPv6、IPX 等)
路由协议 需特殊配置(NHRP 等) 自然承载 OSPF、IS-IS 等
多播支持 需 IPsec 多播扩展 GRE 原生支持多播
封装开销 ~36-56 字节 ~48-76 字节(额外 GRE + IP 头)
MTU 要求 物理 MTU - IPsec 开销 物理 MTU - IPsec 开销 - 24 字节
配置复杂度 低 中(需配置 GRE + IPsec)
NAT 穿越 支持(NAT-T) 困难(GRE 协议号 47 被 NAT 丢弃)
适用场景 站点间 IP 加密 多协议安全隧道、路由协议承载

2.4 GRE over IPsec 两种部署模式

模式 说明 流量匹配
IPsec 保护 GRE(推荐) IPsec 将 GRE 报文(协议号 47)作为保护流量 ACL 匹配协议号 47 + 隧道端点 IP
GRE 承载 IPsec 先建立 GRE 隧道,IPsec 在 GRE 隧道接口上应用 GRE 隧道接口上直接应用 IPsec 策略

三、技术细节

3.1 GRE over IPsec 数据流

GRE over IPsec 数据流 - 图示

3.2 ACL 匹配 GRE 流量

在 GRE over IPsec 中,IPsec 的 ACL 需要匹配 GRE 报文(IP 协议号 47)而非原始业务流量:

# 匹配GRE隧道流量(协议号47)
acl 3000
 rule 5 permit gre source 203.0.113.1 destination 198.51.100.1

这种方式下,IPsec 保护的是整个 GRE 隧道流量,隧道内部传输什么协议(IP、IPv6、IPX 等)对 IPsec 透明。

3.3 MTU 计算

GRE over IPsec 的总封装开销: - IPsec ESP 头:16-20 字节(AES-GCM 约 16 字节) - ESP 认证尾:12 字节 - IPsec 外层 IP 头:20 字节 - GRE 头:4 字节 - GRE 外层 IP 头:20 字节 - 总计约 72-76 字节

隧道接口 MTU = 物理接口 MTU - 封装开销 = 1500 - 76 = 1424 字节

3.4 NAT 穿越问题

GRE over IPsec 在 NAT 环境下存在严重问题: - NAT 设备默认不转发协议号为 47 的 GRE 报文 - 即使 IPsec 通过 NAT-T(UDP 4500)穿越 NAT,GRE 作为 IPsec 的保护流量,其协议号信息已不可见 - 某些防火墙对 UDP 4500 的深度检测可能阻断 GRE 流量

替代方案:如果必须穿越 NAT,考虑使用 IPsec 隧道模式直接承载业务流量,或使用 SSL VPN。

四、实战配置/案例分析

4.1 华为 AR 路由器:GRE over IPsec 完整配置

# ========== 站点A(路由器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

# ===== 步骤1:配置GRE隧道 =====
interface Tunnel 0
 ip address 169.254.1.1 255.255.255.252
 tunnel-protocol gre
 tunnel source 203.0.113.1
 tunnel-destination 198.51.100.1
 mtu 1424
 quit

# ===== 步骤2:配置IKE =====
ike proposal 1
 encryption-algorithm aes-256-gcm
 integrity-algorithm sha256
 dh-group group14
quit

ike peer SiteB
 version v1
 address 198.51.100.1
 authentication-mode pre-shared-key
 pre-shared-key cipher Huawei@GRE2024
 proposal 1
 exchange-mode main
quit

# ===== 步骤3:配置IPsec Proposal =====
ipsec proposal GRE-IPsec
 encapsulation-mode tunnel
 auth-algorithm sha256
 encrypt-algorithm aes-256-gcm
 dh-group group14
quit

# ===== 步骤4:配置ACL匹配GRE流量 =====
acl 3000
 rule 5 permit gre source 203.0.113.1 destination 198.51.100.1
quit

# ===== 步骤5:配置IPsec策略 =====
ipsec policy GRE-over-IPsec 10 isakmp
 security-acquire-method ike
 proposal GRE-IPsec
 conn acl 3000
 peer SiteB
quit

# ===== 步骤6:应用IPsec策略到公网接口 =====
interface GigabitEthernet 0/0/1
 ipsec policy GRE-over-IPsec
 quit

# ===== 步骤7:配置路由 =====
ip route-static 10.2.1.0 255.255.255.0 Tunnel 0

# ========== 站点B(路由器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

interface Tunnel 0
 ip address 169.254.1.2 255.255.255.252
 tunnel-protocol gre
 tunnel source 198.51.100.2
 tunnel-destination 203.0.113.1
 mtu 1424
 quit

ike proposal 1
 encryption-algorithm aes-256-gcm
 integrity-algorithm sha256
 dh-group group14
quit

ike peer SiteA
 version v1
 address 203.0.113.1
 authentication-mode pre-shared-key
 pre-shared-key cipher Huawei@GRE2024
 proposal 1
quit

ipsec proposal GRE-IPsec
 encapsulation-mode tunnel
 auth-algorithm sha256
 encrypt-algorithm aes-256-gcm
 dh-group group14
quit

acl 3000
 rule 5 permit gre source 198.51.100.2 destination 203.0.113.1
quit

ipsec policy GRE-over-IPsec 10 isakmp
 security-acquire-method ike
 proposal GRE-IPsec
 conn acl 3000
 peer SiteA
quit

interface GigabitEthernet 0/0/1
 ipsec policy GRE-over-IPsec
 quit

ip route-static 10.1.1.0 255.255.255.0 Tunnel 0

4.2 故障排查案例:GRE over IPsec 隧道建立但大报文传输失败

故障现象:GRE over IPsec 隧道建立成功,小报文(ping 64 字节)可以正常互通,但大报文(ping 1400 字节不分片)传输失败,大文件传输速度极慢。

排查步骤:

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

显示隧道接口 MTU 为 1476(仅考虑了 GRE 开销 24 字节,未考虑 IPsec 开销)。

  1. Ping 测试不同大小报文
ping -a 10.2.1.10 -c 1400 -s 1400

ping 1400 字节失败。

ping -a 10.2.1.10 -c 1400 -s 1400 -f

添加不分片标志后失败,说明 MTU 路径存在问题。

ping -a 10.2.1.10 -c 1400 -s 1300

ping 1300 字节成功。

  1. 根因分析 隧道接口 MTU 设置为 1476(1500 - 24),但这只考虑了 GRE 封装开销。GRE over IPsec 的总封装开销约为 76 字节(GRE 24 + IPsec 52)。当原始报文为 1400 字节时,加上 GRE 和 IPsec 封装后总长度超过物理接口 MTU 1500 字节,导致报文被丢弃。

  2. 解决方案

# 修改隧道接口MTU
interface Tunnel 0
 mtu 1424
 quit

# 同时调整TCP MSS
tcp adjust-mss 1400

# 验证
ping -a 10.2.1.10 -c 1400 -s 1400

修改后,大报文传输恢复正常。文件传输速度从之前的几 KB/s 提升到正常带宽水平。

五、总结

知识点 要点
GRE over IPsec GRE 负责隧道封装,IPsec 负责加密保护
封装层次 原始报文 → GRE → IPsec ESP → 最外层 IP
封装开销 约 72-76 字节(GRE 24 + IPsec 52)
MTU 设置 隧道接口 MTU ≈ 1424(物理 MTU 1500 - 76)
ACL 匹配 IPsec ACL 匹配协议号 47(GRE)
路由协议 GRE over IPsec 可承载 OSPF、IS-IS 等动态路由
NAT 穿越 GRE over IPsec 穿越 NAT 困难,尽量避免
适用场景 需要多协议加密传输的站点间互联

思考

  1. GRE over IPsec 的封装开销比纯 IPsec VPN 多约 24 字节(GRE 头 + 外层 IP 头)。在多跳 GRE over IPsec 隧道(隧道中嵌套隧道)场景下,MTU 会如何逐级减小?对实际业务有什么影响?
  2. 如果需要在 GRE over IPsec 隧道中传输 IPv6 报文,GRE 的协议类型字段应该如何配置?IPsec 能否同时保护 IPv4 和 IPv6 的 GRE 流量?
  3. GRE over IPsec 与纯 IPsec VPN 在性能上有什么区别?加密和解封装的计算开销对 CPU 的占用有多大差异?

下篇预告:第217篇:防火墙场景的 DNS 过滤与防域名劫持