EVPN(1)
基本概念
EVPN基本介绍
EVPN的全称是Ethnernet Virtual Private Network,直译为“以太网虚拟私有网络”,由2015年新增的RFC7432定义,RFC7432全称BGP MPLS-Based Ethernet VPN,直译为“基于BGP的MPLS以太网二层VPN”。
- 强悍的EVPN
- all in one VPN,不管是二层还是三层VPN,统统不在话下
- 统一控制层
- 在EVPN还没有完全标准化时,就已经有基于EVPN的技术在使用了,比如VXLAN。
EVPN的设计
- EVPN的前辈们:
- RFC4447提出基于LDP的VPWS(Virtual Private Wire Service)
- RFC4762提出基于LDP的VPLS(Virtual Private LAN Service)
- RFC4761提出基于BGP的VPLS
- EVPN(RFC7432)架构参考RPC:
- RFC4761提出基于BGP的VPLS(呀!看上文,VPLS的一种类型)
- BGP/MPLS L3 VPN(RFC4364)
我们来分析一下这个图,图上绿色RFC7432就是EVPN,只不过在这里写了全称,这个图的意思是EVPN可以做为控制层,而数据层可以使用多种技术,比如说图中列出的MPLS、VXLAN都是可以的,而VPLS的数据层就只能用MPLS,这张图展示了EVPN优秀的兼容性,EVPN我们会在后续的园区网专题、SDN专题当中还会看到的,也就是说EVPN实现一套通用的控制层面。
对于EVPN来说,控制层使用的是MP-BGP,MP-BGP是EVPN的核心,EVPN整体是构建在MP-BGP的基础上,为什么EVPN要选择MP-BGP呢?我们这里面简单来说,传统的BGP无法承载多种网络类型,所以出现了可以扩展的可以支持多协议的BGP,就是MP-BGP,这可不得了!BGP本来就是高层路由协议,拥有极强的路由控制能力,现在又让它具有了极强的兼容性,双剑合璧!如虎添翼!简直要起飞了!事实上也确实如此,MP-BGP被很多技术架构纳入其中,就比如我们现在讲的EVPN,除此之外还有MPLS-VPN,MP-BGP在里面都到了至关重要的作用。
我们知道EVPN的出现是为了解决VPLS效率低的原因,因为VPLS转控不分离,转控制不分离的后果就是站点间的运营商网络会出现大量的ARP报文,因为VPLS是二层VPN,而二层通信非常依赖ARP报文,EVPN从此处着手,在设计之初想设计一种新的技术解决这种ARP泛滥的问题。我们接着向下推理,什么情况下不会发送ARP广播呢?就是当本地的ARP缓存表里面有已经需要的ARP条目了,不需要通过ARP解析的时候,EVPN就是通过顺着这个思路向下开发的,那问题又来了,异地站点如何让对方知道自己局域网里面的主机的MAC地址呢?告诉对方站点不就完了吗? 怎么告诉?肯定是通过报文告诉它?来了,来了,重点来了,我们让问题细化一点,当前的问题时:“通过怎样的技术把本端主机的MAC地址发送给对方?”,这个要求很高了,我们来将要求细化一下:
- 能跨地域通信,这一点普通的VPN就可以,比如说GRE、MPLS这些可以
- 能运载数据,比如说MAC地址,这一点GRE办不到,VPN仅是一个封装的技术,谁能办到呢?还记得我们前面学过的MPLS-VPN吗?在MPLS-VPN当时我们要将RT和RD发送给对方是通过MP-BGP承载并发送的,那MP-BGP可不可以在这里面帮助我们运载MAC地址呢?可以,可以,非常可以!普通的BGP运载的IPV4的路由信息,在MPLS-VPN当中运载的不仅仅是路由信息还有RD和RT,那让它运送MAC地址,还不是手到擒来!实事上确实如此,确实有一种MP-BGP是可以运载MAC地址的。
好了,这个技术的关键现在已经差不多完了,你看哈,我们已经选定了使用MP-BGP将本端的MAC地址运载到对方站点,这样对方站点就不会老是有ARP广播穿越运营商了,可问题又来了,假如说我们有两个站点一个站点在北京,另一个在海南,对方站点都使用MP-BGP问题,MP-BGP拥有跨主机建立连接的能力,那MAC地址能顺利的运载过去吗?仔细想想看是不行的,因为有黑洞路由,两个站点确实可以连接,但最终的数据传输还得依靠运营商中间大量的物理路由器,你想一下,当你把一个二层数据包交给一个运营商网络当中的路由器时,它肯定会蒙圈然后将报文丢掉,因为它本身又没有运行MP-BGP,所以说,MP-BGP不能单独上路。我们完全可以借鉴MPLS-VPN的做法,中间让运营商运行MPLS就可以了,用MPLS的外层标签把我们要传输的地方包裹起来,没问题!但有一个小问题,让运营商帮你搞MPLS需要花钱呀,能没有免费的办法?
我们当前问题的关键问题就是:“MAC地址可以交给MP-BGP收集打包,但MP-BGP不能单独上路,需要有技术掩护”,我们可以请MPLS,太贵,有没有免费的保镖?有的,GRE VPN就可以呀,我们将要发送的MAC地址或二层的数据包通过GRE VPN包裹起来就可以了!!棒棒棒!就是这样,其实这样的技术有很多呀,不一定非得是GRE、MPLS、IPSEC可以吗?GRE OVER IPSEC可以吗?当然可以,不就是打掩护嘛!一般三层的VPN都具有这样的能力!
有了MPLS和MP-BGP,本端站点收集好MAC地址交给MP-BGP运载,然后MPLS在外层把MP-BGP包裹起来,那平时的二层数据帧也可以以这样的方式进行传输,那现在,你再思考一下EVPN是什么?EVPN更像是一种架构,一种思路,一种技术集,这种架构推荐使用这样的方式解决二层VPN的问题:“通过MP-BGP运载数据通信必须用的信息,通过VPN技术协助MP-BGP运载的数据顺利到达对方站点,可以任意一种VPN技术”
何止强悍
- *EVPN为何这么强悍?
- EVPN结构:
- 控制层面:MP-BGP,使其具有极其强悍的承载能力
- 数据平面:GRE、SRV6、MPLS、VXLAN任意一种都可以
PS:VPLS其中有一种部署模式也使用了MP-BGP,但是实现起来较为复杂;
- VPLS的问题
- PE邻居都是手动指定,没有自动发现,而手工指定就会有N平方问题
- 浪费带宽问题,PE泛洪广播时,仅对一个站点是有效的
- 没有好的冗余机制,也就是双归属下流量不平均的问题
- 收敛慢
- 对MPLS依赖性强
- EVPN改进了VPLS
- 不再依赖MPLS
- 比优秀的冗余设计
- 比VPLS更快速收敛
- 过控制层面专门提前把MAC地址通过MP-BGP路由的方式传对对端,这样就不用泛洪学习了
- VPLS和EVPN的对于VPN的支持
- VPLS仅支持二层VPN
- EVPN却可以支持二层,也可以支持三层
由于EVPN看中了MP-BGP的极强的扩展性和承载能力,为了能更好的利用这种优势,EVPN新设计了五种类型,这五种数据类就在MP-BGP的报文当中得以体现。当然并不是为了MP-BGP去设计了这五种数据类型,而是因为EVPN这种精妙且复杂的设计,需要一种强悍的承载协议,所以才选中了MP-BGP。这五种数据类型在MP-BGP UPDATE报文中的MP_REACH_NLRI和MP_UNREACH_NLRI,其实就是多协议可达和多协议不可达字段当中承载,这五种数据类型其实就是五种不同类型的数据,也被称为五种路由类型,如下所示:
- RFC732中的五种路由类型:
- ethernet auto-discovery route # 以太网自动发现路由
- mac/ip advertisement route # MAC或IP地址通告路由
- inclusive multicast ethernet tag route # 集成多播路由
- ethernet segment route # 以太网段路由
- ip prefix route # IP前缀路由
理解路由类型
EVPN怎么还有路由?这个路由怎么理解?其实这个路由特别简单,其实就是MP-BGP要运载的数据而已,我们知道MP-BGP在建立控制层的时候肯定会运载MAC地址,但不能老是运载MAC地址呀!真正的通信的时候就需要运载真正的二层数据帧,此外还有一些别的数据,什么数据?你看哈,就比如OSPF,虽然里面最核心的报文是LSU,但是辅助LSU的报文类似就有很多种,有负责保活的,有负责建立确认的,有负责选举的,还有hello-time、router-id一大堆打辅助的,所以现在我们知道MP-BGP里面可以运载MAC地址和二层数据帧这是它最核心的内容,此外还需要一些数据打辅助的来协助,用以实现不同的功能,那些数据就得分分类,肯定不能一股脑就传过去,这不科学,肯定要按照某种机制。从这个角度看来,设计这些技术的人可真聪明呀!
所以对所有要传递的数据分分类之后其实有很多种,只不过常用的只有四五种,我们就来谈一下这四五种:
那问题又来了,这些数据如何传输呢?当然是通过MP-BGP了,在MP-BGP里面又增加了一个关键字段“BGP NLRI”,直译为“路由可达性信息”,此字段是一个大字段,里面还有许多小字段,正是在这些小字段里面传递我们上文提到过到的“路由信息”。
这五种路由协议到底是如何结合起来进行工作的呢?以及这五种路由协议都是什么作用呢?我们从EVPN启动过程当中当中可以看出来,所以我们接下来就讲EVPN的启动过程。
EVPN启动过程
- EVPN的启动过程可以分为两个大步:
- EVPN成员自动发现及标签分配(会用type-3路由)
- ES的自动发现
- ESI号码的自动生成(站点标识符,单归情况下用不上,专为双归而设计 )
- ES成员自动发现(通过type-4)
- DF选举(也是type-4)
- ESI标签的分配(type-1)
PS:上面没有TYPE-2,是因为TYPE-2是用于站点间的MAC或IP地址的运载通告。
PS:VPLS当中就没有自动发现,都得用手工配置才行
EVPN原理
术语
- ES和ESI:ethernet segment 用户以太网站点,通过ESI标识,注意这标签是一个站点而不一个设备,在多归属的场景当中,一个CE可以接入到多个CE,CE接入多个PE的时候都使用同一个ESI,这样PE就能识别出站点就不会出现环路了,有点类似于BGP当中的PATH字段。
- ESI label,ESI的标签,即站点的标签,1类路由信息携带的扩展团体属性(考点),可以用于实现水平分割和快速收敛
- EVI:EVPN instance,EVPN 实例,正好对应一个站点
- MAC-VRF:VRF虚拟设备的MAC地址表
- RD和RT与MPLS的意思是一样的
- DF:designateed forwarder 指定转发器,在CE多归属场景下只转发一份BUM流量至CE
- BUM:广播、未知单播、组播,type-3路由信息携带;
基本工作流程概述
工作流程总结,总体分为两个大阶段:
- 第一阶段:启动阶段--对应控制层面
- 双方对等体通过3类路由信息建立BUM流量转发表
- 双方对等体通过4类路由信息完成ES和DF选举(选举仅会发生在多归属的场景下)
- 双方对等体通过1类路由信息交互ESI标签,进而实现水平分割等功能。(考点)
- 第二阶段:流量转发阶段--对应数据层面
CE侧通过流量触发PE通过2类路由信息通告MAC地址(考点),该路由携带分配的标签信息,后续根据该标签执行单播流量转发。
三张表
EVPN也有三张表,这三张表我们在理解的时候可以对标MPLS当中的表:
- MAC-VRF
- BUM流量转发表
- ES成员表
三张表里面都有标签,但作用是不同的
下面我们来解释一下这几张表都是用来做什么用的?以及怎样形成的?
- 我们先来看MAC-VRF表,这个表就是网络设备上都会有MAC地址表,只不过在这里,MP-BGP出场的时候一般都会和VRF一块,这个MAC-VRF指的是VRF设备,即虚拟设备的MAC地址表,但要注意,这里的MAC-VRF不是单纯的MAC地址表。
- BUM流量转发表,BUM是什么意思?广播、未知单播、组播集合的简称。
- ES是什么意思?Ethernet Segment以太网站点,指的就是用户站点,这个站点是一种广义成的站点,无论你通过多少上行链路连接到PE,都会把你看成一个站点,通过ESI(用户站点唯一标识符)来表示,这是很有必要的,可以用来防环。所以ES成员指的是PE用来记录自己接入了多少个用户站点。
我们先来看一下MAC-VRF是如何形成的?其实特别简单,MP-BGP的配置的时候总是要和VRF一块配置,而一旦配置VRF之后,那就自然会形成MAC-VRF,只不过这时候这表是空的,很好理解吧!
接下来我们再来看BUM表是如何形成的?那当我们配置好VRF之后,接下来干什么?不用问,肯定是RD和RT搞起来,RD和RT搞起来之后那就是PE之间的互连,PE之间的互连其实就是靠MP-BGP指对等体的方式,建立完对等体之后,MP-BGP要给VRF分配一个标签,并且把这个消息(标签和RD)通过MP-BGP对等体关系发送给所有的PE(通过三类路由),这样所有的PE就知道了,如果给这个PE发送消息就带携带这个标签,好,这里面有一个问题,问题别的PE给当前这个PE发送数据时要携带这个标签没问题,有可能一个PE会有多个VRF,本端PE收到了带标签的数据报文怎么知道给哪个VRF呢?其实在路由器本地RD和标签是绑定关系,当数据包来的时候根据标签找到RD就自然知道将数据包给哪个VRF了。每个PE都会向外发送MP-BGP给自己分配的标签,别的PE收到后会记录到一个表当中,这个表就是BUM流量转发表,这里面的标签实际就是在数据转发阶段的内层标签。
最后我们来再看一下ES成员信息表,这个表也比较简单。你看哈,很有可能CE通过多根链路接入到不同的PE当中,比如像下图这样
那问题来了,当数据报文从CE2向CE1发送时,PE1和PE2有可能都会收到一样的信息,那PE1和PE2到底谁负责将报文传递给CE1呢?如果都传递行吗?范不上呀,有一个传递就好了,所以在数据转发之前,关于到底哪个PE负责向CE1传递信息,它们之间要进行一个PK,就像在VRRP当中决定到底谁响应一样,它们想PK就得收集PK的素材,如上图所示,PE1和PE2各自会收集对方的ESI和标签(这里的标签就仅仅是防环使用,由一类路由信息分配的),这样形成的表是ES成员信息表。
再看工作流程
- 启动阶段
- PE上创建VRF绑定物理接口,形成空的MAC-VRF表
- PE指定对等体,MP-BGP针对本端VRF分配标签并通过3类路由信息传递给对端PE,形成BUM表
- PE通过EVPN实例与VRF绑定,从某个VRF进入PE的流量将要直接到达EVPN实例上
- VRF或接口配置ESI,之后,所有的PE通过4类路由信息交互ESI,进行PK DF选举
- PE通过1类路由信息分发ESI再分配标签,这个标签作用跟AS-PATH类似,就是个记号,主要用来防止环路
启动阶段完成之后除了MAC-VAF当中没有数据之外,BUM表和ES表已经都有数据了;
- 流量转发阶段
- 启动阶段完成之后,当CE设备一旦收到了本地的ARP请求,就会学习到一个MAC地址,CE会转发这个ARP请求到达PE当中的EVI(虚拟设备上),终于,终于,MAC-VRF表当中开始有数据了。
- 接着,PE将这个表项通过2类的路由信息加上BUM表当中的标签信息通给给对方的PE。
注意,2类路由信息携带的标签肯定是内层标签,在运营商传输的时候外层肯定还会打一层MPLS的外层标签。
问题
第一个问题: ESI有标签,作用之一是防环,能理解,类似于BGP里面的as-path属性;在流量转发阶段通过2类路由信息传给对方PE的时候携带标签,这个标签就是ISP MPLS包裹的内层标签,这个内层标签是否就是形成BUM时用到的标签呢?答:是。
第二个问题: 指定转发器DF的作用是什么?是什么时候选举的?又是什么时候起作用的?
当有多个CE接入到PE时,如下图所示,在这样的场景当中在形成ES成员表的时候会进行选举DF,即指定转发器。
指定转发器的作用很简单,当接收对方传递过来的数据时,只有指定转发器会转发给CE,非指定转发器按兵不动,这样做的好处不会把CE搞蒙,CE只会收到一份PE传过来的数据。
第三个问题: 当MAC-VRP当中有MAC地址表条目时,它怎么知道发送给哪些PE呢?
很简单,它只有遵照程序的指定去做,程序指示它去读取BUM列表里面所有PE的IP地址,读一条发一条,群发,不判断,因为它也不知道目标到底在哪个PE当中。
第四个问题:当MAC-VRP当中有MAC地址表条目并发送给对方PE时,对方PE时收到时会看到几个标签。
在不考虑MPLS的次末跳弹出的情况下,会看到两个,最外层是MPLS的标签,内层是BUM当中的标签。
第五个问题:接第四问题,内层标签的作用是什么?外层标签的作用又是什么?都是谁产生的?
外层标签的作用很简单,在保证没有黑洞路由的前提下从一端PE会数据运载到另一端,外层标签是由MPLS-LDP产生的。
内层标签其实是对方PE在控制层面形成BUM表的时候给的,作用是就让目标PE知道该把这个报文给哪个VRF,这个标签应该是MP-BGP产生的
第六个问题:什么情况下PE会看到三个标签呢?
接第五个问题,当本地PE无差别的把ARP报文发送出去时,与本地PE同时接入同一个CE的PE会收三个标签,除了内层标签和外层标签还有一个ESI标签,主要作用是用来防环。
第七个问题:当一个PE收到一个ARP报文里面有三层标签时,即里面有ESI标签,并发现对方是与自己接入到同一个PE时,该PE会怎么做?
第一步:它会把这个ARP报文里面的MAC地址放到MAC-VRP表里面存起来;
第二步:再生成一条,自己给它再分配一个标签,再通过BUM表发送出去
第八个问题:接第七个问题,那这样的话,那另一站点的两个PE很有会收到两个相同的ARP请求报文,它们两个会怎么做?
收到两个就两个呗,它两个也只会有一个DF,所以只会有一个转发到相应的VRF。
回包的时候就有意思了,因为PE因为收到两个不同的PE发送的ARP报文,所以报文返回的时候就会有负载分担的效果,但是没有问题,因为回去的时候也会有DF,非DF会忽略这个报文。
第九个问题:ESI 标签是如何防止环路的?
CE1双归接入PE1和PE2。当PE1收到CE1发送来的多播报文时,封装ESI之后再发给PE2;当PE2收到该多播报文后,发现携带的ESI与本地ESI相同,PE2丢弃该报文,从而避免环路。
第十个问题:是如何处理故障的?
lPE3检测到CE2链路故障,首先删除自己本地MAC表项,然后通过Type 1路由通告所有PE撤销该ES相关的所有MAC地址。
MPLS&EVPN实验
NE40E在200T版本,最好用EVE去做;
- 实验目的:CE1上的虚拟VLAN接口与CE2上的虚拟VLAN接口,用相同网段,实现二层通信。
- 实验环境:EVE NE40E
- 底层预配:三台PE的OSPF和LDP都已经配置完了
# PE1
## 创建VPN实例,使用bd模式
## 实例里面的配置相当简单,仅有RD和RT
evpn vpn-instance evpna bd-mode
route-dist 100:1
vpn-target 100:1
## 配置bridge-domain并绑定实例
bridge-domain 10
evpn binding evpna
## 配置EVPN的源地址,用环回口
vpn source-address 10.1.1.1
# PE2
evpn vpn-instance evpna bd-mode
route-dist 100:2 # 注意,RD必须不一样,否则PE1和PE2发送给PE3的RD因为是一样的,导致R3认为PE1和PE2是一台
vpn-target 100:1 # 注意,RT必须一样
bridge-domain 10
evpn binding evpna
vpn source-address 10.1.2.2
# PE3
evpn vpn-instance evpna bd-mode
route-dist 100:3
vpn-target 100:1
bridge-domain 10
evpn binding evpna
vpn source-address 10.1.3.3
接下来我们要在PE1和PE2配置双活,即et-trunk
PE1:
lacp e-trunk system-id 00eo-fc00-0000
lacp e-trunk priority 1 # 两端优先级必须一样,因为这是双活,不是主备
e-trunk 1
peer-address 10.1.2.2 source-address 10.1.1.1
interface eth-trunk 10
mode lacp-static
e-trunk 1 # 把e-trunk放到eth-trunk里面
e-trunk mode force-master # 模式是强制master
esi 0000.1111.2222.1111.1111 # 为了弥补双活导致的环路,所以要配置ESI来防环
PE2:
lacp e-trunk system-id 00eo-fc00-0000
lacp e-trunk priority 1
e-trunk 1
peer-address 10.1.1.1 source-address 10.1.2.2
interface eth-trunk 10
mode lacp-static
e-trunk 1
e-trunk mode force-master
esi 0000.1111.2222.1111.1111
# PE1配置子接口
inter eth-trunk 10.1 mode 12
encapsulation dot1q vid 2
rewrite pop single
bridge-domain 10 # 绑定子接口
undo dnc
int e1/0/0
eth-trunk 10
# PE2配置子接口
inter eth-trunk 10.1 mode 12
encapsulation dot1q vid 2
rewrite pop single
bridge-domain 10
int e1/0/0
eth-trunk 10
# CE1的配置
undo dcn
vlan 2
int vlan 2
192.168.1.1 24
int eth-trunk 10
portswitch
port link-type trunk
port trunk allow vlan 2
mode lacp-static
inter ethernet1/0/0
eth-trunk 10
inter ethernet1/0/1
eth-trunk 10
dis eth-trunk 10 # 看LACP是否工作正常
dis e-trunk 1 # 看状态是否为UP
# MAC地址重路由,两边都得敲
evpn
vlan-extend private enable
vlan-extend redirect enable
local-remote frr enable
# PE1的BGP
bgp 100
peer 10.1.3.3 as-number 100
peer 10.1.3.3 connect-interface l0
l2vpn-family evpn
peer 10.1.3.3 enable
# PE2的BGP
bgp 100
peer 10.1.3.3 as-number 100
peer 10.1.3.3 connect-interface l0
l2vpn-family evpn
peer 10.1.3.3 enable
# PE3
inter eth-trunk 10
mode lacp-static
int eth-trunk 10.1 mode l2
encapsulation dot1q vid 2
rewrite pop single
bridge-domain 10
undo dcn
int eth-trunk 1/0/2
eth-trunk 10
# CE2
undo dcn
vlan 2
int vlan 2
ip add 192.168.1.2 24
int eth-trunk 10
mode lacp-static
portswitch
port link-type trunk
port trunk allow-pass vlan 2
int ethernet 1/0/2
eth-trunk 10
# PE3的BGP
bgp 100
peer 10.1.1.1 as 100
peer 10.1.1.1 connect-interface lo0
peer 10.1.2.2 as 100
peer 10.1.2.2 connect-interface lo0
l2vpn-family evpn
peer 10.1.1.1 enable
peer 10.1.2.2 enable
peer 10.1.1.1 reflect-client
peer 10.1.2.2 reflect-client