!{danger 声明:}
本篇文章仅为虚拟专用网络(VPN)技术的学习笔记,重点记录GRE Over IPSec的原理与配置方法
本文不涉及任何“翻墙”相关内容,也不提供翻墙工具或实践指导。请读者理性阅读,遵守相关法律法
介绍 GRE Over IPSec
接下来我将简单介绍 GRE 和 IPSec,以及它们组合起来的 GRE Over IPSec 是什么
什么是 GRE
GRE 是一种通用路由封装协议(隧道协议),可以将一种网络层协议封装在另一种网络层协议之上
简单来说,它允许 IP 协议承载其他的三层协议,比如 IPv6、OSPF、BGP 等
例如,我们可以使用 GRE 将 IPv6 报文封装后,在 IPv4 网络中进行传输
!{warning 注意}
上面这个例子并不是说 IPv6 数据包可以直接在 IPv4 网络中路由。
而是指:可以通过 GRE 隧道,在 IPv4 网络中“运输” IPv6 数据包,直到抵达另一个支持 IPv6 的网络进行正常路由
这正是 GRE 被称为“隧道协议”的原因
什么是 IPSec
!{tip}
IPSec 协议相对较复杂,下面我尽量解释得通俗一些。
IPSec,全称为 Internet Protocol Security(互联网协议安全),是用于保护 IP 层通信安全的一组协议
它和 SSL/TLS 类似,都是“协议套件”(由多个子协议组成),用于保障数据的机密性、完整性和身份验证
!{warning 注意}
虽然 SSL/TLS 也能实现 VPN,但由于工作层级不同:
- IPSec 工作在第三层(网络层)
- SSL/TLS 工作在第四层(传输层)
这意味着基于 SSL/TLS 的 VPN(如 OpenVPN)无法传输应用层以下的协议,
例如 ICMP(ping)、OSPF、BGP 等协议
什么是 GRE Over IPSec
GRE Over IPSec 指的是:通过 GRE 建立隧道后,再使用 IPSec 对隧道中的流量进行加密传输
这种方式结合了两者的优势:
- GRE 提供灵活的封装能力(能跑多播、路由协议等)
- IPSec 提供完整的数据加密和认证保护
因此,GRE Over IPSec 是企业中常用的一种 VPN 实现方式,适用于需要安全传输多种网络协议的场景
配置 GRE Over IPSec
!{tip}
建议您先看一下 简要介绍 IPSec实现原理 和 GRE Over IPSec 数据走向
简要介绍 IPSec实现原理
要理解 IPSec 的工作机制,我们首先要了解一个非常核心的概念:SA(Security Association,安全联盟)
那么什么是 SA ?
从字面上看,“安全联盟”听起来就像是双方之间建立的一种信任关系,换句话说:“我相信你是安全的,可以按约定的方式跟我通信”
!{tip 拓展}
IPSec 的安全联盟是单向的,因此一条完整的双向通信至少需要两个安全联盟
IPSec 协议正是依赖这种 SA(安全联盟) 来完成数据的加密与验证
那么如何建立安全联盟?
可以通过 IKE协议(isakmp的实现) 来建立安全联盟 原理比较复杂碍于篇幅这里就不赘述了,但是我提一些在配置时会用到的东西防止一头雾水
- 在建立安全联盟时为了防止中间人攻击,IKE 协议需要您提供 预共享密钥 (pre-shared key)或者证书来做保证不被中间人攻击
- 在建立安全联盟的过程中,双方会协商加密算法与密钥,并在后续使用这些参数对数据进行加密传输
在建立SA(安全联盟)后这意味着必要的信息已经协商完成后续的流量就可以按照协商的结果(密钥、加密算法等信息)进行加密
GRE Over IPSec 数据走向
顾名思义,GRE Over IPSec 就是先使用 GRE 将原始数据(如 ICMP、OSPF 等)封装成一个 GRE 包,再将这个 GRE 包通过 IPSec(通常是 ESP 封装安全负载)进行加密保护
!{tip 拓展}
除了ESP还可以使用AH(Authentication Header)但是 因为AH协议只做完整性校验不做加密所以说一般都使用E SP
下图展示了整个过程的数据包结构演变过程,从发起端开始,直到最终经过 IPSec 隧道发出的封装格式。
好!必要的知识都了解了开始配置!
!{warning}
接下来的部分需要您对Cisco设备的配置命令有一定的了解
步骤如下:
- 配置好路由确保两台VPN网关(在我的例子中是R1和R3)之间是互通的
- 配置给VPN网关配置 GRE Tunnel 接口(用于封装原始流量)
- 配置访问控制列表(用于筛选要被IPSec加密的流量)
- 配置isakmp策略和预共享密钥 (Cisco Packet Tracer 中的设备只支持预共享密钥)
- 配置 transform-set(加密/认证方式)与 crypto map(将 transform-set 应用于匹配的流)
- 将映射应用在vpn网关的出接口上
- 添加对端网络的路由(目的地址设为对端GRE Tunnel接口的地址)
实验拓扑图如下:
!{tip 温馨提示}
下面的配置命令均为例子 您可以按照您自己的喜好来
步骤一: 配置好路由确保两台vpn网关(在我的例子中是R1和R3)之间是互通的
配置接口地址
R1(config-if)#interface se0/1/0
R1(config-if)#ip address 10.10.10.1 255.255.255.252
R1(config-if)#no shutdown
R1(config-if)#exit
R1(config)#interface ge0/0/0
R1(config-if)#ip address 192.168.1.1 255.255.255.0
R1(config-if)#no shutdown
R2(config)#interface se0/1/0
R2(config-if)#ip address 10.10.10.2 255.255.255.252
R2(config-if)#no shutdown
R2(config-if)#exit
R2(config)#interface se0/1/1
R2(config-if)#ip address 10.10.10.5 255.255.255.252
R2(config-if)#no shutdown
R3(config)#interface se0/1/1
R3(config-if)#ip address 10.10.10.6 255.255.255.252
R3(config-if)#no shutdown
R3(config)#interface g0/0/0
R3(config-if)#ip address 192.168.2.1 255.255.255.0
R3(config-if)#no shutdown
配置路由
R1(config)#router rip
R1(config-router)#network 10.10.10.0
R2(config)#router rip
R2(config-router)#network 10.10.10.0
R2(config-router)#network 10.10.10.4
R3(config)#router rip
R3(config-router)#network 10.10.10.4
测试连通性
R1(config-router)#end
R1#ping 10.10.10.6
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.10.10.6, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 28/30/35 ms
# 我这里R1到R3能够正常通信
步骤二: 配置给VPN网关配置 GRE Tunnel 接口(用于封装原始流量)
R1(config)#interface tunnel 1
R1(config-if)#ip address 192.168.255.1 255.255.255.0
R1(config-if)#tunnel mode gre ip # 配置隧道模式为GRE
R1(config-if)#tunnel source s0/1/0 # GRE数据包的源设置为 s0/1/0 (VPN网关的出接口IP地址)
R1(config-if)#tunnel destination 10.10.10.6 # GRE数据包目的IP地址(对端VPN网关的入接口IP地址)
R1(config-if)#exit
# 配置第二台VPN网关的隧道
R3(config)#interface tunnel 1
R3(config-if)#ip address 192.168.255.2 255.255.255.0
R3(config-if)#tunnel mode gre ip
R3(config-if)#tunnel source s0/1/0
R3(config-if)#tunnel destination 10.10.10.1
R3(config-if)#exit
步骤三: 配置访问控制列表(用于筛选要被IPSec加密的流量)
R1(config)#ip access-list extended vpn-acl # 一定要记住访问控制列表的名字 后面会用到 (我这里是vpn-acl)
R1(config-ext-nacl)#permit gre host 10.10.10.1 host 10.10.10.6 # 按照上面R1配置那就是要用IPSec加密这个GRE流量(tunnel接口的source 和 destination)
R1(config-ext-nacl)#exit
# 和上面配置差不多
R3(config)#ip access-list extended vpn-acl
R3(config-ext-nacl)#permit gre host 10.10.10.6 host 10.10.10.1
R3(config-ext-nacl)#exit
步骤四: 配置isakmp策略和预共享密钥 (Cisco Packet Tracer 中的设备只支持预共享密钥)
R1(config)#crypto isakmp policy 1
R1(config-isakmp)#hash sha # 表示使用sha做校验
R1(config-isakmp)#encryption aes # aes做加密
R1(config-isakmp)#authentication pre-share # 使用预共享密钥确认身份
R1(config-isakmp)#exit
# 表示将预共享密钥设置为123456 并且在验证身份时给 10.10.10.6(这个是对端VPN网关入接口的地址)
R1(config)#crypto isakmp key 123456 address 10.10.10.6
# R3其实也一样
R3(config)#crypto isakmp policy 1
R3(config-isakmp)#hash sha
R3(config-isakmp)#encryption aes
R3(config-isakmp)#authentication pre-share
R3(config-isakmp)#exit
# 预共享密钥需一致
R3(config)#crypto isakmp key 123456 address 10.10.10.1
步骤五: 配置 transform-set(加密/认证方式)与 crypto map(将 transform-set 应用于匹配的流)
R1(config)#crypto ipsec transform-set vpn-trans-set esp-aes esp-sha-hmac # 配置转换集 定义使用 ESP 封装协议,采用 AES 加密、SHA-HMAC 完整性校验。
R1(config)#crypto map vpn-map 1 ipsec-isakmp # 这里的 1 表示的是序列号VPN网关会从小到大依次对流量进行匹配
R1(config-crypto-map)#set peer 10.10.10.6 # 设置对端的VPN网关地址
R1(config-crypto-map)#set transform-set vpn-trans-set # 表示使用vpn-trans-set这个我们之前配置的转换集
R1(config-crypto-map)#match address vpn-acl # 配置筛选流量使用的访问控制列表(我们之前配置的是vpn-acl)
R1(config-crypto-map)#exit
# 同样命令和R1差不多
R3(config)#crypto ipsec transform-set vpn-trans-set esp-aes esp-sha-hmac
R3(config)#crypto map vpn-map 1 ipsec-isakmp
R3(config-crypto-map)#set peer 10.10.10.1
R3(config-crypto-map)#set transform-set vpn-trans-set
R3(config-crypto-map)#match address vpn-acl
R3(config-crypto-map)#exit
步骤六: 将映射应用在vpn网关的出接口上
R1(config)#interface s0/1/0 # 注意要是出接口要不然可能会匹配不到流量
R1(config-if)#crypto map vpn-map
R3(config)#interface s0/1/1
R3(config-if)#crypto map vpn-map
步骤七: 添加对端网络的路由(目的地址设为对端GRE Tunnel接口的地址)
R1(config)#ip route 192.168.2.0 255.255.255.0 192.168.255.2
R3(config)#ip route 192.168.1.0 255.255.255.0 192.168.255.1
现在所有配置均完成接下来验证实验结果
在使用 Cisco Packet Tracer 进行抓包时,我们可以清晰地观察到 IPSec 安全联盟的协商过程:
一旦协商完成,后续的数据通信将会被 ESP 封装保护,从抓包中也能明显看到:
最后
本文所用的Cisco Packet Tracer工程文件已完成全部配置,您可以在GitHub上下载直接打开查看,方便快速复现实验环境。
建议先阅读本文配置步骤,理解原理和流程,再通过工程文件深入学习和动手实践。