EVPN(Ethernet Virtual Private Network)是一种用于二层网络互联的VPN技术。EVPN技术采用类似于BGP/MPLS IP VPN的机制,在BGP协议的基础上定义了一种新的网络层可达信息NLRI(Network Layer Reachability Information)即EVPN NLRI,EVPN NLRI定义了几种新的BGP EVPN路由类型,用于处在二层网络的不同站点之间的MAC地址学习和发布。
原有的VXLAN实现方案没有控制平面,是通过数据平面的流量泛洪进行VTEP发现和主机信息(包括IP地址、MAC地址、VNI、网关VTEP IP地址)学习的,这种方式导致VXLAN网络存在很多泛洪流量。为了解决这一问题,VXLAN引入了EVPN作为控制平面,通过在VTEP之间交换BGP EVPN路由实现VTEP的自动发现、主机信息相互通告等功能,从而避免了不必要的数据流量泛洪。
在EVPN VXLAN场景中,控制平面的流程包括VXLAN隧道建立、MAC地址动态学习;转发平面的流程包括同子网已知单播报文转发、同子网BUM(Broadcast&Unknown-unicast&Multicast)报文转发、跨子网报文转发。EVPN VXLAN有集中式网关部署和分布式网关部署两种部署场景,下面分别对两场景的各个流程进行介绍。
VXLAN隧道由一对VTEP IP地址确定,创建VXLAN隧道实际上是两端VTEP获取对端VTEP IP地址的过程,只要对端VTEP IP地址是三层路由可达的,VXLAN隧道就可以建立成功。
通过BGP EVPN方式动态建立VXLAN隧道,就是在两端VTEP之间建立BGP EVPN对等体,然后对等体之间利用BGP EVPN路由来互相传递VNI和VTEP IP地址信息,从而实现动态建立VXLAN隧道。
如下图所示,VTEP2上部署了两个Host,VTEP3上部署了一个Host,VTEP1上部署三层网关。
为了实现Host3和Host2之间的通信,需要在VTEP2和VTEP3之间创建VXLAN隧道;
为了实现Host1和Host2之间的通信,需要在VTEP2和VTEP1之间以及VTEP1和VTEP3之间创建VXLAN隧道。
对于Host1和Host3之间的通信,虽然都属于VTEP2,但由于属于不同子网,需要经过三层网关VTEP1,因此也需要在VTEP2和VTEP1之间创建VXLAN隧道。
下面以VTEP2和VTEP3为例,介绍一下通过BGP EVPN方式动态建立VXLAN隧道的过程:
首先在VTEP2和VTEP3之间建立BGP EVPN对等体。然后,在VTEP2和VTEP3上分别创建二层广播域,并在二层广播域下配置关联的VNI。接下来在二层广播域下创建EVPN实例,配置本端EVPN实例的RD、出方向VPN-Target(ERT)、入方向VPN-Target(IRT)。
在配置完本端VTEP IP地址后,VTEP2和VTEP3会生成BGP EVPN路由并发送给对端,该路由携带本端EVPN实例的出方向VPN-Target和BGP EVPN协议新定义的Type3路由(Inclusive Multicast路由)。
如下图所示,Type3路由由前缀和PMSI属性组成,VTEP IP地址存放在前缀的Originating Router's IP Address字段中,VNI存放在PMSI属性的MPLS Label字段中。
VTEP2和VTEP3在收到对端发来的BGP EVPN路由后,首先检查该路由携带的EVPN实例的出方向VPN-Target,如果与本端EVPN实例的入方向VPN-Target相等,则接收该路由,否则丢弃该路由。
在接收该路由后,VTEP2和VTEP3将获取其中携带的对端VTEP IP地址和VNI,如果对端VTEP IP地址是三层路由可达的,则建立一条到对端的VXLAN隧道;同时,如果对端VNI与本端相同,则创建一个头端复制表,用于后续BUM报文转发。
VTEP2和VTEP1之间、VTEP3和VTEP1之间通过BGP EVPN方式动态建立VXLAN隧道的过程与上述类似。
说明:
VPN-Target是一种BGP扩展团体属性,一个EVPN实例可以配置出方向和入方向两类VPN-Target,两端EVPN实例的VPN-Target要相互匹配(即本端EVPN实例配置的出方向VPN-target值需要与对端EVPN实例配置的入方向VPN-target值相等),才能相互交换EVPN路由,否则VXLAN隧道无法建立成功。
如下图所示,VTEP同时作为二层网关和三层网关,Switch1节点不感知VXLAN隧道,只作为VXLAN报文的转发节点。控制平面只需在VTEP之间建立VXLAN隧道。
VTEP1与VTEP2之间建立VXLAN隧道用于Host1和Host2、Host3和Host2之间的通信。
对于Host1和Host3之间的通信,由于都属于VTEP1,所以互访的流量只需在VTEP1上处理,无需通过VXLAN隧道转发。
当处于同一子网的Host3与Host2互通时,只需要进行二层转发。通过BGP EVPN方式建立VXLAN隧道的过程和集中式网关部署场景建立VXLAN的过程相同。
当处于不同子网的Host1与Host2互通时,需要进行三层转发,因此在通过BGP EVPN方式建立VXLAN隧道的过程中,网关VTEP1和VTEP2需要发布下属主机的IP路由。建立VXLAN隧道之前,需要在VTEP1和VTEP2上进行如下配置准备:
配置任务 |
作用 |
创建二层广播域(BD),并在二层广播域下配置关联的二层VNI。 |
创建VXLAN网络转发数据报文的实体。 |
在VTEP1和VTEP2之间建立BGP EVPN对等体。 |
用于交换BGP EVPN路由。 |
创建EVPN实例并绑定BD域,配置EVPN实例的RD、出方向VPN-Target(ERT)、入方向VPN-Target(IRT)。 |
用于生成BGP EVPN路由。 |
为不同租户创建VPN实例,将VPN实例绑定到指定二层广播域的VBDIF接口上。 |
用于区分和隔离不同租户的IP路由表。 |
为VPN实例指定关联的三层VNI。 |
用于VTEP节点在收到数据报文时判断使用哪个VPN实例的路由表指导转发。 |
配置VPN实例到EVPN实例的出方向VPN-Target(eERT),以及从EVPN实例到VPN实例的入方向VPN-Target(eIRT)。 |
用于控制本端VPN实例与对端EVPN实例之间BGP EVPN路由的发布和接收。 |
配置VTEP1和VTEP2之间发布的路由类型。 |
用于发布Host1和Host2的主机IP路由。这里有IRB和IP前缀两种路由类型,可根据如下原则进行选择:
|
根据主机IP路由发布方式的不同,动态建立VXLAN隧道的过程有以下两种:
Host1首次与VTEP1通信时,通过动态ARP报文,VTEP1学习到Host1的ARP表项。同时,VTEP1根据Host1所在的二层广播域找到绑定VBDIF接口的VPN实例,获取关联的三层VNI。然后VTEP1上的EVPN实例根据上述信息生成IRB类型路由,如下图所示。其中,主机IP地址存放在IP Address Length和IP Address字段中,三层VNI存放在MPLS Label2字段中。
VTEP1上的EVPN实例从IRB类型路由中获取Host1的主机IP地址、三层VNI,发给本端VPN实例,VPN实例在其路由表中保存Host1的主机IP路由,如下图所示。
VTEP1向VTEP2发送BGP EVPN路由,该路由携带本端EVPN实例的ERT、扩展团体属性、路由下一跳属性以及IRB类型路由。其中,扩展团体属性携带的是隧道类型(取值是VXLAN隧道)、本端VTEP的MAC地址;路由下一跳属性携带的是本端的VTEP IP地址。
VTEP2收到VTEP1发来的BGP EVPN路由后,同时进行如下处理:
检查该路由携带的ERT,如果与本端EVPN实例的IRT相同,则接收该路由。EVPN实例获取到IRB类型路由后,还能提取到其中包含的ARP类型路由,用于主机ARP通告。
检查该路由携带的ERT,如果与本端VPN实例的eIRT相同,则接收该路由。然后,VPN实例获取到该路由携带的IRB类型路由,从中提取Host1的主机IP地址、三层VNI,在其路由表中保存Host1的主机IP路由,并根据路由的下一跳迭代出接口,最终迭代结果是指向VTEP1的VXLAN隧道,如下图所示。
说明:
只有当BGP EVPN路由携带的ERT与本端EVPN实例的IRT、本端VPN实例的eIRT都不同时,才会丢弃该路由。
在通过EVPN实例或VPN实例接收该路由后,VTEP2通过下一跳属性获取VTEP1的VTEP IP地址,如果该VTEP IP地址是三层路由可达的,则建立一条到VTEP1的VXLAN隧道。
VTEP1建立到VTEP2的VXLAN隧道的过程与上述相同。
首先在VTEP1上将Host1的主机IP地址生成直连路由,然后在VTEP1上配置VPN实例引入直连路由,这样Host1的主机IP路由就保存到VPN实例的路由表中,并添加VPN实例关联的三层VNI。
在VTEP1上配置VPN实例向EVPN实例发布IP路由后,VPN实例下Host1的主机IP路由将发布给EVPN实例。然后由EVPN实例生成IP前缀类型路由,如下图所示。其中,主机IP地址存放在IP Prefix Length和IP Prefix字段中,三层VNI存放在MPLS Label字段中。
VTEP1向VTEP2发送BGP EVPN路由,该路由携带本端VPN实例的eERT、扩展团体属性、路由下一跳属性以及IP前缀类型路由。其中,扩展团体属性携带的是隧道类型(取值是VXLAN隧道)、本端VTEP的MAC地址;路由下一跳属性携带的是本端的VTEP IP地址。
VTEP2收到VTEP1发来的BGP EVPN路由后,进行如下处理:
检查该路由携带的eERT,如果与本端VPN实例的eIRT相同,则接收该路由,否则丢弃该路由。然后,VPN实例获取到该路由携带的IP前缀类型路由,从中提取Host1的主机IP地址、三层VNI,在其路由表中保存Host1的主机IP路由,并将路由的下一跳迭代出接口设置为VXLAN隧道接口,如下图所示。
在通过VPN实例接收该路由后,VTEP2通过下一跳属性获取VTEP1的VTEP IP地址,如果该VTEP IP地址是三层路由可达的,则建立一条到VTEP1的VXLAN隧道。
VTEP1建立到VTEP2的VXLAN隧道的过程与上述相同。
在VXLAN网络中,为了实现终端租户的互通,支持MAC地址动态学习,不需要网络管理员手工维护,大大减少了维护工作量。
在集中式网关场景和分布式网关场景中,MAC地址动态学习的过程相同。MAC地址动态学习的过程如下:
Host3首次与VTEP2通信时,通过动态ARP报文,VTEP2学习到Host3的MAC地址、BD ID(二层广播域标识)和报文入接口的对应关系,并在本地MAC表中生成Host3的MAC表项,其出接口为Port1。
VTEP2根据Host3的ARP表项生成BGP EVPN路由并发送给对等体VTEP3,该路由携带本端EVPN实例的出方向VPN-Target、路由下一跳属性以及BGP EVPN协议的Type2路由即MAC/IP路由。其中,路由下一跳属性携带的是本端VTEP IP地址;
Type2路由如下图所示,Host3的MAC地址存放在MAC Address Length和MAC Address字段中,二层VNI存放在MPLS Label1字段中。
VTEP3收到VTEP2发来的BGP EVPN路由后,首先检查该路由携带的EVPN实例的出方向VPN-Target,如果与本端EVPN实例的入方向VPN-Target相等,则接收该路由,否则丢弃该路由。
在接收该路由后,VTEP3获得Host3的MAC地址、BD ID和VTEP2上VTEP IP地址(下一跳属性)的对应关系,并在本地的MAC表中生成Host3的MAC表项,其出接口需根据下一跳进行迭代,最终迭代结果是指向VTEP2的VXLAN隧道。
VTEP2学习Host2的主机MAC的过程与上述过程相同。
Host3初次与Host2通信时,首先发送目的MAC为全F、目的IP为IP2的ARP请求报文,请求Host2的MAC地址。缺省情况下,VTEP2收到该ARP请求后将在本网段进行广播,为了减少广播报文,此时可以在VTEP2上使能ARP广播抑制功能。这样当VTEP2收到该ARP请求报文时,先根据目的IP检查本地是否有Host2的MAC地址,如果有则将目的MAC替换为Host2的MAC地址,将ARP请求的广播报文变为单播报文,然后通过VXLAN隧道发给VTEP3。VTEP3收到后转发给Host2,Host2收到该ARP请求后学习到Host3的MAC地址,并以单播形式进行ARP应答。Host3收到ARP应答报文后学习到Host2的MAC地址。至此,Host3和Host2互相学习到对方的MAC地址,后续双方将采用单播通信。
说明:
在集中式网关场景中,在跨子网主机互通时,只需在主机和三层网关之间进行MAC地址动态学习,MAC地址动态学习过程与与上述过程相同。
同子网已知单播报文转发只在VXLAN二层网关之间进行,三层网关无需感知。在集中式网关场景和分布式网关场景中,同子网已知单播报文转发流程相同。报文转发流程如下:
VTEP2收到来自Host3的报文,根据报文接入的端口和携带的VLAN信息获取对应的二层广播域,并在该二层广播域内查找出接口和封装信息。
VTEP2根据查找到的封装信息对数据报文进行VXLAN封装,然后根据查找到的出接口进行报文转发
VTEP3收到VXLAN报文后,根据UDP目的端口号、源/目的IP地址、VNI判断VXLAN报文的合法有效性。然后依据VNI获取对应的二层广播域,进行VXLAN解封装,获取内层的二层报文。
VTEP3根据内层二层报文的目的MAC,从本地MAC表找到对应的出接口和封装信息,对报文进行VLAN Tag的相应处理,转发给对应的主机Host2。
Host2向Host3发送报文的过程类似
同子网BUM报文转发只在VXLAN二层网关之间进行,三层网关无需感知。在集中式网关场景和分布式网关场景中,同子网BUM报文转发方式相同,采用头端复制方式。转发流程如下:
VTEP1收到来自终端A的报文,根据报文中接入的端口和VLAN信息获取对应的二层广播域。
VTEP1根据对应的二层广播域获取对应VNI的头端复制列表,依据头端复制列表进行报文的VXLAN封装,并将报文发送给头端复制列表中的所有出端口VTEP。
VTEP2/VTEP3收到VXLAN报文后,根据UDP目的端口号、源/目的IP地址、VNI判断VXLAN报文的合法有效性。然后依据VNI获取对应的二层广播域,进行VXLAN解封装,获取内层二层报文。
VTEP2/VTEP3检查内层二层报文的目的MAC,发现是BUM MAC,在对应的二层广播域内的非VXLAN隧道侧进行广播处理,即:VTEP2/VTEP3分别从本地MAC表中找到非VXLAN隧道侧的所有出接口和封装信息,对报文进行VLAN Tag的相应处理,转发给对应的终端B/C。
说明:
终端B/C向终端A回应报文,参考同子网已知单播报文转发。
跨子网报文转发需要通过三层网关实现。
在集中式网关场景中,跨子网报文转发的流程如下图所示:
VTEP2收到来自Host1的报文,根据报文中接入的端口和VLAN信息获取对应的二层广播域,在对应的二层广播域内查找出接口和封装信息。
VTEP2根据查找到的出接口和封装信息进行VXLAN封装,向VTEP1转发报文。
VTEP1收到VXLAN报文后进行解封装,发现内层报文中的目的MAC是三层网关接口VBDIF10的MAC地址MAC3,判断需要进行三层转发。
VTEP1剥除内层报文的以太封装,解析目的IP。根据目的IP查找路由表,找到目的IP的下一跳地址,再根据下一跳地址查找ARP表项,获取目的MAC、VXLAN隧道出接口及VNI等信息。
VTEP1重新封装VXLAN报文,向VTEP3转发。其中内层报文以太头中的源MAC是三层网关接口VBDIF20的MAC地址MAC4。
VTEP3收到VXLAN报文后,根据UDP目的端口号、源/目的IP地址、VNI判断VXLAN报文的合法有效性。依据VNI获取对应的二层广播域,然后进行VXLAN解封装,获取内层二层报文,并在对应的二层广播域内查找出接口和封装信息。
VTEP3根据查找到的出接口和封装信息,对报文进行VLAN Tag的相应处理,转发给对应的Host2。
Host2向Host1发送报文的过程类似。
在分布式网关场景中,跨子网报文转发的流程如下:
VTEP1收到来自Host1的报文,检测到报文的目的MAC是网关接口MAC,判断该报文需要进行三层转发。
VTEP1根据报文的入接口找到对应的二层广播域,然后找到绑定该广播域VBDIF接口的VPN实例。根据报文的目的IP地址,查找该VPN实例下的路由表(如下图所示),获取该路由对应的三层VNI,以及下一跳地址。再根据出接口是VXLAN隧道,判断需要进行VXLAN封装:
根据VXLAN隧道的目的IP和源IP地址,获取对应的MAC地址,并将内层目的MAC和源MAC替换。
将三层VNI封装到报文中。
外层封装VXLAN隧道的目的IP和源IP地址,源MAC地址为VTEP1的VBDIF接口MAC地址,目的MAC地址为网络下一跳的MAC地址。
封装后的报文根据外层MAC和IP信息在IP网络中传输,送达VTEP2。
VTEP2收到VXLAN报文后进行解封装,检测到报文的目的MAC是自己的MAC地址,判断该报文需要进行三层转发。
VTEP2根据报文携带的三层VNI找到对应的VPN实例,通过查找该VPN实例下的路由表(如下图所示),获取报文的下一跳是网关接口地址,然后将目的MAC地址替换为Host2的MAC地址,源MAC地址替换为VTEP2的MAC地址,转发给Host2。
Host2向Host1发送报文的过程类似。