ADVPN
概述
ADVPN(Auto Discovery Virtual Private Network,自动发现虚拟专用网络)是一种基于 VAM(VPN Address Management,VPN 地址管理)协议的动态 VPN 技术。 在企业网各分支机构使用动态地址接入公网的情况下,可以利用ADVPN在各分支机构间建立VPN。
实现原理
VAM协议
VAM 协议负责收集、维护和分发动态变化的公网地址等信息,采用 Client/Server 模型。ADVPN 网络中的节点(称为 ADVPN 节点)作为 VAM Client。当公网地址变化时,VAM Client 将当前公网地址注册到 VAM Server。ADVPN 节点通过 VAM 协议从 VAM Server 获取另一端 ADVPN 节点的当前公网地址,从而实现在两个节点之间动态建立跨越 IP 核心网络的 ADVPN 隧道。
组网结构
ADVPN 通过 ADVPN 域区分不同的 VPN 网络,ADVPN 域由域 ID 来标识。属于同一个 VPN 的 VAM Client 需要规划到相同的 ADVPN 域中,且一个 VAM Client 只能属于一个 ADVPN 域;VAM Server 可以同时为多个 ADVPN 域服务,管理多个 ADVPN 域的 VAM Client。
ADVPN节点分为Hub和Spoke两种类型,Hub为中心设备,Spoke为分支设备,Hub是路由信息交换的中心,Spoke不会转发收到的其他ADVPN的数据。
根据转发方式的不同,分为Full-Mesh和Hub-Spoke两种组网结构
- Full-Mesh(全互联)网络:Spoke 和 Spoke 之间可以建立隧道直接通信。
- Hub-Spoke 网络:Spoke 之间不能建立隧道直接通信,只能通过 Hub 转发数据。
当一个 ADVPN 域中的 ADVPN 节点数目较多时,由于某些原因(如动态路由协议邻居数限制等), Hub 无法管理全部的 ADVPN 节点。此时,可以将 ADVPN 网络划分为多个 Hub 组,每个 Hub 组 中包含一个或多个 Hub,及一部分 Spoke 节点,以减轻 Hub 节点的负担。
Full-Mesh组网
Full-Mesh 网络中,Spoke 向 VAM Server 注册后获得 Spoke 所属 ADVPN 域所 在 Hub 组中 Hub 的信息,并与 Hub 建立永久的 ADVPN 隧道。当两个 Spoke 之间有数据报文交互时,Spoke 从 VAM Server 获取对端 Spoke 的公网地址,并在 Spoke 之间直接建立隧道。Spoke 之间的隧道是动态的,当在一段时间(Spoke-Spoke 隧道空闲超时时间)内没有数据报文交互时, 则删除该隧道。
Hub-Spoke组网
Hub-Spoke 网络中,Spoke 向 VAM Server 注册后获得 Spoke 所属 ADVPN 域所在 Hub 组中 Hub 的信息,并与 Hub 建立永久的 ADVPN 隧道。两个 Spoke 之间有数据报文交互时,该报文通过 Hub 转发,不会在 Spoke 之间建立隧道。Hub 既作为路由信息交换的中心,又作为数据转发的中心。
划分多个Hub
- 所有 Hub 必须属于同一个 Hub 组,该 Hub 组作为骨干区域。骨干区域采用 Full-Mesh 组网, 即 Hub 向 VAM Server 注册后获得骨干区域中所有 Hub 的信息,并在每两个 Hub 之间都建立永久的 ADVPN 隧道。
- 将 Spoke 部署到除骨干区域外的其他 Hub 组中。这些 Hub 组内至少有 1 个 Hub,可以使用 Full-Mesh 组网也可以使用 Hub-Spoke 组网。Spoke 向 VAM Server 注册后获得 Spoke 所属 ADVPN 域所在 Hub 组中 Hub 的信息,并与 Hub 建立永久的 ADVPN 隧道。一个 Hub 组内的 Spoke 只与本组的 Hub 建立 ADVPN 隧道,不与其他 Hub 组的 Hub 建立 ADVPN 隧道。
同一个 Hub 组内,隧道建立方式和数据转发方式由其组网方式决定。不同 Hub 组间,数据需要通过本组的 Hub 转发到目的组的 Hub,再由目的组 Hub 转发到对应的 Spoke。 为了减少 Hub 跨组转发数据时的压力,可以允许不同组的 Spoke 直接建立隧道,但该隧道是动态 的,当在一段时间(Spoke-Spoke 隧道空闲超时时间)内没有数据报文交互时,则删除该隧道。
工作机制
ADVPN 的关键是通过 VAM Client 的私网地址获取动态变化的公网地址,以便建立 ADVPN 隧道、 转发报文。ADVPN 的工作过程分为连接初始化、注册、隧道建立、路由学习和报文转发四个阶段
连接初始化
(1) Client 通过连接请求报文将自己支持的完整性验证算法、加密算法等发送给 Server。
(2) Server 按照优先级从高到低的顺序从自己支持的算法列表中依次选择算法,与 Client 发送的 算法列表进行匹配。如果存在相同的算法,则Server通过连接响应报文将该算法发送给Client; 如果不存在相同的算法,则算法协商失败,断开连接。
(3) 如果协商结果为不对 VAM 协议报文进行加密或认证(Server 上配置不需要加密或认证),则 Server 和 Client 不必生成加密密钥或完整性验证密钥。否则,Server 和 Client 都根据预共享 密钥生成加密密钥和完整性验证密钥。
(4) Client 和 Server 分别利用生成的加密密钥和完整性验证密钥对初始化完成报文进行保护,并发送给对端。如果对端能够正确解密和验证该报文,则算法、密钥协商成功,后续的 VAM 协议报文都通过协商的算法和密钥进行保护。否则,协商失败,断开连接。
注册阶段
(1) Client 向 Server 发送注册请求报文,注册请求报文中包括 Client 的公网地址、私网地址、连 接的私网网段等信息。
(2) Server 收到注册请求报文后,根据配置决定是否对该 Client 进行身份认证。如果配置为不认 证,则直接注册 Client 信息并向 Client 发送注册成功响应;如果配置为认证,Server 向 Client 回应身份认证请求,并指明需要的认证方法。VAM 支持 PAP 和 CHAP 两种认证方式。
(3) Client 向 Server 提交自己的身份信息。
(4) Server 通过 AAA 对 Client 进行认证和计费。认证和计费成功后,Server 向 Client 发送注册成 功响应报文,注册成功报文中携带 Server 下发给 Client 的 Hub 信息。
隧道建立阶段
Spoke要和Hub建立永久隧道,一个Spoke可以和任意多个Hub建立永久隧道。如果在一个ADVPN 域中有多个 Hub,则 Hub 之间需要建立永久隧道。
(1) 发起隧道建立请求
- Hub-Spoke 隧道:Spoke 收到 Server 下发的 Hub 信息后,检查与这些 Hub 之间是否存在隧道。如果隧道不存在,则向 Hub 发送隧道建立请求报文。
- Hub-Hub 隧道:Hub 收到 Server 下发的已注册成功的 Hub 信息后,检查与这些 Hub 之间 是否存在隧道。如果隧道不存在,则向其发送隧道建立请求报文。
- Spoke-Spoke 隧道:在 Full-Mesh 组网中,Spoke 收到某个数据报文后,若没有查到相应的能够转发该报文的隧道,则会向 Server 发送地址解析请求,根据得到的地址解析响应向对端 Spoke 发起隧道建立请求。 (2) 隧道对端收到隧道建立请求后,保存隧道信息,并向请求发起方发送隧道建立成功响应报文。
路由学习和报文转发阶段
ADVPN节点可以通过两种方式学习私网路由:
- 通过静态或动态路由协议学习:ADVPN 网络连接的各个私网及 ADVPN 隧道接口上都需要配置静态路由或动态路由协议,实现私网路由的连通。ADVPN 隧道建立以后,路由协议通过隧道进行邻居发现、路由更新,并建立路由表。ADVPN 隧道可以看作是私网中的一条普通链路, 负责连接不同的私网网段。完成私网路由的学习后,Spoke 接收到它连接的私网用户访问其他私网的报文时,查找路由表找到私网下一跳的地址。Spoke 通过 VAM Server 查询私网下一跳对应的公网地址,并将该公网地址作为隧道的目的地址对报文进行封装。封装后的报文通过 ADVPN 隧道发送给对端。
title: 路由协议连接过程
collapse: close
在做实验的过程中,运行OSPF协议,发现当ADVPN隧道未建立时,OSPF邻居也建立不起来,建立起来后,抓包并没有OSPF协议报文,但根据OSPF的hello报文间隔,可以看到对应端口号为18001的UDP报文,而ADVPN报文默认端口号即为18001,因此可以推断出OSPF报文被封装在了隧道中,因此,只有建立了隧道的节点之间才有机会建立OSPF邻居,从而传递OSPF路由。
- 向VAM Server 注册和查询私网网段:ADVPN 节点将本地连接的私网网段信息注册到 VAM Server。Spoke 接收到它连接的私网用户访问其他私网的报文时,将报文的目的地址发送给 VAM Server,通过 VAM Server 查询连接该目的地址所在私网网段的 ADVPN 节点的信息(包 括 ADVPN 节点的公网和私网地址),并在本地生成到达该私网网段的路由,路由下一跳为该 ADVPN 节点。完成查询后,Spoke 将查询到的 ADVPN 节点的公网地址作为隧道的目的地址对报文进行封装。封装后的报文通过 ADVPN 隧道发送给对端。
在 ADVPN 网络中,如果同时使用了上述两种私网路由学习方式,则 Spoke 接收到它连接的私网用 户访问其他私网的报文时,会同时将私网路由的下一跳地址和报文的目的地址发送给 VAM Server, VAM Server 优先根据目的地址进行查询,即优先采用向 VAM Server 注册和查询私网网段方式。 如果同时通过上述两种方式学习到了到达同一私网网段的路由,则优先选择路由优先级小的路由转发报文。
title: 路由学习的说明
collapse: close
- 路由协议只在 Hub 和 Spoke 以及各 Hub 之间进行交互,在 Spoke 与 Spoke 之间不直接交换路由信息。
- ADVPN 组网采用的是 Full-Mesh 网络还是 Hub-Spoke 网络,由路由决定。如果学习到的路由下一跳是对端 Spoke,则为 Full-Mesh 网络;如果学习到的路由下一跳是 Hub,则为 Hub-Spoke 网络。
Full-Mesh典配
Spoke配置,以Spoke1为例
#
sysname Spoke1
#
ospf 1
area 0.0.0.0
network 192.168.0.0 0.0.0.255
network 192.168.1.0 0.0.0.255
#
interface LoopBack0
ip address 192.168.1.1 255.255.255.0
#
interface GigabitEthernet0/0
port link-mode route
combo enable copper
ip address 3.3.3.1 255.255.255.0
#
interface Tunnel1 mode advpn udp
ip address 192.168.0.3 255.255.255.0
ospf network-type broadcast //full-mesh,运行OSPF,类型为广播
ospf dr-priority 0 //保证不为DR,因为Spoke之间不传递路由,需要通过Hub
// tunnel protection ipsec profile abc 使用ipsec保护advpn隧道,本次实验为了方便抓包查看,并没有配置该命令,后续的几个节点同理
source GigabitEthernet0/0
vam client Spoke1
#
ip route-static 0.0.0.0 0 3.3.3.2
#
#
ipsec transform-set abc
encapsulation-mode transport
esp encryption-algorithm des-cbc
esp authentication-algorithm sha1
#
ipsec profile abc isakmp
transform-set abc
ike-profile abc
#
ike profile abc
keychain abc
#
ike keychain abc
pre-shared-key address 0.0.0.0 0.0.0.0 key simple 123456
#
vam client name Spoke1
advpn-domain abc
server primary ip-address 5.5.5.1
server secondary ip-address 5.5.5.2
pre-shared-key simple 123456
client enable
#
Hub配置,以Hub1为例
#
sysname Hub1
#
ospf 1
area 0.0.0.0
network 192.168.0.0 0.0.0.255
#
interface GigabitEthernet0/0
port link-mode route
combo enable copper
ip address 1.1.1.1 255.255.255.0
#
interface Tunnel1 mode advpn udp
ip address 192.168.0.1 255.255.255.0
ospf network-type broadcast
source GigabitEthernet0/0
vam client Hub1 //与Spoke类似,但少了个OSPF DR 优先级为0的命令
#
ip route-static 0.0.0.0 0 1.1.1.2
#
vam client name Hub1
advpn-domain abc
server primary ip-address 5.5.5.1
server secondary ip-address 5.5.5.2
pre-shared-key cipher $c$3$BKvulBeO5Ip4F52It3Saudi85bu3dVla
client enable
#
VAM Server配置,以主Server为例
#
interface GigabitEthernet0/0
port link-mode route
combo enable copper
ip address 5.5.5.1 255.255.255.0
#
ip route-static 0.0.0.0 0 5.5.5.3
#
vam server advpn-domain abc id 1
pre-shared-key simple 123456
authentication-method none
server enable
hub-group 0
hub private-address 192.168.0.1
hub private-address 192.168.0.2
spoke private-address range 192.168.0.0 192.168.0.255
#
查看OSPF邻居(使用隧道接口):
由于Spoke1和Spoke2是DROther,且OSPF类型为Broadcost,因此尽管当Spoke1和Spoke2之间建立了动态隧道,Spoke1和2之间也不会建立OSPF邻居,之间学到的私网路由是通过DR,且路由的下一跳为对方的隧道地址:
由于是Full-Mesh组网,因此Hub和Spoke、Hub和Hub之间建立永久隧道:
Spoke与Spoke之间是动态隧道,只有当有流量触发时会建立
查看Spoke1的路由表
可以看到Spoke2的隧道接口地址并没有,此时ping一下Spoke2的隧道接口,发现路由表中新增了一条路由:
随之而来的是,Spoke之间的动态隧道建立起来
那么问题来了,Spoke1是如何知道Spoke2的隧道接口地址对应的公网IP地址的呢?(否则如何建立的advpn隧道?)
Spoke1 ping Spoke2(私网),发现会先向VAM Server获取信息(忽略模拟器抓包导致的报文时序问题)上面的Spoke1 ping Spoke2 隧道接口地址同样也会先与VAM Server交互。
这个在前面的 理论 讲解中其实也提到过: Spoke 通过 VAM Server 查询私网下一跳对应的公网地址,并将该公网地址作为隧道的目的地址对报文进行封装。封装后的报文通过 ADVPN 隧道发送给对端。
Hub-Spoke典配
组网图和基本配置和Full-Mesh基本一致,区别在于,Hub-Spoke中,tunnel的配置中,ospf网络类型为p2mp
此时,Spoke之间不会建立动态隧道,只有Spoke-Hub和Hub-Hub之间的隧道
查看OSPF路由: 可以看到,私网路由的下一跳为Hub的隧道接口地址,而非Full-Mesh的Spoke隧道接口地址。同时,Spoke隧道的接口地址,也通过Hub传递后才学习到。
Spoke1 ping Spoke2(私网),需要绕行到Hub(1.1.1.1和2.2.2.1)上。
title: ADVPN配置限制
collapse: close
ADVPN 客户端 IPv4 私网支持的路由协议为 OSPF、RIP 和 BGP:
- 采用 OSPF 路由协议时,如果是 **Full-Mesh** 网络,OSPF 接口的网络类型需要配置为 **broadcast**;如果是 **Hub-Spoke** 网络,OSPF 接口的网络类型需要配置为 **p2mp**。
- 采用 RIP 路由协议时,不支持 Full-Mesh 网络,仅支持 Hub-Spoke 网络,且需要关闭水平分割功能。
- 采用 BGP 路由协议时,如果是 Full-Mesh 网络,需要通过路由策略等配置,保证一端 Spoke 学习到的到达对端私网路由的下一跳为对端 Spoke 的地址(EBGP 不支持 Full-Mesh 网络); 如果是Hub-Spoke网络,需要通过路由策略等配置,保证一端Spoke学习到的到达对端私网路由的下一跳为 Hub 的地址。
ADVPN 客户端 IPv6 私网支持的路由协议为 OSPFv3、RIPng 和 IPv6 BGP:
- 采用 OSPFv3 路由协议时,如果是 Full-Mesh 网络,OSPFv3 接口的网络类型需要配置为 broadcast;如果是 Hub-Spoke 网络,OSPFv3 接口的网络类型需要配置为 p2mp。
- 采用 RIPng 路由协议时,只支持 Full-Mesh 网络。
- 采用 IPv6 BGP 路由协议时,如果是 Full-Mesh 网络,需要通过路由策略等配置,保证一端 Spoke 学习到的到达对端私网路由的下一跳为对端 Spoke 的地址(EBGP 不支持 Full-Mesh 网络);如果是 Hub-Spoke 网络,需要通过路由策略等配置,保证一端 Spoke 学习到的到达对端私网路由的下一跳为 Hub 的地址。