第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 数据流

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 字节不分片)传输失败,大文件传输速度极慢。
排查步骤:
- 检查隧道接口状态
display interface Tunnel 0
显示隧道接口 MTU 为 1476(仅考虑了 GRE 开销 24 字节,未考虑 IPsec 开销)。
- 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 字节成功。
-
根因分析 隧道接口 MTU 设置为 1476(1500 - 24),但这只考虑了 GRE 封装开销。GRE over IPsec 的总封装开销约为 76 字节(GRE 24 + IPsec 52)。当原始报文为 1400 字节时,加上 GRE 和 IPsec 封装后总长度超过物理接口 MTU 1500 字节,导致报文被丢弃。
-
解决方案
# 修改隧道接口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 困难,尽量避免 |
| 适用场景 | 需要多协议加密传输的站点间互联 |
思考
- GRE over IPsec 的封装开销比纯 IPsec VPN 多约 24 字节(GRE 头 + 外层 IP 头)。在多跳 GRE over IPsec 隧道(隧道中嵌套隧道)场景下,MTU 会如何逐级减小?对实际业务有什么影响?
- 如果需要在 GRE over IPsec 隧道中传输 IPv6 报文,GRE 的协议类型字段应该如何配置?IPsec 能否同时保护 IPv4 和 IPv6 的 GRE 流量?
- GRE over IPsec 与纯 IPsec VPN 在性能上有什么区别?加密和解封装的计算开销对 CPU 的占用有多大差异?
下篇预告:第217篇:防火墙场景的 DNS 过滤与防域名劫持