DSVPN简介
动态智能VPN(Dynamic Smart Virtual Private Network),是一种在HUB-SPOKE组网方式下为公网地址动态变化的分支之间建立VPN隧道的解决方案。
背景
越来越多的企业希望建立Hub-Spoke方式的IPSec VPN网络将企业总部(Hub)与地理位置不同的多个分支(Spoke)相连,从而加强企业的通信安全、降低通信成本。当企业总部采用静态的公网地址接入Internet,分支机构采用动态的公网地址接入Internet时,使用传统的IPSec、GRE over IPSec等技术构建VPN网络将存在一个问题,即分支之间无法直接通信(源分支无法获取目的分支公网地址,也就无法在分支之间直接建立隧道),所有分支之间的通信数据只能由总部中转。
缺点:
-
总部在中转分支之间的数据流时会消耗总部HUB的CPU及内存资源,造成资源紧张。
-
总部要对分支间的数据流封装和解封装,会引入额外的网络延时。
-
当IPSec网络规模不断扩展时,为减少路由配置和维护,需要部署动态路由协议。但IPSec和动态路由协议之间存在一个基础问题,动态路由协议依赖于组播协议报文或广播协议报文进行路由更新,而IPSec不支持广播报文和组播报文的传输。
DSVPN基本概念
DSVPN典型网络架构
该网络中,当源Spoke需要向目的Spoke发送数据报文时,源Spoke将通过与Hub之间的静态mGRE隧道交互NHRP协议获取目的Spoke的公网地址,并与目的Spoke建立动态mGRE隧道。隧道建立完成后,Spoke与Spoke之间的数据报文将通过该动态mGRE隧道直接发送给对方,不再经过总部Hub中转。
mGRE隧道接口
mGRE隧道接口包含以下元素:
- 隧道源地址:GRE封装后的报文源地址,图中隧道一端的公网地址。
- 隧道目的地址:GRE封装后的报文目的地址,即图中隧道另一端的公网地址。与GRE隧道接口手工指定目的地址不同,mGRE隧道目的地址来自于NHRP协议。
- 隧道接口IP地址:隧道接口地址和其他物理接口上的IP地址一样,用于设备之间的通信(例如获取路由信息等),即图中的Tunnel地址。
采用mGRE隧道接口建立起来的GRE隧道称为mGRE隧道。mGRE隧道分为静态mGRE隧道和动态mGRE隧道两种:
- 静态mGRE隧道建立于分支Spoke与总部Hub之间,静态mGRE隧道永久存在。
- 动态mGRE隧道建立于各分支Spoke之间,动态mGRE隧道在一定周期内没有流量转发将自动拆除。
DSVPN基本原理
DSVPN实现分支之间直接通信的关键是在分支之间建立隧道。DSVPN利用mGRE结合NHRP来建立分支之间的隧道。与GRE不同,mGRE建立隧道时不需要定义隧道目的地址,而是依赖NHRP告诉它,这就为在动态地址变化的分支间建立隧道创造了条件。
mGRE与NHRP结合建立隧道的基本原理是:当设备转发一个IP报文时,根据路由表将IP报文传给下一跳的出接口mGRE隧道接口,mGRE在NHRP映射表中查找获取下一跳地址映射的对端公网地址。然后mGRE封装IP报文,加上新IP头,目的地址就是对端的公网地址,这样IP报文就能发向隧道对端,隧道即可建立。
三个环节:
-
建立Spoke与Hub之间的mGRE隧道
这一环节的目的是打通分支到分支报文转发的通道,使得一端分支的报文可以借助Hub转发到另一端分支。
DSVPN在Spoke与Hub之间建立的mGRE隧道是一种静态隧道,无论Spoke与Hub间是否有流量经过,该隧道一直存在。
-
分支间路由学习
这一环节的目的是生成一端分支到另一端分支的路由。
-
建立Spoke与Spoke之间的mGRE隧道
这一环节的目的是建立用于分支间直接通信的通道。当一个分支向另一个分支转发数据报文时,如果源Spoke找不到目的Spoke的公网地址,则会触发DSVPN建立Spoke与Spoke之间的mGRE隧道。
Spoke与Spoke之间建立的mGRE隧道是一种动态隧道,当Spoke与Spoke间有流量通过时,隧道自动保活;当一定周期内没有流量经过时,隧道自动拆除。
1.建立Spoke与Hub之间的mGRE隧道
DSVPN网络开始时,总部Hub的NHRP映射表是空表,分支Spoke有一个静态配置的NHRP映射表(Hub的Tunnel地址与公网地址的映射),分支Spoke和总部Hub有到彼此的路由。要建立Spoke与Hub之间的mGRE隧道,总部要生成各分支Tunnel地址/子网地址与公网地址的NHRP映射表,这主要通过分支Spoke向总部Hub进行NHRP注册来实现
-
Spoke向Hub注册请求
管理员在Spoke上手工配置Hub的Tunnel地址和公网地址以后,Spoke将定时向Hub发送NHRP注册请求报文,该报文中包含Spoke的Tunnel地址和公网地址。
-
Hub向Spoke注册应答
Hub从NHRP注册请求报文中提取Spoke的Tunnel地址和公网地址,并生成NHRP映射表,进而建立两者之间的mGRE隧道。
2.分支间路由学习
分支间相互学习路由(非shortcut方式)
每个分支需要学习到所有对端的路由数据。这种情况下,Spoke会消耗大量的CPU和内存资源,对其路由表容量和性能有较高的要求。而实际应用中,Spoke的性能往往较低,能存放的路由数量有限。因此,这种路由学习方式只适用于网络节点较少、路由信息量小的中小型网络。
分支路由汇聚到总部(shortcut方式)
实现所有访问目的分支的流量全部指向总部Hub。分支间不需要相互学习路由,通过总部对分支路由汇聚后进行通告,该路由学习方式适用于那些网络规模大、分支较多的大型网络。
3.建立Spoke与Spoke之间的mGRE隧道
- 非shortcut方式下,源Spoke可以学习到目的Spoke的Tunnel地址。因此,源Spoke可以直接根据目的Spoke的Tunnel地址来查找目的Spoke的公网地址,生成目的Spoke的Tunnel地址与公网地址的NHRP映射表。
- shortcut方式下,所有Spoke的路由下一跳全部都是Hub的Tunnel地址,源Spoke无法学习到目的Spoke的Tunnel地址。因此,源Spoke只能根据报文的目的地址来查找目的Spoke的公网地址,生成目的Spoke的子网地址与公网地址的NHRP映射表。
非shortcut方式
当Spoke1下的用户首次访问Spoke2下的用户时,将触发Spoke1与Spoke2之间建立动态mGRE隧道,隧道建立过程如下:
-
Spoke1收到其下用户发往Spoke2的数据报文后:
- 根据报文目的地址(192.168.2.0)在路由表中找到下一跳10.1.1.2(Spoke2的Tunnel地址),但在NHRP映射表中没有查找10.1.1.2对应的公网地址,就默认将该数据报文直接转发给Hub。
- 构建并向Hub发送NHRP地址解析请求报文,请求10.1.1.2对应的公网地址。
-
Hub收到Spoke1发送的数据报文和NHRP地址解析请求报文后,将报文通过Hub与Spoke2间的mGRE隧道转发给Spoke2。
-
Spoke2收到NHRP地址解析请求报文后:
- 从NHRP地址解析请求报文中提取Spoke1的Tunnel地址和公网地址,并将该信息更新到自己的NHRP映射表中(见图4-5中的红色字体)。
- 构建并向Spoke1发送NHRP地址解析应答报文(携带Spoke2的Tunnel地址10.1.1.2和公网地址2.2.2.2)。
-
Spoke1收到NHRP地址解析应答报文后,从应答报文中提取Spoke2的Tunnel地址和公网地址,更新到自己的NHRP映射表中(见图4-5中的红色字体),Spoke1与Spoke2之间的动态mGRE隧道随即建立。
当Spoke1再次收到其下用户发送给Spoke2的数据报文时,Spoke1根据报文目的地址(192.168.2.0)在路由表中找到下一跳10.1.1.2,再根据10.1.1.2在NHRP映射表中找到公网地址2.2.2.2,即可按照公网地址2.2.2.2将此报文进行mGRE封装后直接发送给Spoke2,不再经过总部Hub。
shortcut方式
当Spoke1下的用户首次访问Spoke2下的用户时,将触发Spoke1与Spoke2之间建立动态mGRE隧道,隧道建立过程如下:
-
Spoke1收到其下用户发往Spoke2下用户的数据报文后,根据报文目的地址(192.168.2.0)在路由表中找到下一跳10.1.1.3(Hub的Tunnel地址),并在NHRP映射表中找到10.1.1.3对应的公网地址3.3.3.3(Hub的公网地址),就将数据报文转发给Hub。
-
Hub收到Spoke1转发的数据报文后:
- 将此报文通过Hub与Spoke2间的mGRE隧道转发给Spoke2。
- 检查发现接收和发送数据报文的Tunnel接口属于同一个NHRP域(见nhrp network-id),就构建并向Spoke1发送NHRP重定向报文(携带Hub的Tunnel地址和公网地址,以及需要解析的数据报文的目的地址192.168.2.0)。
-
Spoke1收到NHRP重定向报文后,构建并向Hub发送NHRP地址解析请求报文(携带Spoke1的Tunnel地址10.1.1.1和公网地址1.1.1.1,以及需要解析的数据报文的目的地址192.168.2.0)。
-
Hub收到NHRP地址解析请求报文后转发给Spoke2处理。
-
Spoke2收到NHRP地址解析请求报文后:
- 从NHRP地址解析请求中提取Spoke1的Tunnel地址和公网地址,并将该信息更新到自己的NHRP映射表中(见图4-6中的红色字体)。
- 构建并向Spoke1发送NHRP地址解析应答报文(携带Spoke2的子网地址192.168.2.0、Spoke2的Tunnel地址10.1.1.2和公网地址2.2.2.2)。
-
Spoke1收到NHRP地址解析应答报文后,从应答报文中提取Spoke2的子网地址和公网地址,更新到自己的NHRP映射表中(见图4-6中的红色字体),Spoke1与Spoke2之间的动态mGRE隧道随即建立。
当Spoke1再次收到其下用户发送给Spoke2的数据报文时,Spoke1根据报文目的地址(192.168.2.0)查找NHRP映射表,找到Spoke2的公网地址2.2.2.2,即可根据公网地址2.2.2.2将此报文进行mGRE封装后直接发送给Spoke2,不再经过总部Hub。
DSVPN NAT穿越
DSVPN NAT穿越主要通过在NHRP注册应答报文、NHRP解析请求/应答报文中的NAT扩展字段中填充分支NAT前后的地址信息而实现,具体工作原理如下:
- 分支Spoke向总部Hub注册,NHRP注册请求报文中携带分支原始的公网或私网地址。
- 总部Hub的NHRP协议感知分支路径中有NAT设备存在,就在NHRP注册请求应答报文的NAT扩展字段中将分支NAT转换后的公网地址告知分支Spoke。
- 源Spoke向目的Spoke发起NHRP地址解析请求时,携带源分支NAT转换前的地址和NAT转换后的公网地址(通过NAT扩展字段)告知目的Spoke。
- 目的Spoke向源Spoke返回NHRP地址解析请求应答时,携带目的分支NAT转换前的地址和NAT转换后的公网地址(通过NAT扩展字段)告知源Spoke。
- 源分支和目的分支互相知道对端NAT转换前的地址和NAT转换后的公网地址后,根据NAT转换后的公网地址建立动态mGRE隧道,实现分支间穿越NAT直接通信
- DSVPN不支持两个分支位于同一NAT设备之后且NAT转换后IP地址相同的NAT穿越。
- DSVPN不支持两个分支位于不同NAT设备之后且启用PAT(Port Address Translation)功能的NAT穿越。
- 分支间互访时,NAT设备必须配置为NAT Server或Static NAT,DSVPN不支持配置为NAT outbound的NAT穿越。
- 在DSVPN中部署IPSec时,如果两个分支位于不同NAT设备之后或者总部位于NAT设备之后,则IPSec封装模式仅支持为传输模式。因为IPSec封装模式为隧道模式时,NHRP无法学习到NAT转换后的地址。
DSVPN IPSec保护
DSVPN网络中,通过在总部Hub和分支Spoke配置IPSec安全框架并绑定于mGRE隧道接口,mGRE隧道建立的同时会立即触发IPSec隧道建立,具体工作原理如下:
- 网络中的所有Spoke向总部Hub发起注册请求,同时将NHRP映射表信息告知IPSec,触发分支和总部的IKE模块进行IPSec隧道的协商。
- 总部Hub根据接收的注册请求报文,记录Spoke的Tunnel地址和公网地址的对应关系,生成分支的NHRP映射表,并向Spoke发送注册请求应答消息。
- 分支间根据流量触发建立动态mGRE隧道。
- 分支Spoke间动态mGRE隧道建立时,IPSec模块获取NHRP映射表信息,根据该信息添加或删除IPSec对等体节点,触发分支间动态建立IPSec隧道。
- 分支Spoke间IPSec隧道建立成功后,后续数据转发根据IP报文的目的地址查找路由。如果出接口类型是mGRE隧道接口,则根据路由下一跳找NHRP映射表,获取公网地址,根据公网地址,找IPSec SA,对报文进行IPSec加密发送。
相对于传统Hub-Spoke组网的IPSec技术,DSVPN与IPSec联合部署具有如下优势:
- 传统IPSec技术使用ACL识别待加密的单播流量,需进行复杂的ACL定义,配置和维护困难。而DSVPN中只需将mGRE隧道接口与IPSec安全框架绑定,无需再定义复杂的ACL,网络部署更加简单。
- 由于动态建立了分支间的IPSec隧道,分支Spoke间交互的IPSec数据不用通过总部Hub进行解密和加密操作,降低了数据传输时延。
在DSVPN中部署IPSec时,如果两个分支位于不同NAT设备之后或者总部位于NAT设备之后,则IPSec封装模式仅支持为传输模式。因为IPSec封装模式为隧道模式时,NHRP无法学习到NAT转换后的地址。
DSVPN可靠性
双HUB主备备份
DSVPN双Hub主备备份的工作机制如下:
- 所有分支Spoke同时向主用Hub1和备用Hub2注册,并分别与Hub1建立主用静态mGRE隧道、与Hub2建立备用静态mGRE隧道。
- 当分支间需要建立动态mGRE隧道时,源Spoke向Hub发送NHRP地址解析请求报文:
- 在Hub1和Hub2都运行正常的情况下,根据路由策略,Spoke到Hub1的路由优先级较高,NHRP地址解析请求报文将沿主用静态mGRE隧道发送到Hub1,由Hub1将此解析报文转发至目的Spoke。
- 当Hub1出现故障时,Spoke到Hub1的路由优先级降低,NHRP地址解析请求报文沿备用静态mGRE隧道发送到Hub2,由Hub2将此解析报文转发至目的Spoke。
- 当Hub1故障恢复后,各分支Spok