BGP EVPN方式部署分布式网关
在BGP EVPN方式部署分布式网关的场景中,控制平面的流程包括VXLAN隧道建立、MAC地址动态学习;转发平面的流程包括同子网已知单播报文转发、同子网BUM报文转发、跨子网报文转发。该方式实现的功能全面,支持主机IP路由通告、主机MAC地址通告、主机ARP通告(详情参见BGP EVPN基本原理),可以直接使能ARP广播抑制功能。
组合类别 |
实现差异 |
---|---|
IPv6 over IPv4 |
|
IPv4 over IPv6 |
不支持 |
IPv6 over IPv6 |
不支持 |
VXLAN隧道建立
VXLAN隧道由一对VTEP IP地址确定,创建VXLAN隧道实际上是两端VTEP获取对端VTEP IP地址的过程,只要对端VTEP IP地址是三层路由可达的,VXLAN隧道就可以建立成功。通过BGP EVPN方式动态建立VXLAN隧道,就是在两端VTEP之间建立BGP EVPN对等体,然后对等体之间利用BGP EVPN路由来互相传递VNI和VTEP IP地址信息,从而实现动态建立VXLAN隧道。
在分布式网关的场景中,VTEP同时作为二层网关和三层网关,Switch1节点不感知VXLAN隧道,只作为VXLAN报文的转发节点。控制平面只需在VTEP之间建立VXLAN隧道,如图1-27所示,VTEP1与VTEP2之间建立VXLAN隧道用于Host1和Host2、Host3和Host2之间的通信。对于Host1和Host3之间的通信,由于都属于VTEP1,所以互访的流量只需在VTEP1上处理,无需通过VXLAN隧道转发。
在分布式网关场景中,通过BGP EVPN方式动态建立VXLAN隧道有以下两种情况:
同子网互通
如图1-28所示,当处于同一子网的Host3与Host2互通时,只需要进行二层转发。通过BGP EVPN方式建立VXLAN隧道的过程如下。
首先在VTEP1和VTEP2之间建立BGP EVPN对等体。然后,在VTEP1和VTEP2上分别创建二层广播域,并在二层广播域下配置关联的二层VNI。接下来创建EVPN实例,配置本端EVPN实例的RD、出方向VPN-Target(ERT)、入方向VPN-Target(IRT),然后在二层广播域下绑定该EVPN实例。在配置完本端VTEP IP地址后,VTEP1和VTEP2会生成BGP EVPN路由并发送给对端,该路由携带本端EVPN实例的出方向VPN-Target和BGP EVPN协议新定义的Type3路由即Inclusive Multicast路由。其中,Inclusive Multicast路由如图1-29所示,由前缀和PMSI属性组成,VTEP IP地址存放在前缀的Originating Router's IP Address字段中,二层VNI存放在PMSI属性的MPLS Label字段中。
VTEP1和VTEP2在收到对端发来的BGP EVPN路由后,首先检查该路由携带的EVPN实例的出方向VPN-Target,如果与本端EVPN实例的入方向VPN-Target相等,则接收该路由,否则丢弃该路由。在接收该路由后,VTEP1和VTEP2将获取其中携带的对端VTEP IP地址和二层VNI,如果对端VTEP IP地址是三层路由可达的,并且对端二层VNI与本端相同,则建立一条到对端的VXLAN隧道和一个头端复制列表,头端复制列表用于后续BUM(Broadcast&Unknown-unicast&Multicast)报文转发。
VPN-Target是一种BGP扩展团体属性,一个EVPN实例可以配置出方向和入方向两类VPN-Target,两端EVPN实例的VPN-Target要相互匹配(即本端EVPN实例配置的出方向VPN-target值需要与对端EVPN实例配置的入方向VPN-target值相等),才能相互交换EVPN路由,否则VXLAN隧道无法建立成功。如果仅有一端匹配成功可以接收路由,则此端设备上可以建立通往另一端设备的隧道,但是无法传输数据报文,因为另一端设备在收到报文后,将会检查本端是否有通往对端的VXLAN隧道,如果没有的话,将会丢弃报文。
关于VPN-Target更详细的描述,具体请参考《S12700, S12700E V200R019C10 配置指南-VPN》 BGP/MPLS IP VPN配置 中的“基本概念”
跨子网互通
当处于不同子网的Host1与Host2互通时,需要进行三层转发,因此在通过BGP EVPN方式建立VXLAN隧道的过程中,网关VTEP1和VTEP2需要发布下属主机的IP路由。一般情况下,这里发布的是32位主机IP路由,因为在VXLAN网络中,不同的VTEP节点可能连接着相同的网段,所以如果VTEP节点发布的是下属主机IP所在的网段路由,则可能与其他VTEP节点发布的网段路由冲突,进而导致某些VTEP节点的下属主机不可达。只有在如下两种场景中,VTEP节点可发布网段路由:
VTEP节点连接的网段在整个VXLAN网络中是唯一的,而且有效的主机明细路由数量较大,此时可发布主机IP所在的网段路由,从而减轻VTEP节点上路由存储的压力。
VXLAN网络中的主机需要访问外部网络,此时VTEP节点可在VXLAN网络中发布其连接的外部网段路由,从而使其他VTEP节点学习到去往外部网络的路由。
建立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隧道的过程有以下两种:
通过IRB类型路由发布主机IP路由(如图1-30所示)
Host1首次与VTEP1通信时,通过动态ARP报文,VTEP1学习到Host1的ARP表项。同时,VTEP1根据Host1所在的二层广播域找到绑定VBDIF接口的VPN实例,获取关联的三层VNI。然后VTEP1上的EVPN实例根据上述信息生成IRB类型路由,如图1-31所示。其中,主机IP地址存放在IP Address Length和IP Address字段中,三层VNI存放在MPLS Label2字段中。
VTEP1上的EVPN实例从IRB类型路由中获取Host1的主机IP地址、三层VNI,发给本端VPN实例,VPN实例在其路由表中保存Host1的主机IP路由,如图1-32所示。
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隧道,如图1-33所示。
只有当BGP EVPN路由携带的ERT与本端EVPN实例的IRT、本端VPN实例的eIRT都不同时,才会丢弃该路由。
在通过EVPN实例或VPN实例接收该路由后,VTEP2通过下一跳属性获取VTEP1的VTEP IP地址,如果该VTEP IP地址是三层路由可达的,则建立一条到VTEP1的VXLAN隧道。
VTEP1建立到VTEP2的VXLAN隧道的过程与上述相同,这里不再赘述。
通过IP前缀类型路由发布主机IP路由(如图1-34所示)
首先在VTEP1上将Host1的主机IP地址生成直连路由,然后在VTEP1上配置VPN实例引入直连路由,这样Host1的主机IP路由就保存到VPN实例的路由表中,并添加VPN实例关联的三层VNI,如图1-35所示。
如果要发布网段路由,这里需要先利用动态路由协议(如OSPF等)发布该网段路由,再配置VPN实例引入对应的动态协议路由。
在VTEP1上配置VPN实例向EVPN实例发布IP路由后,VPN实例下Host1的主机IP路由将发布给EVPN实例。然后由EVPN实例生成IP前缀类型路由,如图1-36所示。其中,主机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隧道接口,如图1-37所示。
在通过VPN实例接收该路由后,VTEP2通过下一跳属性获取VTEP1的VTEP IP地址,如果该VTEP IP地址是三层路由可达的,则建立一条到VTEP1的VXLAN隧道。
VTEP1建立到VTEP2的VXLAN隧道的过程与上述相同,这里不再赘述。
MAC地址动态学习
在VXLAN网络中,为了实现终端租户的互通,支持MAC地址动态学习,不需要网络管理员手工维护,大大减少了维护工作量。在分布式网关场景中,跨子网互通需要进行三层转发,MAC地址学习只在本端主机和网关之间通过动态ARP报文实现,这里不再详述。下面结合图1-38,详细介绍一下同子网主机互通时,MAC地址动态学习的过程:
Host3首次与VTEP1通信时,通过动态ARP报文,VTEP1学习到Host3的MAC地址、BD ID(二层广播域标识)和报文入接口的对应关系,并在本地MAC表中生成Host3的MAC表项,其出接口为Port1。同时,VTEP1根据Host3的ARP表项生成BGP EVPN路由并发送给对等体VTEP2,该路由携带本端EVPN实例的出方向VPN-Target、路由下一跳属性以及BGP EVPN协议新定义的Type2路由即MAC/IP路由。其中,路由下一跳属性携带的是本端VTEP IP地址;MAC/IP路由如图1-39所示,Host3的MAC地址存放在MAC Address Length和MAC Address字段中,二层VNI存放在MPLS Label1字段中。
VTEP2收到VTEP1发来的BGP EVPN路由后,首先检查该路由携带的EVPN实例的出方向VPN-Target,如果与本端EVPN实例的入方向VPN-Target相等,则接收该路由,否则丢弃该路由。在接收该路由后,VTEP2获得Host3的MAC地址、BD ID和VTEP1上VTEP IP地址(下一跳属性)的对应关系,并在本地的MAC表中生成Host3的MAC表项,其出接口需根据下一跳进行迭代,最终迭代结果是指向VTEP1的VXLAN隧道。
VTEP1学习Host2的主机MAC的过程与上述过程相同,这里不再赘述。
Host3初次与Host2通信时,首先发送目的MAC为全F、目的IP为IP2的ARP请求报文,请求Host2的MAC地址。缺省情况下,VTEP1收到该ARP请求后将在本网段进行广播,为了减少广播报文,此时可以在VTEP1上使能ARP广播抑制功能。这样当VTEP1收到该ARP请求报文时,先根据目的IP检查本地是否有Host2的MAC地址,如果有则将目的MAC替换为Host2的MAC地址,将ARP请求的广播报文变为单播报文,然后通过VXLAN隧道发给VTEP2。VTEP2收到后转发给Host2,Host2收到该ARP请求后学习到Host3的MAC地址,并以单播形式进行ARP应答。Host3收到ARP应答报文后学习到Host2的MAC地址。至此,Host3和Host2互相学习到对方的MAC地址,后续双方将采用单播通信。
VTEP节点也可以通过数据转发过程学习主机MAC地址,但是依赖于设备从数据报文中学习MAC地址的能力。在BGP EVPN方式建立VXLAN隧道的场景中,VTEP节点之间可以通过BGP EVPN路由动态学习主机MAC地址,不再依赖数据转发过程。
同子网已知单播报文转发
同子网已知单播报文转发只在VXLAN二层网关之间进行,三层网关无需感知。报文转发流程如图1-40所示。
- VTEP1收到来自Host3的报文,根据报文中接入的端口和VLAN信息获取对应的二层广播域,并在该二层广播域内查找出接口和封装信息。
- VTEP1根据查找到的封装信息对数据报文进行VXLAN封装,然后根据查找到的出接口进行报文转发。
- VTEP2收到VXLAN报文后,根据UDP目的端口号、源/目的IP地址、VNI判断VXLAN报文的合法有效性。然后依据VNI获取对应的二层广播域,进行VXLAN解封装,获取内层的二层报文。
- VTEP2根据内层二层报文的目的MAC,从本地MAC表找到对应的出接口和封装信息,为报文添加VLAN Tag,转发给对应的主机Host2。
Host2向Host3发送报文的过程类似,这里不再赘述。
同子网BUM报文转发
同子网BUM报文转发只在VXLAN二层网关之间进行,三层网关无需感知。同子网BUM报文转发采用头端复制方式。
- VTEP1收到来自终端A的报文,根据报文中接入的端口和VLAN信息获取对应的二层广播域。
- VTEP1根据对应的二层广播域获取对应VNI的头端复制隧道列表,依据获取的隧道列表进行报文复制,并进行VXLAN封装。然后将封装后的报文从出接口转发出去。
- VTEP2/VTEP3收到VXLAN报文后,根据UDP目的端口号、源/目的IP地址、VNI判断VXLAN报文的合法有效性。然后依据VNI获取对应的二层广播域,进行VXLAN解封装,获取内层二层报文。
- VTEP2/VTEP3检查内层二层报文的目的MAC,发现是BUM MAC,在对应的二层广播域内的非VXLAN隧道侧进行广播处理,即:VTEP2/VTEP3分别从本地MAC表中找到非VXLAN隧道侧的所有出接口和封装信息,为报文添加VLAN Tag,转发给对应的终端B/C。
跨子网报文转发
跨子网报文转发需要通过三层网关实现。在分布式网关场景中,跨子网报文转发的流程如图1-42所示。
- VTEP1收到来自Host1的报文,检测到报文的目的MAC是网关接口MAC,判断该报文需要进行三层转发。
- VTEP1根据报文的入接口找到对应的二层广播域,然后找到绑定该广播域VBDIF接口的VPN实例。根据报文的目的IP地址,查找该VPN实例下的路由表(如图1-43所示),获取该路由对应的三层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实例下的路由表(如图1-44所示),获取报文的下一跳是网关接口地址,然后将目的MAC地址替换为Host2的MAC地址,源MAC地址替换为VTEP2的MAC地址,转发给Host2。
Host2向Host1发送报文的过程类似,这里不再赘述。
当需要与其他厂商设备互通时,请保证其他厂商设备也采用相同的转发模式,否则可能导致无法互通。