Cisco DMVPN技术原理Cisco DMVPN技术原理一、背景信息很多公司希望通过公共网络安全地将他们各地的办事处、分公司与公司总部联系起来,并且办事处、分公司之间也可以互联过去,唯一的办法是通过二层的网络(Layer-2 network)如ISDN或帧中继,将所有节点互联起来,实现内部的IP互通,并且需要支付昂贵的线路费用现在,这些办事处、分公司与公司总部之间的互联可以通过廉价的Internet接入实现,通过IPSec隧道来保证内部通讯的安全IPSec通过共享密钥在通讯的两端实现数据加密,即任意两端之间都要共享不同的密钥,所以IPSec隧道其实是点到点的加密隧道,IPSec网络就是点到点加密隧道的集合IPSec网络的组织形式可以是星形结构(hub−and−spoke)或网状结构(full mesh)在大多数网络中,数据流量主要分布在分支与中心之间,分支与分支之间的流量分布较少,所以星形结构(hub−and−spoke)通常是较好的选择这也符合传统的帧中继互联方式,因为星形结构(hub−and−spoke)比网状结构(full mesh)使用更少的点到点链路,可以减少线路费用当通过Internet实现内部互联时,分支机构到分支机构(spoke −to−spoke)的连通不需要额外的通讯费用,并且能够给企业内部网络带来更好的性能,但是网状结构(full mesh)的实现和管理有一定困难。
在星形结构中,分支到分支的通信必须跨越中心,这会耗费中心的资源并引入更长的延时尤其是使用IPSec加密时,中心需要在发送数据分支的隧道上解密,并且在接收数据分支的隧道上重新加密另一种情况是通讯的两个分支在同一个城市,而中心在另一个城市,这也会引入不必要的延时当星形IPSec网络(hub−and−spoke)规模不断增长时,IP数据包的动态路由将非常有意义在过去的帧中继星形网络中,通过在帧中继链路上运行OSPF或EIGRP等动态路由协议来通告分支网络的可达性,并支持路由的冗余当中心路由器失效后,还可以利用一个备份的路由器接替中心路由器管理分支间的路由在IPSec隧道和动态路由协议之间存在一个基础问题,即动态路由协议依赖于多播或广播包进行路由可达性通告,而IPSec隧道不支持对多播或广播包进行加密目前解决这一问题的办法是利用通用路由封装(GRE)隧道与IPSec加密相结合的方法通用路由封装(GRE)由IETF在RFC 2784中定义是一个在任意一种网络层协议上封装任意一个其它网络层协议的协议通常将有效载荷封装在一个GRE包中,然后将此GRE包封装在其它某协议中并进行转发GRE隧道支持运载多播或广播包到对端,而GRE隧道的数据包是单播的,所以GRE隧道的数据包可被IPSec加密,也即GRE Over IPSec。
在这一过程中,GRE用于建立隧道,IPSec完成VPN网络的加密部分建立GRE隧道时,隧道的一端必须知道另一端的IP地址,并且必须能够在Internet上路由这就意味着中心和所有分支路由器必须具有静态的公共IP地址但是对于规模较小的分支结构而言,向ISP申请静态IP地址的费用是非常昂贵的无论是ADSL还是直接线缆接入,ISP通常使用DHCP提供动态IP地址,以节省其地址资源在IPSec VPN上实现动态路由协议需要GRE隧道的支持;实现GRE隧道,所有节点需要静态的公网地址,而所有节点都申请静态IP地址是非常困难的所有上述的限制可以总结为以下四点:1. IPSec利用访问控制列表(ACL)来决定哪些数据是需要加密的所以,每增加一个网络连接,都必须在中心和分支的路由器上更新ACL的配置如果路由器是由服务商管理的,用户就必须通知服务商更新IPSec ACL配置,以便新的通讯能够被加密 2. 在大型的星形网络(hub−and−spoke)中,中心路由器的IPSec ACL配置将非常大而且复杂,甚至是不可用的例如为了管理300个分支路由器,在中心路由器上可能需要3900行的配置,这已经大到很难排查错误的程度了。
而且如此大的配置可能无法全部装载到路由器的内存中,而不得不放在闪存里面 3. GRE+IPSec需要明确知道隧道两端的IP地址,而分支路由器外网接口的IP地址通常由其本地ISP动态提供,每次上线时的IP地址是不同的 4. 如果分支机构之间需要通过IPSec VPN直接通信的话,星形的网络(hub−and−spoke)就必须改变为全网状结构(full mesh)由于无法确定哪些分支机构之间需要通过IPSec VPN直接通信,就必须维护一个全网状结构的网络,尽管某些分支机构之间是不需要通过IPSec VPN直接通信的由于每台路由器都与所有其它路由器保持隧道连通,所以在小型路由器上根本无法实现,即在较小的分支机构也不得不使用更强大的路由器 二、DMVPN解决方案DMVPN是通过多点GRE(mGRE)和下一跳解析协议(NHRP)与IPSec相结合实现的在DMVPN解决方案中,利用IPSec实现加密功能,利用GRE或多点GRE(mGRE)建立隧道,利用NHRP解决分支节点的动态地址问题DMVPN只要求中心节点必须申请静态的公共IP地址下一跳解析协议(NHRP)由IETF在RFC 2332中定义用于非广播多路访问(NBMA)网络上的源节点(主机或路由器)如何获取到达目标节点的“下一跳”的互联网络层地址和NBMA子网地址。
2.1、IPSec加密的自动起始IPSec利用访问控制列表(ACL)来决定哪些数据是需要加密的也就是说,当有数据包匹配所定义的ACL时,IPSec加密隧道便会建立当利用GRE Over IPSec时,GRE隧道的配置已经包括了GRE隧道对端的地址,这个地址同时也是IPSec隧道的对端地址所以,没有必要再单独为IPSec定义匹配ACL通过将GRE隧道与IPSec绑定,GRE隧道一旦建立,将立刻触发IPSec加密2.2、分支到中心(Spoke−to−Hub)的动态隧道建立DMVPN网络中,在中心路由器上没有关于分支的GRE或IPSec配置信息,而在分支路由器上则必须依据中心路由器的外网公共IP地址和NHRP协议来配置GRE隧道当分支路由器加电启动时,由ISP处通过DHCP获取IP地址,并自动建立IPSec加密的GRE隧道,通过NHRP向中心路由器注册自己的外网端口IP地址这样做有三方面的原因:1)由于分支路由器外网端口的IP地址是自动获取的,每次上线时的IP地址可能不同,所以中心路由器无法根据该地址信息进行配置2)中心路由器不必针对所有分支分别配置GRE或IPSec信息,将大大简化中心路由器的配置。
所有相关信息可通过NHRP自动获取3)当DMVPN网络扩展时,无须改动中心路由器和其它分支路由器的配置新加入的分支路由器将自动注册到中心路由器,通过动态路由协议,所有其它分支路由器可以学到这条新的路由,新加入的分支路由器也可以学到到达其它所有路由器的路由信息2.3、分支到分支(Spoke−to−Spoke)的动态隧道建立在DMVPN网络中,分支到中心(Spoke−to−Hub)的隧道一旦建立便持续存在,但是各分支之间并不需要直接配置持续的隧道当一个分支需要向另一个分支传递数据包时,它利用NHRP来动态获取目的分支的IP地址在这一过程中,中心路由器充当NHRP服务器的角色,响应NHRP请求,向源分支提供目标分支的公网地址于是,两个分支之间可以通过mGRE端口动态建立IPSec隧道,进行数据传输该隧道在预定义的周期之后将自动拆除2.4、对动态路由协议的支持DMVPN以GRE隧道为基础,而GRE隧道支持多播或广播(multicast/broadcast)IP包在隧道内传输所以,DMVPN网络支持在IPSec和mGRE隧道之上运行动态路由协议需要指出的是,NHRP必须被配置为动态多播映射,这样,当分支路由器在NHRP服务器(中心路由器)上注册单播映射地址时,NHRP会同时为这个分支路由器建立一个多播/广播(multicast/broadcast)映射。
我们在前面提到IPSec隧道不支持多播/广播(multicast/broadcast)包的封装,而GRE隧道可以将多播/广播(multicast/broadcast)包封装到GRE包中,并且GRE包是单播包,可以被IPSec加密在用IPSec对GRE包进行加密时,可以将IPSec配置为传输模式,因为GRE已经将原始数据包封装为单播的IP包,没有必要让IPSec再封装一个包头IPSec的传输模式要求被加密数据包的源和目的地址必须与IPSec隧道两端的地址相匹配,也就是说GRE隧道两端的地址与IPSec隧道两端的地址必须相同由于GRE隧道两端的路由器与IPSec隧道两端的路由器是相同的两台路由器,所以这一点是可以保证的通过GRE隧道与IPSec加密相结合,我们可以利用动态路由协议在加密隧道两端的路由器上更新路由表从隧道对端学到的子网在路由表条目里将会包含隧道对端的IP地址作为到达对端子网的下一跳地址这样,隧道任何一端的网络发生变化,另外一端都会动态地学习到这个变化,并保持网络的连通性而无需改变路由器的配置三、DMVPN网络中动态路由协议的实现我们在前面提到,在DMVPN网络中,分支到中心(Spoke−to−Hub)的隧道一旦建立便持续存在,而各分支之间并没有持续存在的隧道。
这样,在路由器初始化后,中心路由器会通过持续存在的隧道向分支路由器宣告其它分支子网的可达路由于是,分支路由器的路由表中到达其它分支子网的“下一跳”地址就是中心路由器的隧道端口地址,而不是其它分支路由器的隧道端口地址如此一来,分支与分支之间的数据传输还是会通过中心路由器要解决这一问题,必须在中心路由器上设置为在mGRE隧道端口上宣告某一分支子网的可达路由时“下一跳”地址是该分支路由器的隧道端口地址,而非中心路由器的地址在RIP或EIGRP等距离向量型路由协议中,通常都实现了水平分割(split horizon)功能,阻止将路由信息发回到其来源端口,以避免相邻路由器上路由环路的产生如果在DMVPN网络上运行RIP或EIGRP协议,则必须关闭水平分割(split horizon)功能否则,分支路由器将无法学习到通往其它分支子网的路由对RIP而言,这已经足够了,因为RIP向路由信息来源端口发送该路由时,其“下一跳”地址不被改变,仍然是原来的地址而EIGRP在向路由信息来源端口发送该路由时,其“下一跳”地址将改变为该端口的地址所以,必须关闭这一特性(EIGRP是CISCO公司的私有协议,关闭这一特性的IOS命令为no ip next−hop−self eigrp )。
OSPF是链路状态型路由协议,其本身就不存在水平分割(split horizon)问题但在配置OSPF网络类型时,应配置为广播型而不要使用点到多点型,否则,仍然会导致上述的问题另外需要注意的是,必须把DMVPN的中心路由器(Hub)配置为OSPF的指定路由器(DR),可以通过指定中心路由器(Hub)有更高的OSPF优先权来实现。