作者简介:肖宏辉,毕业于中国科学院大学,目前是VMware的软件工程师。有8年的软件开发经验,其中6年专门从事云计算平台的开发。曾参与开发多个IBM 云平台产品,并在OpenStack社区积极活跃,目前已经有超过300个commit和超过30000行代码的提交。目前他的主要关注点是SDN/NFV等虚拟网络技术。本文所有观点仅代表作者个人观点,与作者现在或者之前所在的公司无关。
EVPN全称是Ethernet VPN,它最开始由RFC7432定义,RFC的全称是:BGP MPLS-Based Ethernet VPN,从名字上看,这是一个基于BGP和MPLS的L2 VPN。虽然这是一个2015年才有编号的RFC,但当它还是草案时,很多厂商已经开始实现EVPN。
在这之前与MPLS相关的L2 VPN标准在很早前就提出过,这包括:
☘ RFC4447提出基于LDP的VPWS(Virtual Private Wire Service)
☘ RFC4762提出基于LDP的VPLS(Virtual Private LAN Service)
☘ RFC4761提出基于BGP的VPLS。
VPLS可以看成是一个full mesh(拓扑中任意两个PE都相连)版本的VPWS。VPLS可以把SP(Service Provider)网络看成一个大的Ethernet Switch,SP提供的PE端口可以看成这个大交换机的端口,而每个CE设备看成是连接在交换机上的设备。VPLS这种架构,便于用户理解和组建网络,但是随着发展,VPLS最大的问题是实现上很难模拟一个Ethernet交换机。
一个交换机怎么工作的?主要这几个动作,Learn,Flood,Filter,Forward。交换机自身有转发表,记录了MAC地址对应的交换机端口。与路由器的路由表不一样,这个转发表并没有一个控制层(control plane)写入,而是通过数据层(data plane)的自学习建立。当交换机收到一个Ethernet Frame,交换机首先会将Frame的源MAC和入口端口记录在转发表中,之后交换机根据Frame的目的MAC,查表找到相应的端口将Frame发送出去。如果目的MAC在转发表中不存在,那么交换机会将这个Frame发送到除了入口端口的其他所有交换机端口(Flood),在响应设备返回的Ethernet Frame中,再记录MAC地址和交换机端口的关系。这样下一次发往这个MAC地址的Frame,没有必要再经过一次Flood。
VPLS采用同样的方式构建转发表,也就是说在数据层进行flood-learn,或者说是在SP提供的WAN上进行flood-learn。同样的,为了避免转发表无限膨胀,还需要给转发表设置aging,清除不活跃的转发条目。所有这些,随着网络规模的增加,对PE和WAN网络的造成了很大的负担,进而限制了VPLS的网络规模。所以,尽管VPLS还有其他的问题和限制,但其没有控制层,或者说数据层不受控制,是VPLS发展的最大问题。现在都说SDN架构,数据控制分离,到这还基本没有控制层,明显不合适,因此EVPN被提出。EVPN架构是在现有的BGP VPLS(RFC4761)方案上,参考了BGP/MPLS L3 VPN(RFC4364)的架构提出的。我们知道SDN架构是控制数据分离,应用在控制层之上构建。对于EVPN来说,控制层是MP-BGP,而EVPN可以看成是构建在MP-BGP上的应用。所以EVPN不仅仅是一种技术和架构,它也有应用场景的定义。更具体的说,EVPN不仅定义了L2 VPN的一种改进方案,还定义了各个应用场景下的行为,像multi-homing,fast convergence,auto-discovery,MAC mobility等等,这些场景都非常有意思。随着EVPN技术的讨论,EVPN也被用来传递IP路由信息,作为VXLAN等overlay网络的控制层,用来作为数据中心互联的控制层等。所有的这些场景和讨论,在一篇文章讲清楚不现实,讲清楚起码要一本书。本文只介绍EVPN的基本概念和简单场景,虽然基本和简单,这些内容是EVPN最核心的部分。
EVI(EVPN Instance):EVPN是一种虚拟私有网络,那么在一套物理设备上必然可以有多个同时存在的EVPN实例,每个实例独立存在。每个EVI连接了一组或者多组用户网络,构成一个或者多个跨地域的二层网络。
ET(Ethernet Tag):刚刚说了,每个EVI可以构成一个或者多个二层网络。当EVI包含了多个二层网络时,通过Ethernet Tag来区分这些二层网络。如果我们把二层网络看成是广播域的话(Broadcast Domain),那么ET就是用来区分不同广播域的。
简单画了一下它们的关系。
☘ Ethernet Segment:这是在CE同时连接到多个PE时才会有的概念。本文暂时不涉及多连接的情况。
☘ MAC-VRF:PE上的虚拟转发单元,类似于BGP/MPLS L3 VPN中的VRF。通过将PE抽象出多个虚拟单元,可以支持多租户场景,使PE同时被多个EVI使用。MAC-VRF中包含了实际的MAC转发表。
每个EVI可以连接一组或多组网络。这与EVPN的三种服务模式相关。
1.2.1 VLAN-Based Service Interface
这种模式下,每个EVI只有一个广播域,连接一组用户网络。如下图所示:
这种模式隔离最好,每组网络都是独立的,缺点是太费EVI了,例如,一个用户如果需要10组L2 VPN网络,就需要10个EVI,而通常SP能提供的EVI数量是有限的。这种模式下,在EVI内部类似于一个FLAT网络。每个MAC-VRF中只有一张MAC转发表。
1.2.2 VLAN Bundle Service Interface
一个EVI有多个广播域,连接了多组用户网络,但是多组用户网络共用MAC转发表。如下图所示:
这种模式,EVI内部类似于VLAN with SVL(Shared VLAN learning)。实际上广播域还是一个,通过逻辑分组区分不同的VLAN。在这种模式下,每个MAC-VRF只有一张MAC转发表,但是转发表类似于下图所示:
端口5连接的CE对应了三个用户VLAN。由于多组用户网络共用MAC转发表,实际上是通过MAC地址来做转发决策,因此这种模式要求所有网络中MAC地址唯一。并且,EVPN连接的用户网络VLAN ID必须一致(如图所示)。举个例子,右边VID11的网络,有一条转发信息发送到了左边,左边为了实现多租户隔离,只能对某一个入口网络开放转发信息,这样才能做到多租户隔离,而由于只有一张转发表,EVI(更确切的说是MAC-VRF)只能允许VID11的入口网络使用这条转发信息。
1.2.3 VLAN-Aware Bundle Service Interface
一个EVI有多个广播域,连接了多组用户网络,但是每组用户网络有自己独立的MAC转发表。如下图所示:
这种模式,EVI内部类似于VLAN with IVL(Independent VLAN learning)。每个MAC-VRF有多张MAC转发表,每张MAC转发表对应一个用户网络。MAC地址和ET同时用来做转发决策,通过ET定位到MAC转发表,再通过MAC地址在转发表内寻址。这种模式允许多组用户网络之间存在重复的MAC地址,并且每组网络的VLAN ID可以不一致。例如,左边VID12的转发信息,可以直接发到VID11对应的MAC-VRF中。这种模式能解决上面两种模式的问题,不过就是实现相对来说复杂一些。
EVPN的实现参考了BGP/MPLS L3 VPN的架构。下图就是一个BGP/MPLS L3 VPN的架构。EVPN架构在这个层面上是一样的。
这里的控制层是指MAC转发信息的传递和MAC-VRF中MAC转发表的写入。具体的说,就是CE1的MAC地址,怎么发送到PE2,进而让PE2收到目的MAC是CE1 MAC地址的Ethernet Frame时,知道应该通过Tunnel发送到PE1。
CE1 -> PE1
CE-PE之间通常还是通过数据层进行MAC 学习。也就是说,PE1需要通过解析CE1发来的数据包,读取其中的源MAC地址,并记录在MAC-VRF中的MAC转发表中。通常这些数据包是设备发出的第一个数据包,例如DHCP,ARP等。采用这种传统的方式,一是CE不需要关心SP网络的实现,另一个是能更好的兼容CE设备。MAC-VRF也对应了一个RD(Route Distinguisher)和一组RT(Route Target)。RD用来区分EVPN实例的信息,RT用来过滤MAC 路由。这在之前介绍BGP/MPLS L3 VPN时有过详细的介绍,这里就不说了。 好了,有关CE1的MAC转发信息到达了PE1,确切的说是到达了PE1内的MAC-VRF。
PE1 -> PE2/MP-BGP
PE之间的MAC转发信息传递,是通过MP-BGP来进行,也就是在EVPN内部,MAC转发信息是通过控制层来传输。这是EVPN与VPLS最核心的区别。因为EVPN内部是SP网络了,SP想怎么玩都可以。MP-BGP是BGP-4的扩展,改版多次,最新的版本由RFC4760定义。EVPN中的MP-BGP本质上还是一个IBGP。现在PE1有了CE1的MAC转发信息,需要做的是封装成BGP数据传递给PE2。首先EVPN在MP-BGP中定义了自己的地址族(AFI 25,SAFI 70)。在这个地址族下,又定义了不同的NLRI(Network Layer Reachability Information)。同时EVPN也定义了多个新的BGP Extended Community(RFC4360),具体如下表所示。
看起来似乎很多,这里我们只看Route Type 2,也就是MAC/IP route,它的NLRI信息定义如下:
☘ RD:RD与MAC-VRF关联,RD的作用是为了区分不同的EVI之间重复的信息,因为PE之间只有一条MP-BGP连接,但是同时存在多个EVI。RD在这里的作用与L3 VPN中一样。
☘ ESI:前面说过,Ethernet Segment是与多连接相关,ESI用来区分多连接中的每条链路。
☘ Ethernet Tag ID:Ethernet Tag ID是4个字节,可以包含12bit或者24bit的标识符。前面说过,Ethernet Tag是用来区分同一个EVI中的不同的广播域的。只有在VLAN-Aware Bundle Service Interface下,才存在多个广播域,Ethernet Tag ID才有意义。Ethernet Tag ID可以用来区分MAC/IP route属于MAC-VRF中的哪张MAC转发表。
☘ MAC Address Length/MAC Address:MAC地址。这就是PE需要封装到BGP中的数据。
☘ IP Address Length/IP Address:IP地址。注意这里的IP地址是可选的,这部分在后面讲ARP/ND时会再说。
☘ MPLS Label:VPN label。在MPLS网络中传输时的内层标签。在数据层,PE根据MPLS label将收到的Ethernet Frame发送到相应的MAC-VRF,进而发送到对应的CE。
MAC/IP route还必须带上一到多个作为Extended community存在的RT。
PE1将这个MAC/IP route发送到PE2。与L3 VPN中的作用一样,PE2通过MAC/IP route中带的RT和自身的MAC-VRF的RT进行匹配,定位到哪些MAC-VRF接收这条路由。由于MAC-VRF可能存在多个转发表,因此可能还需要ET ID来确定路由具体写入到哪个转发表。
到此为止,PE1通过MP-BGP将MAC转发信息写到了PE2。现在PE2上的MAC-VRF知道了,对应的MAC应该转发到PE1上。
PE2
控制层数据到PE2 就结束了。前面介绍PE1传给PE2的MAC/IP route中,有一个可选的IP地址项。如果IP地址也随着MAC/IP route传输到了PE2,那么PE2已经有了响应ARP request的全部信息。此时,如果PE2收到了ARP request,没有必要广播出去。因此,EVPN定义PE2可以支持ARP proxy,这样可以避免ARP request在骨干网上广播,减少不必要的广播信息。
这是控制层MAC学习带来的好处。在VPLS模式下,PE2没有办法事先知道CE1的IP/MAC,只能通过ARP request广播来获取响应。
接下来看一下数据层,例如CE2如何ping到CE1。
CE2 -> PE2
在ping之前,CE2因为不知道CE1的MAC地址,必须要先发送ARP request,通过CE1的IP地址查询CE1的MAC地址。前面说过PE2可以配置ARP proxy,这样PE2收到ARP request之后,直接将CE1的MAC地址放在ARP response中回送给CE2。CE2拿到MAC地址,组装Ethernet Header,将ping包发送到PE2。
PE2 -> PE1
PE2的MAC-VRF记录了MAC的转发信息,因此PE2知道,目的MAC是CE1 MAC的Ethernet Frame应该发送到PE1。PE2->PE1这部分实际上是跑在SP网络上。在EVPN下,定义了三种数据层。
先假设用MPLS作为数据层,VXLAN作为数据层以后有机会再单独介绍。
前面在控制层MAC/IP route中带的MPLS Label(VPN Label)在这里有用处了。它会被加到ping包中,之后为了在MPLS网络中传输,还会在MPLS Label Stack中加上Public Label。中间通过MPLS传输,这就是一个普通的MPLS unicast传输。到达PE1的,实际上是带上了VPN Label的ping包。
PE1 -> CE1
PE1收到的带VPN Label的ping包。这个VPN Label是PE1通过MP-BGP发往PE2的。因此,PE1必然知道这个VPN Label应该对应自己的哪个MAC-VRF。所以,VPN Label被剥离,ping包被发往相应的MAC-VRF,通过读取MAC-VRF中的MAC转发表,发往相应的端口,也就是CE1。这样,CE2 ping到了CE1。
这就是EVPN架构中最基本的内容。总的来说,EVPN架构与BGP/MPLS L3 VPN是一样的。只是这里的转发信息是MAC转发信息,而L3 VPN中的转发信息是IP prefix转发信息。
EVPN的流行不仅在于它为L2 VPN带来的改进,更多在于EVPN提供了一个L2层网络的控制层。具体可以概括为以下几点:
☘ 可以通过控制层学习L2和L3的可达信息。传统的控制层只有L3的可达信息。
☘ 通过MAC/IP route和ARP代理,减少网络广播。
☘ 完整的多连接场景定义。
☘ 完整的BUM数据发送的优化定义。
☘ 支持MAC迁移。
☘ 支持拓扑自发现。
☘ 支持多租户。
随着发展,EVPN开始支持更多的场景,EVPN新增了Route type 5,用来传输IP prefix 路由信息;作为overlay网络,例如VXLAN,的控制层;应用在数据中心互联的场景等,虽然相应的标准还没有最终确定,但是IETF草案已经讨论改版多次。以后有机会可以再探讨这些内容。
微信ID:SDNLAB长按左侧二维码关注