基础知识

MPLS VPN的全称是Virtual Private Network,MPLS VPN是最广泛使用、最受欢迎的MPLS技术。

VPN

定义

VPN,Virtual Private Network,中文是虚拟专用网络 ,VPN是在公共网络上模拟建立专用网络并进行加密通讯的技术。VPN可能在OSI模型的二层或三层上进行通讯,在二层上进行通讯的VPN叫L2VPN,在三层上进行通讯的叫L3VPN。VPN通常被那些有多个分支机构的公司所使用的,因为不同分支机构之间要交互数据,必须确保数据的安全稳定可靠传输。

适用场景

例如某公司员工出差到外地,他想访问企业内网的服务器资源,这种访问就属于远程访问。

在传统的企业网络配置中,要进行远程访问,传统的方法是租用DDN(数字数据网)专线或帧中继,这样的通讯方案必然导致高昂的网络通讯和维护费用。对于移动用户(移动办公人员)与远端个人用户而言,一般会通过拨号线路(Internet)进入企业的局域网,但这样必然带来安全上的隐患。

让外地员工访问到内网资源,利用VPN的解决方法就是在内网中架设一台VPN服务器。外地员工在当地连上互联网后,通过互联网连接VPN服务器,然后通过VPN服务器进入企业内网。为了保证数据安全,VPN服务器和客户机之间的通讯数据都进行了加密处理。有了数据加密,就可以认为数据是在一条专用的数据链路上进行安全传输,就如同专门架设了一个专用网络一样,但实际上VPN使用的是互联网上的公用链路,因此VPN称为虚拟专用网络,其实质上就是利用加密技术在公网上封装出一个数据通讯隧道。有了VPN技术,用户无论是在外地出差还是在家中办公,只要能上互联网就能利用VPN访问内网资源,这就是VPN在企业中应用得如此广泛的原因。

L2VPN VS L3VPN

img

上图出自于这个网页,比较全面的概括了二层VPN和三层VPN的区别。简单来说,L2层MPLS VPN和L3层MPLS VPN的区别在于转发所基于的地址不同,L2 MPLS VPN转发基于二层PDU中的二层地址,二层PDU被封装在传输协议MPLS中;L3层MPLS VPN转发基于三层地址,三层PDU被封装在传输协议MPLS中。

二层VPN(L2 VPN) 三层VPN(L3 VPN)
定义 二层VPN虚拟化了数据链路层(二层),使得物理上不在同一地址的分支机构的网络,看起来像是直连一样,在同一个局域网中 三层VPN虚拟化了网络层(三层),这样使得路由可以通过公网的线路(比如运营商的骨干网络)来为客户网络提供路由,L3VPN的远程站点之间不像直连一样
数据转发方式 运营商依据二层信息转发客户流量 运营商依据三层信息转发客户流量
可扩展性 通常来说,二层VPN的扩展性比三层VPN的扩展性要弱 通常来说,三层VPN的扩展性比二层VPN的扩展性要强
三层连接性 客户与它的远程站点建立三层(IP)连接,与运营商没有三层连接,也就是和运营商之间没有建立任何路由层面的联系 客户与运营商的边界路由器建立起三层连接,也就是客户的路由器和运营商路由器之间是邻居关系
运营商参与程度 运营商没有参与客户网络的路由 运营商参与了客户网络的路由
路由控制 如果客户希望对路由和策略有较好的掌控,L2层VPN是首选 当客户愿意共享路由信息及控制策略不严格的情况下,可以选择L3VPN
举例 LANE, IPLS, VPLS, EOMPLS, 802.1q Tunnelling MPLS VPN, IPSEC P2P

MPLSVPN构架

img

PE设备

PE设备全称是:Provider Edge,中文是运营商边界设备,运行MPLS协议,PE和客户设备三层连接,和客户设备运行路由协议形成邻居(也可用静态路由),PE设备获取客户的VPN路由并将路由生成VPNV4前缀放入MPLS VPN Backbone传递到对端的PE设备上。PE设备和P设备通过Core内的IGP路由协议(通常是ISIS)交换Core路由。PE路由器之间通过MP-BGP协议形成MP-IBGP邻居交换VPN路由。PE设备和CE端相连的部分为VRF工作的区域,和P设备相连的部分为全局路由表工作区域,所以PE路由器包含两种路由表,全局路由表和VRF路由表。全局路由表包含通过CoreIGP学到的Core内的路由以及Internet路由(通过IPV4 BGP学习到的);VRF路由表包含与所创建的VRF关联的虚拟路由表。

P设备

P设备全称是Provider,中文是运营商设备,P设备不和客户设备直接相连。P设备往往并不知道VPN客户网络以及客户的路由,它只负责在Backbone内运载表数据,参与数据平面的转发。

CE设备

CE设备全称是Customer Edge,中文是客户边界设备,CE设备和PE设备直接相连,主要功能是将客户的路由通告给PE设备,以及从PE设备学习同一个VPN下其他站点的路由。CE路由器只是一台普通的IP路由器,支持eBGP\OSPF\EIGRP\静态路由等标准路由协议。

VRF

MPLS VPN一个厉害的地方就是可以让不同客户的路由以及数据穿越运营商的MPLS VPN Backbone,而且这些路由和数据又是相互隔离和独立的,即使不同的客户拥有相同的IPV4地址空间也没关系。

那么作为客户路由进入MPLS Backbone的入口设备,PE就显得非常重要了。在PE上有个非常重要的概念——VRF。

VRF全称为Virtual Routing and Forwarding,翻译成虚拟路由及转发,它是一种VPN路由和转发实例。一台PE路由器,可能同时连接了多个VPN用户,这些用户(的路由)彼此之间需要相互隔离,那么这时候就用到了VRF。PE路由器上每一个VPN都有一个VRF。PE路由器除了维护全局IP路由表以外,还为每个VRF维护一张独立的IP路由表,这张路由表称为VRF路由表。必须注意,前面说到的全局IP路由表和每个VRF的路由表都是相互独立或相互隔离的。

因为每个VPN都有一张独立的VRF路由表,所以PE路由器上每一个VPN也会有一张独立的CEF表来转发这些报文,这就是VRF CEF表。

一旦在PE路由器上创建了一个VRF,我们就可以将特定的接口(物理或逻辑的)放入这个VRF,那么这个接口就不在属于全局IP路由表或其他任何VRF,只为该VRF服务。

比如下图左边,有三个VRF,分别是VRF蓝、黄、绿,这三个VRF的路由相互隔离,各自有各自的路由表(VRF蓝路由表、VRF绿路由表、VRF黄路由表),下图右边的路由器中有三个VRF(红黄蓝),可以理解为这三个VRF相当于有三个不同的路由器。

img

这个概念如何理解呢?如果对DC和Marvel宇宙有了解的话,不同的VRF和路由表的概念,和漫画中的平行宇宙有点类似,漫画中有多个平行的宇宙世界,每个世界中可能有蝙蝠侠、超人这些英雄,但每个宇宙中的这些超级英雄之间是相互不知道对方,彼此之间也不产生联系的,比如地球1中的英雄只在地球1中出现,他们的所作所为不会影响到地球23中的其他英雄。

RD值

由于VPN前缀是通过MP-BGP在MPLS VPN网络中扩散,那么在同一时间可能运营商的MPLS VPN网络中承载着多个客户的VPN前缀,甚至可能时使用相同空间的IPV4地址,比如192.168.1.0这个私网网段地址,很多公司可能都在用,如果同一时间使用这个私网地址的两个公司同时传输数据到运营商,运营商如何分辨哪个路由是哪个公司的呢?这就需要RD值了。RD值在VRF中进行配置。

RD英文全称为Route Distinguish,长度为64bit,用于在MP-BGP运载VRF前缀时确保这些前缀的唯一性,在控制层面区分路由,但RD并不会说明该前缀属于哪一个VRF(这个功能需要搭配RT值使用),RD的功能并不是VPN标识符,因为在一些复杂的VPN环境中可能一个VPN存在多个RD。RD最重要的两个功能:

  • 与32bit长的ipv4前缀一起构成96bit的VPNV4前缀;
  • 如果不同的VPN客户,存在相同的IPV4空间地址,那么可以通过设置不同的RD值,保证前缀的唯一性;

这个64bit的值,可以有两种表现形式:AS : NN或IP address : NN,其中NN代表编号,最常用的格式是AS:NN。其中AS代表AS号。通常AS是IANA分配给运营商的AS号,NN是运营商分配给VRF的唯一号码,比如假设AS号是300,编号为11,那么RD值可以写作‘300:11’,这个RD+IPV4构成的VPNV4前缀就是‘300:11,192.168.1.0’,和其他的VPNV4前缀,比如‘200:21,192.168.1.0’在传输中就是不同的前缀了。

img

img

产生的VPNV4前缀通过MP-BGP在路由器之间被传递:

img

RD值用来标识那些位于不同VRF的路由前缀的唯一性,那么如何共享使用这些路由呢?用RT值。

RT

RT全称为Route Targets。用来区分VPN Customer及控制VPN路由宣告,指导VPN前缀应该导入(导出)到哪个VRF中,它是BGP community的扩展属性,在VRF中进行配置,RT跟随VPN V4前缀的后面一起呗传递,一条路由可以附加多个RT值。格式和上面的RD类似,为XXX :YYY,比如234:2。RT分为两种,一种是Export RT,另一种是Import RT。

img

Export RTs

export RT -> attached to the routes when exported from the VRF (VPN identifier)

Export RT值的作用简单来说就是,从VRF中导出VPN路由时,用Export RT值对VPN路由进行标记。

在VRF中定义Export RT值,使得输出的VPNV4路由携带上该RT值一起传递——用BGP扩展community的方式。这些VPNV4路由,是由VPN客户端的IPV4路由导入VRF后,加上VRF中配置的RD值所形成的。

img

Import RT

import RT -> Used to select which routes to be imported into the VRF from the routes received via MP-BGP (Import route filter)

Import RT值的作用简单来说就是,当往VRF表中导入VPN路由时,只有那些所携带的RT值与VRF表中任意一个Import RT制相符的路由才会被注入VRF表中。

PE会从其他MP-BGP对等体的PE那收到VPNV4的前缀,这些前缀都是携带RT值的,默认情况下,PE是不会将这些VPNV4路由以IPV4的形式装载到VRF路由表中的,除非在本地的VRF中,配置import RTs。如果Import RTs与收到的VPNV4前缀中的RT匹配的话,这些VPNV4前缀才会被以IPV4的形式装载到相应的VRF路由表中,相当于在这里RT起到一个前缀过滤或识别的作用,这个功能在许多场景中非常有用。

VPNV4路由可能携带不止一个RT值,只要有一个匹配Import RT即可导入到VRF路由表中。

img

img

如何使用RT值

img

比如上图中,R1的RT Export值是65002:1,R2的RT import值有65002:1,那么这两个设备之间就可以相互注入VRF路由。

img

img

VRF配置

配置命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Router(config)# ip vrf name 
创建VRF,比如‘ip vrf Blue’就是创建名称为‘Blue’的VRF,VRF名字本地有效,大小写敏感,VRF在创建后必须设定RD值,否则不可用


Router(config-vrf)# rd route-distinguisher
进入VRF模式后,分配rd值给该VRF,可使用ASN:XX或A.B.C.D:XX格式输入rd,建议采用ASN:XX的形式,PE路由器上每个VRF的RD必须是唯一的,比如配置‘Router(config-vrf)# rd 1:2’


Router(config-vrf)# route-target export RT
设置当路由被从VRF导出到MP-BGP时携带的RT值,可以输入多条RT,也就是说一跳VPNV4路由运行时携带多个RT值,RT值实际上是通过BGP的扩展community属性来携带的,比如配置‘Router(config-vrf)# route-target export 1:2’


Router(config-vrf)# route-target import RT
通过设置Import RT从而将匹配的路由放入VRF,注意,只有被匹配的路由才会被导入VRF中,可以输入多个RT,比如配置‘Router(config-vrf)# route-target import 100:1’


Router(config)# interface e 0/0
Router(config-if)# ip vrf forwarding vrf-name
Router(config-if)# ip address 10.1.12.2 255.255.255.0
将接口分配到特定的VRF中,一旦配置了‘ip vrf forwarding XX’命令后,该接口的IP地址将被清除,需要重新手工分配IP地址

show 命令

1
2
3
4
5
6
7
Show ip vrf  
Show ip vrf detail
Show ip vrf detail interface
Show ip vrf interface
show ip protocol vrf
show ip route vrf
show ip cef vrf x

PE设备逻辑

img

PE设备是MPLS VPN部署中非常关键的一个环节。上面这张图就是一个典型的PE路由器的逻辑分解图,蓝色的框表示的是一台PE路由器,内部两个虚线框可以理解为PE使用VRF为VPN所创造的两个‘虚拟路由器’,这个PE设备创建了两个VRF,VRF-A对应的是客户A,VRF-B对应的是客户B。

一旦创建了两个VRF,我们就可以将特定的接口放入特定的VRF,那么这些接口将只为所属的VRF服务。上图中的PE路由器实际上有了三张路由表,两张VRF路由表和一张全局IP路由表。

一个PE路由器可以连接不同的VPN客户,使用类似于虚拟路由器(VRF实例)的概念,来进行逻辑上的区分,比如上图中的Virtual route for A和Virtual route for B。这些客户甚至可能使用相同的地址空间,比如客户A和B都是用192.168.0.0作为内网的IP地址,在一台PE上使用VRF路由表,将不同客户的路由进行逻辑上的隔离。这里Virtual路由表是相对我们全局IP路由的概念,从Global接口上学习到的路由,放入全局路由表,从VRF接口上学习到的路由,放入相对应的VRF路由表。不同的Virtual路由表完全隔离。

img

上面这个PE中,创建了VRF ABC,那么同时一并出现的还有VRF ABC的路由表以及VRF ABC的CEF表,将PE上和CE直连的接口放入VRF ABC,然后分析PE:

  • PE上,会运行一个Core的IGP骨干协议,这里使用的是OSPF100,这个OSPF进程是为全局IP路由表贡献路由的,属于全局路由表。OSPF100与运营商骨干网内的其他设备形成OSPF邻居关系并且交互骨干网Core内的路由,交互这些路由的目的是,可以为后面的MP-BGP的建立而服务,因为MP-BGP往往是通过PE质检的loopback接口来建立的,MP-BGP邻居关系建立需要这些IGP路由,另外后续的LDP也依赖这个Core的IGP协议。后续的LDP也依赖于这个Core的IGP协议。通过OSPF进程100学习到的路由,放入该PE路由器的全局路由表。

  • PE创建了VRF,名字是ABC,就相当于出现了一台虚拟路由器叫ABC,虚拟路由器ABC有专属于ABC的VRF路由表和CEF,与之前的全局路由表相互隔离互不冲突。创建VRF的时候需要同时定义RD值、RT import和RT export值。RD值用于和IPV4前缀组装形成VPNV4路由以便通过MP-BGP传播。RT值用于识别VRF或者说识别客户。

  • PE上运行一个CE-PE之间的路由协议,这个路由协议可以使静态、RIP、EIGRP或BGP这些都没问题,目的是为了从VPN客户(也就是CE设备)那学到客户的路由。注意由于连接CE的接口被放入了VRF ABC中,因此通过这个接口学习到的路由,也会被放入VRF ABC的路由表。放入VRF ABC的路由表之后呢?要将路由引入到MP-BGP(MP-BGP的address-family ipv4 vrf ABC)中,如果PE-CE之间运行路由协议是BGP以外的协议,那么久需要做路由重发布,将客户的路由重新发布到address-family ipv4 vrf ABC这个地址簇下面,而如果PE-CE之间运行的已经是BGP了,那么路由当然就直接进入MP-BGP了。

  • PE上运行一个MP-BGP后,MP-BGP至少有两个address-family地址簇,一个是address-family vpnv4,另一个是address-familty ipv4 vrf ABC。address-family vpnv4用来和对端的PE交换VPNV4前缀;address-family ipv4 vrf ABC是和VRF ABC关联的,用于获取VPN客户(在上图中是Customer A)的路由。

  • 现在MP-BGP已经有了VPN客户的路由,现在要将这些IPV4的路由前缀,变成VPNV4的路由前缀,通过已经建立起来的VPNV4邻接关系传递给队员PE设备。由于这些路由是属于VRF ABC的,而VRF是定义了RD和RT值的,那么这些值在这里就派上用场了。VPNV4前缀(96bit)=RT(64bit)+ipv4前缀(32bit),然后RT Export 跟随这个VPNV4前缀,被MP-BGP更新给了对端PE。

MPLS VPN控制层面

总提传播过程

img

img

  • 左侧PE和CE之间,通过运行IGP或BGP路由协议的方式,将客户的IPV4路由宣告给PE路由器;

  • VRF可以在PE路由器上隔离用户路由,PE路由器通过PE-CE的路由协议(可以使IGP也可以是eBGP)从VRF接口学到客户的路由后,路由被放入VRF路由表。客户的IPV4路由注入到PE的VRF路由表中,为VRF配置RD和Import RT、Export RT值;

  • IPV4路由重新发布到MP-BGP中(如果CE-PE之间用的BGP协议就不需要重发布),64bit长的RD被添加到32bit长的ipv4路由上,构成96bit长的VPNV4地址,使得前缀在不运行BGP没有VRF的Core区域具有唯一性;RT值被添加到MPBGP的community扩展属性上;

  • 两个PE路由器之间形成MP-IBGP邻居关系,并相互宣告带有MPLS标签(也就是VPN标签,由MPBGP分配给前缀),以及VPNV4路由前缀以及RT值,RT值是放在MPBGP的community属性中通过update报文传输的;

  • 路由传递到位于右侧对端的PE后,Import RT值代表着路由会注入哪个VRF。RD从VPNV4头部移除,变成普通的IPV4路由;

  • 右侧PE路由器上,根据RT值决定将IPV4路由注入相应的VRF路由表;

  • 右侧PE通过和CE之间运行IGP或BGP路由协议的方式,将相应VRF路由表中的IPV4路由传递给CE路由器;

具体传播过程

img

PE的动态路由协议有多种选择,如Static、RIP、EIGRP、OSPF、ISIS、BGP等等。PE-CE之间运行路由协议的目的是为了让PE学习到客户的VPN路由。由于PE上连接特定CE的接口是属于特定VRF的,因此从这个接口上学习到的客户路由都会进入该VRF的路由表。

img

PE之间运行的是MP-BGP,也就是多协议的BGP,经过扩展的BGP协议能够承载VPNV4路由。经过前面的步骤,PE的VRF路由表中已经学习到了客户的路由,接下去要让MP-BGP知道这些路由。如果PE-CE之间运行的是非BGP协议,那么当然,需要将VRF路由表中的客户路由重发布到BGP中,如果PE-CE之间运行的协议已经是BGP了,自然不用再做重发布了。

客户的IPV4路由被注入MP-BGP后,RD被添加到了这些IPV4路由前缀前面,构成了VPNV4路由前缀,同时RTs也被附加到VPNV4路由前缀。

img

由于两端PE之间已经建立起了MP-BGP连接,因此PE将VPNV4路由前缀(连同这个前缀关联的MPLS标签,RTs等属性)一并通告给另一端的PE路由器。

img

对端的PE叶霈智了VRF,VRF中定义了import RTs,它根据RTs将受到的VPNV4导入特定的VRF,RD被从VPNV4路由中移除,所以路由变成了ipv4路由。

img

IPV4路由被注入到了VRF路由表中,当然这些路由现在是BGP的路由条目。

img

同样的,PE-CE之间的路由协议帮助我们将PE上的IPV4路由最终更新给CE。

MPLS VPN的数据层面

img

img

外层标签

位于运营商两侧的公司的分站点A和B不可能使用IP数据包进行传输,因为P路由器并没有PE上才有的VRF信息,这个问题由MPLS的标签解决解决,MPLS如何分配标签呢?一般来说MPLS VPN情况下都由LDP协议进行分配(MPLS TE情况下由RSVP分配),所有运营商的P和PE路由器都运行LDP协议,使得所有的ip流量都能够使用标签传输。这时IP数据包使用标签在Ingress PE和Egress PE之间传输,当数据经过P路由器时无需根据目标地址进行查找而是进行MPLS标签转发。这个标签叫做IGP标签(也叫做外层标签,命名相对应后面的内层VPN标签而言),因为这层标签是和Backbone中全局路由表里的IPV4前缀绑定的,由于MPLS不能给BGP分配标签,所以这个标签实际上是给BGP的下一跳分配的标签,由运营商中的IGP协议宣告。外层IGP标签的作用是帮助数据包穿越MPLS域。

下图中,当R6(172.16.6.6)上ping R1(10.1.1.1)时,数据包到了R5以后,R5会给数据压上外层标签,但我们知道,MPLS不会为BGP分配标签,而是会给BGP的下一跳分配标签,而PE之间(在图中就是R2和R5之间)一般使用Loopback接口建立IBGP邻居,R2将BGP路由条目发送给R5,所以10.1.1.0/24路由在R5路由表上的下一跳是R2,也就是2.2.2.2,因此这个外层标签是R4给R5分配的去往2.2.2.2/32的MPLS标签。

img

内层标签

那么,PE如何知道数据属于哪个VRF呢?这部分信息并没在IP报头中体现,在IGP标签(外层标签)中也没有体现,因为IGP标签(外层标签)只能用来在运营商内部转发。而上面提到的RT是控制层面的概念,转发层面用不到,VPNV4路由是没法在数据层面上去做路由转发的,因为数据包的目的IP地址只能是IPV4或IPV6地址,PE收到一个例如192.168.1.0网段的内网地址就不知道该如何传递了,它可能有多个客户都是用这个内网地址,而且数据包中并没有RT值或VPNV4地址等相关信息来告诉路由器这个数据属于哪个VRF(RT这些控制层面的信息是之前通过BGP的Update传递到对端PE的)。从全局角度来说,路由器也只会有IPV4或IPV6的路由表,而没有VPNV4路由表,RD值、VPNV4路由仅仅是在控制层面区分路由,数据层面的数据包转发只能靠IPV4、IPV6路由表,FIB和MPLS。

解决办法是再加一层标签,也就是内层标签,又叫VPN标签,由Ingress PE通过MP-BGP分配,这层标签的作用是来告诉Egress PE路由器数据包的下一跳为哪个CE,知道下一跳为哪个CE自然知道了数据属于哪个VRF。

下图中内层VPN标签是由R2为R1上10.1.1.0/24路由分配的MPLS标签。

img

数据传输理论

img

img

数据从左侧的CE传输到Ingress PE上,因为从CE发来的数据包是IP包,PE和CE相连的接口属于特定的VRF,所以在PE上会查询VRF的CEF表,最终IP包会被压上两层标签,外层MPLS标签(IGP标签)和内层的VPN标签。内层VPN标签是为了告诉Egress PE数据包最后要发送到哪个CE客户上,从而知道数据在PE上注入哪个VRF,比如说客户A的数据就使用100的内层标签,客户B的数据使用200的内层标签,PE看到内层标签就知道该发送到哪个CE自然也就知道是哪个VRF的数据了。内层标签是由出站的Egress PE通过MPBGP分配的。但沿途的P路由器并没有和Egress形成MPBGP邻居,看不懂VPN标签,无法将数据传给Egress PE,所以使用外层IGP标签使得数据顺利传递过Core 区域,外层标签由LDP分配。在Ingress PE上,外层标签是由数据转发的下一跳(也就是PE的邻居——P路由器)分配的,标签属于出站路由器Egress PE的Loopback接口,在上图中在R2是Ingress PE,R5为Egress PE的情况下,也就是R3为5.5.5.5分配的标签,因为5.5.5.5是下一跳(在配置了Next-hop-self的情况下)。当数据从R2传到R3后,外层标签在R3上被替换,替换成R4分配给5.5.5.5的标签,到R4上由于5.5.5.5是R5直连的网段,所以R5为该网段分配的标签为POP,次末跳弹出机制,因此在R4上会把外层标签弹出,然后发送给R5。作为Egress PE的R5会根据内层VPN标签将数据交给对应的VRF及CE,至此数据传输结束。

实验说明

img

配置

拓扑及环境

这是一个典型的 MPLS VPN 基础实验环境,R2、R3、R4 为运营商的设备,其中 R2 为 PE1,R4 为 PE2。 R1 及 R5 分别是 CE1 及 CE2,代表同一个 VPN 客户的两个站点。

IP 编址如图所示,设备互联地址采用 10.1.xy.0/24,其中 xy 为设备编号,x 小 y 大。另外所有的设备均配置 Loopback0,地址采用 x.x.x.x/32,x 为设备编号。

CE1 与 PE1 之间运行的 PE-CE 路由协议是 EIGRP,EIGRP 进程号是 1; CE2 与 PE2 之间运行的 PE-CE 路由协议是 OSPF,使用的 OSPF 进程号是 1。

MPLS VPN Backbone 内运行的全局 IGP 是 OSPF,使用进程号 100。

PE1 与 PE2 之间维护 MP-iBGP 邻接关系,交互 VPNv4 路由,BGP 的 AS 号是 234。

R2、R3、R4 之间维护 LDP 邻接关系,交互 IGP 标签。

需求及步骤

\1. 完成基本 IP 配置

\2. Core 内运行 OSPF(进程号 100) ,激活 LD

\3. 在 PE 上创建 VRF,将 PE-CE 间的接口放入 VRF;在 PE 和 CE 之间运行 IGP 协议

\4. PE 配置 MP-BGP,建立 MP-iBGP 邻接关系

\5. 完成 PE-CE 之间路由的重发布

配置及实现

基本IP配置见最后的配置汇总

Core 内部运行OSPF进程,进程号为1,并激活LDP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
R2:
router ospf 1 #//Core内部的IGP用OSPF协议交互Core内路由
router-id 2.2.2.2
network 2.2.2.2 0.0.0.0 area 0
network 10.1.23.2 0.0.0.0 area 0
!
ip cef #//开启CEF是MPLS协议的前提
mpls ldp router-id Loopback0 #//设置LDP Router ID
mpls label range 200 299 #//设置标签范围方便观察
interface Ethernet0/2
mpls ip #//在接口激活MPLS



R3:
router ospf 1
router-id 3.3.3.3
network 0.0.0.0 255.255.255.255 area 0
!
ip cef #//开启CEF是MPLS协议的前提
mpls ldp router-id Loopback0 #//设置LDP Router ID
mpls label range 300 399 #//设置标签范围方便观察
interface Ethernet0/0
mpls ip #//在接口激活MPLS
interface Ethernet0/1
mpls ip #//在接口激活MPLS



R4:
router ospf 1
router-id 4.4.4.4
network 4.4.4.4 0.0.0.0 area 0
network 10.1.34.4 0.0.0.0 area 0
!
ip cef #//开启CEF是MPLS协议的前提
mpls ldp router-id Loopback0 #//设置LDP Router ID
mpls label range 400 499 #//设置标签范围方便观察
interface Ethernet0/0
mpls ip #//在接口激活MPLS

配置后,R2\R3\R4之间可以建立起LDP邻居:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
R3#show mpls ldp neighbor
Peer LDP Ident: 4.4.4.4:0; Local LDP Ident 3.3.3.3:0
TCP connection: 4.4.4.4.20749 - 3.3.3.3.646
State: Oper; Msgs sent/rcvd: 136/137; Downstream
Up time: 01:52:42
LDP discovery sources:
Ethernet0/1, Src IP addr: 10.1.34.4
Addresses bound to peer LDP Ident:
10.1.34.4 4.4.4.4
Peer LDP Ident: 2.2.2.2:0; Local LDP Ident 3.3.3.3:0
TCP connection: 2.2.2.2.646 - 3.3.3.3.48066
State: Oper; Msgs sent/rcvd: 124/126; Downstream
Up time: 01:41:22
LDP discovery sources:
Ethernet0/0, Src IP addr: 10.1.23.2
Addresses bound to peer LDP Ident:
10.1.23.2 2.2.2.2

在PE上创建VRF,将PE-CE之间的接口放入VRF;在PE和CE之间运行IGP协议:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
两台PE配置如下:
R2:
ip vrf CISCO #//配置名为CISCO的VRF
rd 1:1
route-target export 234:2 #//配置RT Export
route-target import 234:4 #//配置RT Import,将对端PE路由导入正确的VRF
!
interface Ethernet0/0
ip vrf forwarding CISCO #//将接口放入VRF CISCO中
ip address 10.1.12.2 255.255.255.0 #//放入VRF中接口需要重新配置地址
!
router eigrp 1 #//PE-CE之间的IGP协议,用于从CE学习客户路由
!
address-family ipv4 vrf CISCO autonomous-system 1 #//要在VRF中宣告路由并指定AS否则无法建立邻居
redistribute bgp 234 metric 10000 100 255 1 1500
network 10.0.0.0
exit-address-family



R4:
ip vrf CISCO #//配置名为CISCO的VRF
rd 1:1
route-target export 234:4 #//配置RT Export
route-target import 234:2 #//配置RT Import,将对端PE路由导入正确的VRF
!
interface Ethernet0/1
ip vrf forwarding CISCO #//将接口放入VRF CISCO中
ip address 10.1.45.4 255.255.255.0 #//放入VRF中接口需要重新配置地址
!
router ospf 234 vrf CISCO #//PE-CE之间的IGP协议,用于从CE学习客户路由
router-id 44.44.44.44
network 10.1.45.4 0.0.0.0 area 0


两台CE配置如下:
R1:
router eigrp 1
network 1.0.0.0
network 10.0.0.0


R5:
router ospf 1
router-id 5.5.5.5
network 5.5.5.5 0.0.0.0 area 0
network 10.1.45.5 0.0.0.0 area 0




PE-CE之间的邻居和路由结果如下:
R2#show ip eigrp vrf CISCO neighbors
EIGRP-IPv4 Neighbors for AS(1) VRF(CISCO)
H Address Interface Hold Uptime SRTT RTO Q Seq
(sec) (ms) Cnt Num
0 10.1.12.1 Et0/0 11 04:04:47 9 100 0 3

R2#show ip route vrf CISCO
Routing Table: CISCO
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
a - application route
+ - replicated route, % - next hop override, p - overrides from PfR

Gateway of last resort is not set

1.0.0.0/24 is subnetted, 1 subnets
D 1.1.1.0 [90/409600] via 10.1.12.1, 03:30:39, Ethernet0/0





R4#show ip route vrf CISCO

Routing Table: CISCO
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
a - application route
+ - replicated route, % - next hop override, p - overrides from PfR

Gateway of last resort is not set

5.0.0.0/32 is subnetted, 1 subnets
O 5.5.5.5 [110/11] via 10.1.45.5, 03:51:11, Ethernet0/1

两台PE都学到了CE上的路由,1.1.1.1和5.5.5.5。

PE之间配置MP-BGP,R2-R4之间建立MP-IBGP邻居关系:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
R2:
router bgp 234
bgp router-id 2.2.2.2
no bgp default ipv4-unicast #//开启MP-BGP
neighbor 4.4.4.4 remote-as 234
neighbor 4.4.4.4 update-source Loopback0
!
address-family vpnv4
neighbor 4.4.4.4 activate #//在VPNV4地址簇中激活R4的VPNV4连接
neighbor 4.4.4.4 send-community extended


R4:
router bgp 234
bgp router-id 4.4.4.4
no bgp default ipv4-unicast
neighbor 2.2.2.2 remote-as 234
neighbor 2.2.2.2 update-source Loopback0
!
address-family vpnv4
neighbor 2.2.2.2 activate
neighbor 2.2.2.2 send-community extended

配置VPNV4邻居时,先在进程中配置neighbor,然后再去VPNV4地址簇中激活,注意这里PE1-PE2之间的邻接关系是建立在Loopback接口上的。

验证PE之间的MP-BGP邻居:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
R2#show ip bgp vpnv4 all summary
BGP router identifier 2.2.2.2, local AS number 234
BGP table version is 8, main routing table version 8
5 network entries using 780 bytes of memory
5 path entries using 420 bytes of memory
4/4 BGP path/bestpath attribute entries using 672 bytes of memory
3 BGP extended community entries using 540 bytes of memory
0 BGP route-map cache entries using 0 bytes of memory
0 BGP filter-list cache entries using 0 bytes of memory
BGP using 2412 total bytes of memory
BGP activity 5/0 prefixes, 5/0 paths, scan interval 60 secs

Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
4.4.4.4 4 234 280 279 8 0 0 04:10:20 2


R2#show ip bgp vpnv4 all neighbors 4.4.4.4 | in VPNv4
Address family VPNv4 Unicast: advertised and received
For address family: VPNv4 Unicast

PE-CE之间路由重发布

PE——CE之间已经知道了彼此的路由,现在要将客户路由发布到BGP中形成VPNV4路由的前缀来通过MP-IBGP传递给对端PE,为了让CE之间知道对方的路由,还要在PE上将BGP路由重新发布进PE-CE之间的IGP,但必须注意,由于运营商的BGP路由条目众多,可能有一两百万路由,普通客户的CE路由器是无法承载如此大批量的路由,所以重发布时一定要谨慎,下面配置中由于路由少,所以直接将IGP和BGP之间重发布,真实网络中要做很多限制配置,确保只有必须的路由进入CE路由器,否则会直接让CE宕机。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
R2:
router eigrp 1
!
address-family ipv4 vrf CISCO
redistribute bgp 234 metric 10000 100 255 1 1500
!
router bgp 234
address-family ipv4 vrf CISCO
redistribute eigrp 1


R4:
router ospf 234 vrf CISCO
redistribute bgp 234 subnets
!
router bgp 234
address-family ipv4 vrf CISCO
redistribute ospf 234 match internal external 1 external 2

注意,重发布时在IPV4地址簇下进行的,因为要对客户的路由进行区分隔离,在VRF CISCO中的路由和全局路由以及其他VRF中路由相互隔离。配置完毕后,查看两台客户端中的路由:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
R1#show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
a - application route
+ - replicated route, % - next hop override, p - overrides from PfR

Gateway of last resort is not set

1.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C 1.1.1.0/24 is directly connected, Loopback0
L 1.1.1.1/32 is directly connected, Loopback0
5.0.0.0/32 is subnetted, 1 subnets
D EX 5.5.5.5 [170/307200] via 10.1.12.2, 03:06:12, Ethernet0/0
10.0.0.0/8 is variably subnetted, 5 subnets, 2 masks



R5# show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
a - application route
+ - replicated route, % - next hop override, p - overrides from PfR

Gateway of last resort is not set

1.0.0.0/24 is subnetted, 1 subnets
O E2 1.1.1.0 [110/1] via 10.1.45.4, 03:17:37, Ethernet0/0
5.0.0.0/8 is variably subnetted, 2 subnets, 2 masks

这里查看的是全局路由表,因为CE上没有VRF,只有全局路由。可以看到CE之间已经学到了对方的路由,现在进行测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
R1#ping 5.5.5.5 source 1.1.1.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 5.5.5.5, timeout is 2 seconds:
Packet sent with a source address of 1.1.1.1
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/2 ms


R1#tr 5.5.5.5 source 1.1.1.1
Type escape sequence to abort.
Tracing the route to 5.5.5.5
VRF info: (vrf in name/id, vrf out name/id)
1 10.1.12.2 1 msec 2 msec 3 msec
2 10.1.23.3 [MPLS: Labels 301/403 Exp 0] 8 msec 2 msec 2 msec
3 10.1.45.4 [MPLS: Label 403 Exp 0] 1 msec 1 msec 1 msec
4 10.1.45.5 2 msec 3 msec *

配置汇总:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
R1:

version 15.7
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname R1
!
boot-start-marker
boot-end-marker
!
!
!
no aaa new-model
!
!
!
clock timezone EET 2 0
mmi polling-interval 60
no mmi auto-configure
no mmi pvc
mmi snmp-timeout 180
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!


!
!
!
!
ip cef
no ipv6 cef
!
multilink bundle-name authenticated
!
!
!
!
!
!
!
!
!
!
redundancy
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
interface Loopback0
ip address 1.1.1.1 255.255.255.0
!
interface Loopback10
ip address 10.1.1.1 255.255.255.0
!
interface Ethernet0/0
ip address 10.1.12.1 255.255.255.0
duplex auto
!
interface Ethernet0/1
no ip address
shutdown
duplex auto
!
interface Ethernet0/2
no ip address
shutdown
duplex auto
!
interface Ethernet0/3
no ip address
shutdown
duplex auto
!
!
router eigrp 1
network 1.0.0.0
network 10.0.0.0
!
ip forward-protocol nd
!
!
no ip http server
no ip http secure-server
!
ipv6 ioam timestamp
!
!
!
control-plane
!
!
!
!
!
!
!
!
line con 0
exec-timeout 0 0
logging synchronous
line aux 0
line vty 0 4
login
transport input none
!
!
end



R2:

version 15.7
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname R2
!
boot-start-marker
boot-end-marker
!
!
!
no aaa new-model
!
!
!
clock timezone EET 2 0
mmi polling-interval 60
no mmi auto-configure
no mmi pvc
mmi snmp-timeout 180
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!


!
ip vrf CISCO
rd 1:1
route-target export 234:2
route-target import 234:4
!
!
!
!
ip cef
no ipv6 cef
!
multilink bundle-name authenticated
mpls label range 200 299
!
!
!
!
!
!
!
!
!
!
redundancy
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
interface Loopback0
ip address 2.2.2.2 255.255.255.255
!
interface Loopback9
no ip address
!
interface Ethernet0/0
ip vrf forwarding CISCO
ip address 10.1.12.2 255.255.255.0
--More--
*Mar 12 08:38:33.923: %SYS-5-CONFIG_I: Configured from console by console
duplex auto
!
interface Ethernet0/1
no ip address
shutdown
duplex auto
!
interface Ethernet0/2
ip address 10.1.23.2 255.255.255.0
duplex auto
mpls ip
!
interface Ethernet0/3
no ip address
shutdown
duplex auto
!
!
router eigrp 1
!
address-family ipv4 vrf CISCO
redistribute bgp 234 metric 10000 100 255 1 1500
network 10.0.0.0
autonomous-system 1
exit-address-family
!
router ospf 1
router-id 2.2.2.2
network 2.2.2.2 0.0.0.0 area 0
network 10.1.23.2 0.0.0.0 area 0
!
router bgp 234
bgp router-id 2.2.2.2
bgp log-neighbor-changes
no bgp default ipv4-unicast
neighbor 4.4.4.4 remote-as 234
neighbor 4.4.4.4 update-source Loopback0
!
address-family vpnv4
neighbor 4.4.4.4 activate
neighbor 4.4.4.4 send-community extended
exit-address-family
!
address-family ipv4 vrf CISCO
redistribute eigrp 1
exit-address-family
!
ip forward-protocol nd
!
!
no ip http server
no ip http secure-server
!
ipv6 ioam timestamp
!
!
mpls ldp router-id Loopback0
!
control-plane
!
!
!
!
!
!
!
!
line con 0
exec-timeout 0 0
logging synchronous
line aux 0
line vty 0 4
login
transport input none
!
!
end



R3:

version 15.7
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname R3
!
boot-start-marker
boot-end-marker
!
!
!
no aaa new-model
!
!
!
clock timezone EET 2 0
mmi polling-interval 60
no mmi auto-configure
no mmi pvc
mmi snmp-timeout 180
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!


!
!
!
!
ip cef
no ipv6 cef
!
multilink bundle-name authenticated
mpls label range 300 399
!
!
!
!
!
!
!
!
!
!
redundancy
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
interface Loopback0
ip address 3.3.3.3 255.255.255.255
!
interface Ethernet0/0
ip address 10.1.23.3 255.255.255.0
duplex auto
mpls ip
!
interface Ethernet0/1
ip address 10.1.34.3 255.255.255.0
duplex auto
mpls ip
!
interface Ethernet0/2
no ip address
shutdown
duplex auto
!
interface Ethernet0/3
no ip address
shutdown
duplex auto
!
router ospf 1
router-id 3.3.3.3
network 0.0.0.0 255.255.255.255 area 0
!
ip forward-protocol nd
!
!
no ip http server
no ip http secure-server
!
ipv6 ioam timestamp
!
!
mpls ldp router-id Loopback0
!
control-plane
!
!
!
!
!
!
!
!
line con 0
exec-timeout 0 0
logging synchronous
line aux 0
line vty 0 4
login
transport input none
!
!
end


R4:

version 15.7
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname R4
!
boot-start-marker
boot-end-marker
!
!
!
no aaa new-model
!
!
!
clock timezone EET 2 0
mmi polling-interval 60
no mmi auto-configure
no mmi pvc
mmi snmp-timeout 180
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!


!
ip vrf CISCO
rd 1:1
route-target export 234:4
route-target import 234:2
!
!
!
!
ip cef
no ipv6 cef
!
multilink bundle-name authenticated
mpls label range 400 499
!
!
!
!
!
!
!
!
!
!
redundancy
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
interface Loopback0
ip address 4.4.4.4 255.255.255.255
!
interface Ethernet0/0
ip address 10.1.34.4 255.255.255.0
duplex auto
mpls ip
!
interface Ethernet0/1
ip vrf forwarding CISCO
ip address 10.1.45.4 255.255.255.0
duplex auto
!
interface Ethernet0/2
no ip address
shutdown
duplex auto
!
interface Ethernet0/3
no ip address
shutdown
duplex auto
!
router ospf 234 vrf CISCO
router-id 44.44.44.44
redistribute bgp 234 subnets
network 10.1.45.4 0.0.0.0 area 0
!
router ospf 1
router-id 4.4.4.4
network 4.4.4.4 0.0.0.0 area 0
network 10.1.34.4 0.0.0.0 area 0
!
router bgp 234
bgp router-id 4.4.4.4
bgp log-neighbor-changes
no bgp default ipv4-unicast
neighbor 2.2.2.2 remote-as 234
neighbor 2.2.2.2 update-source Loopback0
!
address-family vpnv4
neighbor 2.2.2.2 activate
neighbor 2.2.2.2 send-community extended
exit-address-family
!
address-family ipv4 vrf CISCO
redistribute ospf 234 match internal external 1 external 2
exit-address-family
!
ip forward-protocol nd
!
!
no ip http server
no ip http secure-server
!
ipv6 ioam timestamp
!
!
mpls ldp router-id Loopback0
!
control-plane
!
!
!
!
!
!
!
!
line con 0
exec-timeout 0 0
logging synchronous
line aux 0
line vty 0 4
login
transport input none
!
!
end



R5:

version 15.7
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname R5
!
boot-start-marker
boot-end-marker
!
!
!
no aaa new-model
!
!
!
clock timezone EET 2 0
mmi polling-interval 60
no mmi auto-configure
no mmi pvc
mmi snmp-timeout 180
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!


!
!
!
!
ip cef
no ipv6 cef
!
multilink bundle-name authenticated
!
!
!
!
!
!
!
!
!
!
redundancy
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
interface Loopback0
ip address 5.5.5.5 255.255.255.0
!
interface Ethernet0/0
ip address 10.1.45.5 255.255.255.0
duplex auto
!
interface Ethernet0/1
no ip address
duplex auto
!
interface Ethernet0/2
no ip address
duplex auto
!
interface Ethernet0/3
no ip address
shutdown
duplex auto
!
router ospf 1
router-id 5.5.5.5
network 5.5.5.5 0.0.0.0 area 0
network 10.1.45.5 0.0.0.0 area 0
!
ip forward-protocol nd
!
!
no ip http server
no ip http secure-server
!
ipv6 ioam timestamp
!
!
!
control-plane
!
!
!
!
!
!
!
!
line con 0
exec-timeout 0 0
logging synchronous
line aux 0
line vty 0 4
login
transport input none
!
!
end

数据层面说明

数据层面上,从1.1.1.1访问5.5.5.5是如何传输报文的呢?

img

从Traceroute结果可以看出上面的转发过程,首先R1发出的是IPV4报文,源是1.1.1.1,目的是5.5.5.5:

img

数据包到达了R2后,由于是IP数据包,而且是从VRF接口收到的,所以R2查看自己的VRF CISCO的CEF表:

1
2
3
R2#show ip cef vrf CISCO 5.5.5.5
5.5.5.5/32
nexthop 10.1.23.3 Ethernet0/2 label 301-(local:201) 403

从CEF表中可以看出,去往5.5.5.5的数据需要压入两层标签,分别是外层IGP标签301和内层VPN标签403,然后交给10.1.23.3,于是R2将IPV4数据包压入标签栈,然后将标签包交给R3:

img

R3收到该数据后发现是个带标签的数据包,于是查看自己的LFIB表:

1
2
3
4
5
R3#show mpls forwarding-table
Local Outgoing Prefix Bytes Label Outgoing Next Hop
Label Label or Tunnel Id Switched interface
300 Pop Label 2.2.2.2/32 47030 Et0/0 10.1.23.2
301 Pop Label 4.4.4.4/32 46161 Et0/1 10.1.34.4

LFIB中显示,收到一个顶层标签为301的标签包后,需要将该数据的顶层标签POP弹出,然后交给下一跳10.1.34.4。于是R3将收到的数据中的顶层标签301弹出,然后交给10.1.34.4。注意这里其实是个PHP机制。

img

那么R4收到了带标签的数据包后,也会查看LFIB表:

1
2
3
4
5
6
7
8
R4#show mpls forwarding-table
Local Outgoing Prefix Bytes Label Outgoing Next Hop
Label Label or Tunnel Id Switched interface
400 300 2.2.2.2/32 0 Et0/0 10.1.34.3
401 Pop Label 3.3.3.3/32 0 Et0/0 10.1.34.3
402 Pop Label 10.1.23.0/24 0 Et0/0 10.1.34.3
403 No Label 5.5.5.5/32[V] 5462 Et0/1 10.1.45.5
404 No Label 10.1.45.0/24[V] 0 aggregate/CISCO

R4发现顶层标签为403的数据包,对应的Outgoing Label是No label,于是它将整个标签栈都弹出(实际上只剩下一层标签了),然后它将原始数据,也就是IPV4数据直接丢给10.1.45.5.数据包到了R5,也就是对端的CE。

img

控制层面说明

img

内层标签

R4在通过MP-IBGP将VPNV4前缀,1:1:5.5.5.5/32,宣告给R2的时候,会为这个前缀捆绑一个VPN标签403:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
R4#show mpls forwarding-table
Local Outgoing Prefix Bytes Label Outgoing Next Hop
Label Label or Tunnel Id Switched interface
400 300 2.2.2.2/32 0 Et0/0 10.1.34.3
401 Pop Label 3.3.3.3/32 0 Et0/0 10.1.34.3
402 Pop Label 10.1.23.0/24 0 Et0/0 10.1.34.3
403 No Label 5.5.5.5/32[V] 1254 Et0/1 10.1.45.5
404 No Label 10.1.45.0/24[V] 0 aggregate/CISCO




R4#show ip bgp vpnv4 rd 1:1 labels
Network Next Hop In label/Out label
Route Distinguisher: 1:1 (CISCO)
1.1.1.1/32 2.2.2.2 nolabel/203
5.5.5.5/32 10.1.45.5 403/nolabel
10.1.12.0/24 2.2.2.2 nolabel/204
10.1.45.0/24 0.0.0.0 404/nolabel(CISCO)

LFIB中倒数第二行‘403 No Label 5.5.5.5/32[V] 1254 Et0/1 10.1.45.5’表示给5.5.5.5/32前缀捆绑的VPN标签是403,[V]表示这是一个VPN标签,这层标签用于帮助R4这个PE2识别所收到的标签数据归属于哪一个VRF,哪一个下一跳CE。那么当R2向5.5.5.5发送数据时,报文进入MPLS Backbone前要压入VPN标签403,这个标签是R2这个PE2通过MP-BGP分配的。

外层标签

只有MP-BGP分配的外层VPN标签是不能够让数据在MPLS Backbone中传输的,因为运营商的P路由器(R3)是不可能知道客户路由的,往往也并不知道VPNV4前缀,那么为了让这些VPN流量能够在P网络中传输,势必要增加一层标签,这就是外层的IGP标签,它由LDP捆绑并分发。当PE1(R2)要将已经压了一层VPN标签的报文放进MPLS Backbone时,外层压入的是什么标签呢?因为MPLS不会给BGP分配标签而只能给BGP的下一跳分配标签,R2去往5.5.5.5的下一跳是4.4.4.4:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
R2#show ip route vrf CISCO

Routing Table: CISCO
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
a - application route
+ - replicated route, % - next hop override

Gateway of last resort is not set

1.0.0.0/32 is subnetted, 1 subnets
D 1.1.1.1 [90/409600] via 10.1.12.1, 03:55:39, Ethernet0/0
5.0.0.0/32 is subnetted, 1 subnets
B 5.5.5.5 [200/11] via 4.4.4.4, 00:08:05

所以PE1这里使用的是P路由器(R3)分配给4.4.4.4的标签:

1
2
3
4
5
R3#show mpls forwarding-table
Local Outgoing Prefix Bytes Label Outgoing Next Hop
Label Label or Tunnel Id Switched interface
300 Pop Label 2.2.2.2/32 9364 Et0/0 10.1.23.2
301 Pop Label 4.4.4.4/32 8552 Et0/1 10.1.34.4

所以这里捆绑的是R3给4.4.4.4分配的标签301。

img

MP-BGP

MP-BGP全称是‘Multiprotocol Extensions for BGP’。BGP的多协议扩展为BGP定义了两个新的属性:多协议可达NLRI以及多协议不可达NLRI,两个属性分别用来通告路由和退回路由。两个属性都维护着两个字段:地址簇标识符AFI(Address Family Indicator)、后续地址簇标识符SAFI(Subsequent Address Family Indicator)。这两个字段用来描述BGP所承载的是什么类型的路由。

img

img

img

img

MP-BGP的Update中包含:

  • VPNV4前缀

  • 扩展Community值:RTs、SOO….

  • Label used for VPN packets forwarding

  • 其他常规BGP路径属性:MED、LP、AS_PATH、Origin、Standerd community

查看VPNV4路由命令是‘show ip bgp vpnv4 all’

查看VPNV4路由分发标签命令为‘show ip bgp vpnv4 rd x:y labels’

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
R4#show ip bgp vpnv4 all
BGP table version is 9, local router ID is 4.4.4.4
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
Route Distinguisher: 1:1 (default for vrf CISCO)
*>i 1.1.1.1/32 2.2.2.2 409600 100 0 ?
*> 5.5.5.5/32 10.1.45.5 11 32768 ?
*>i 10.1.12.0/24 2.2.2.2 0 100 0 ?
*> 10.1.45.0/24 0.0.0.0 0 32768 ?



R4#show ip bgp vpnv4 rd 1:1 labels
Network Next Hop In label/Out label
Route Distinguisher: 1:1 (CISCO)
1.1.1.1/32 2.2.2.2 nolabel/203
5.5.5.5/32 10.1.45.5 403/nolabel
10.1.12.0/24 2.2.2.2 nolabel/204
10.1.45.0/24 0.0.0.0 404/nolabel(CISCO)

BGP运载标签

MPLS在MPLS VPN网络中通告VPNV4路由,但这对于正确转发VPN流量来说并不够,一个IP数据包在MPLS网络中传输,首先在出站PE上被压上一层LDP标签,那么标签包到了目的PE,也就是入站PE,PE怎么知道把它转给哪个CE?那么我们再压上一层标签,这层标签叫VPN标签,由路由的出站PE端分发,并传递给数据的出站PE,那么路由的出站PE会在本地做个标签与VPNV4路由前缀的映射,如此一来当该路由器收到一个数据包,携带了特定的VPN标签,它就会知道将该数据包扔给谁。MPBGP的BGP Update中可能包含如下内容:

img

MPLS VPN 标签传播的影响:

  • VPN标签需由BGP nexthop路由器分配;

  • 路由的nexthop属性在MP-IBGP中传递时,不能被修改例如使用nexthopself命令;

  • PE路由器必须是BGP next-hop;

  • 当next-hop 发生变化时,标签会重新分配。这个现象在Inter-AS MPLS VPN的时候很常见;

基本配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Router(config)#router bgp XXX
Router(config-router)#address-family vpnv4
激活BGP的VPNV地址簇,并进入相关的地址簇配置


Router(config-router-af)# neighbor A.B.C.D activate
在VPNV4地址簇中,激活特定的MP-BGP邻居


Router(config-router-af)# neighbor A.B.C.D route-reflector-client
如果存在VPNV4的路由反射环境,那么RR的配置需要在VPNV4的地址簇中进行配置


Router(config-router-af)# neighbor A.B.C.D next-hop-self
与IPV4地址簇中的next-hop-self相同,只不过这条命令是针对VPNV4路由的next-hop的修改,谨慎使用,因为next-hop地址变了VPN标签是要重新分发的。该命令主要在域间VPN中使用


Router(config-router)# address-family vrf XXX
进入已经创建的VRF的BGP ipv4 vrf address-family中
每当创建一个VRF时,都讲在BGP配置下自动创建属于该VRF的address-family地址簇


mpls label mode vrf x protocol bgp-vpnv4 pre-prefix
默认是基于每个前缀分配标签的,也就是一个VPNV4前缀分配一个标签

mpls label mode all-vrf x protocol bgp-vpnv4 per-vrf
可以修改成基于VRF的标签分配,也就是一个VRF分配一个标签,不建议修改


show ip bgp all summary
查看所有邻居簇的邻居


show ip bgp vpnv4 all
查看所有的vpnv4路由


show ip bgp vpnv4 all label
查看vpnv4路由的标签


clear ip bgp vpnv4 unicast
清理bgp vpnv4单播路由


show ip bgp vpnv4 all [vrf x]
查看vpnv4路由

PE-CE路由协议

静态路由

img

PE1(R2)的配置如下:

1
2
3
4
5
6
7
R2(config)#ip vrf ABC
R2(config-vrf)#rd 1:1
R2(config-vrf)#route-target 234:2
R2(config)#ip route vrf ABC 1.1.1.1 255.255.255.255 10.1.12.1 e0/0
R2(config)#router bgp 234
R2(config-router)#address-family ipv4 vrf ABC
R2(config-router-af)#redistribute static

‘ip route vrf ABC 1.1.1.1 255.255.255.255 10.1.12.1 e0/0’在R2上位VRF ABC路由表创建一条指向CE客户端的VPN路由,在配置静态路由时,由于VRF跟接口有关联,因此建议采取关联出接口及下一跳IP的方式来配置这条VRF静态路由。

在BGP的ipv4 vrf ABC中将静态VPN路由重发布进BGP,以便形成VPNV4的前缀更新给VPN对端站点。

RIPV2

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CE1:
router rip
version 2
network 1.0.0.0
network 10.0.0.0
no auto-summary



PE1:
router rip
version 2
!
address-family ipv4 vrf ABC
network 10.0.0.0
no auto-summary
version 2
redistribute bgp 234 metric [transparent]
exit-address-family
!
router bgp 2345
address-family ipv4 vrf ABC
redistribute rip
exit-address-family

将BGP路由重发布进RIP以便让CE1能学习到对端Site的客户路由,当其他动态路由协议重发布进RIP的时候,默认度量值是无限大的,需要在重发布的时候指定metric,也就是RIP的跳数,如果使用Transparent关键字,则这些RIP路由将继承BGP的MED值。

OSPF

概述

img

如果PE-CE链路中使用OSPF协议,则需要在PE路由器上将OSPF重发布进MPBGP,并且将MPBGP重发布进OSPF。在远端PE如果它接收本地PE传过去的VPNV4路由,然后重发布进本地VPN的OSPF域后,变成外部路由就导致路由的优先级变低,另一个问题是MPLS VPNBackbone将用户的OSPF网络从设计上‘切断’了。针对这些问题,MPLS VPN有非常人性化的设计。

MPLS VPN在对OSPF网络的承载上有非常独特的设计。从宏观层面上来说,对于OSPF而言,MPLS VPN Backbone相当于一个OSPF超级骨干区域。实际上,来自CE的OSPF内部路由,也就是LSA1、2、3,在被重发布进MPIBGP,变成VPNV4路由再被远端PE重发布进OSPF后,其实是以3类LSA的形式注入到本地OSPF域的(也存在很多其他复杂情况,这里仅说一般情况),这么说来,这些PE在这种情况下,又有那么点ABR的问题,但其实它们的身份是ASBR。

OSPF的VRF配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
R2:
ip vrf ABC
rd 1:1
route-target export 234:2
route-target import 234:4
!
!
interface Ethernet0/0
ip vrf forwarding ABC
ip address 10.1.12.2 255.255.255.0
!
interface Ethernet0/2
ip address 10.1.23.2 255.255.255.0
mpls ip
!
router ospf 12 vrf ABC
network 10.1.12.2 0.0.0.0 area 0
!
mpls ldp router-id Loopback0
mpls label range 200 299
!
router ospf 1
router-id 2.2.2.2
network 2.2.2.2 0.0.0.0 area 0
network 10.1.23.2 0.0.0.0 area 0
!
router bgp 234
bgp router-id 2.2.2.2
bgp log-neighbor-changes
no bgp default ipv4-unicast
neighbor 4.4.4.4 remote-as 234
neighbor 4.4.4.4 update-source Loopback0
!
address-family vpnv4
neighbor 4.4.4.4 activate
neighbor 4.4.4.4 send-community extended
exit-address-family
!
address-family ipv4 vrf ABC
redistribute ospf 12 match internal external 1 external 2

将OSPF VRF ABC注入到BGP中从而形成VPNV4路由

VRF ABC中的router ospf 12进程用于和CE客户建立邻居关系,OSPF 1进程用于和MPLS Backbone内交互路由以便简历邻接关系为LDP服务。

BGP community

想让OSPF路由的特征能够穿越MPLS VPN骨干网络,需要额外定义一些BPG扩展community,这些community使得OSPF路由可以在远端PE上重建,从而保持OSPF网络设计的一致性,可以通过MP-BGP传递的OSPF特性包括:

  • 路由类型

  • 区域号

  • OSPF路由器ID

  • 域ID

  • OSPF外部路由的度量值类型1或2

img

上图中,Domain ID是一个域ID,默认情况下等于OSPF的进程号,Domain ID告诉远端PE路由器,通告的是否为一跳域外的OSPF路由。如果OSPF路由类型为LSA1、2、3,且本地PE及远端PE的OSPF VRF进程号相同,则路由重发布到远端PE的OSPF域后是以LSA3的形式注入。

如果PE路由器所收到的路由的Domain ID与本地OSPF VRF进程的Domain ID不一致的话(说白了就是两个PE上OSPF VRF进程的进程号不一致),这条路由将会以一跳OSPF外部路由,也就是LSA5类的形式通告,以提供对网络中不同OSPF进程之间重发布IP路由的支持。

如果Domain ID能够匹配OSPF进程ID,该路由将以LSA3的形式通告。

如果两端PE的OSPF进程号相同,传递过来的路由又是内部路由,但又希望路由重发布到本地OSPF以后,以外部路由的形式注入,那么可以在P路由器上修改Domain ID,命令如下:

1
2
router ospf 1 vrf ABC
domain-id ?

修改以后可以使用‘show ip ospf 1’来查看。

OSPF Route-type 后面路由类型的含义:

1:0或2:0 表示是LSA1类路由
3:0 表示是内部LSA3类路由
5:0或5:1 表示是外部LSA5类路由。前者为类型1后者为类型2
7:0或7:1 表示是NSSA7类路由,前者为类型1后者为类型2

OSPF网络设计

可能遇到的所有情况如下:

img

Case1

img

当PE1和PE2的VRF OSPF都采用相同的进程ID时:

PE1、PE2在VRF上跑OSPF,与各自的PE建立邻接关系,PE1、PE2上VRF OSPF进程号相同,CE1上的1.1.1.0属于Area0,1.1.2.0属于Area1,CE2上的网段5.5.5.0为重发布,那么CE1上学到的5.5.5.0路由为OE,CE2上学到的1.1.1.0路由为OIA,学到的1.1.2.0路由为OIA,在PE2上修改OSPF进程号(与PE1的进程号)不同,或修改Domain ID,则上述路由均变成OE类型。下面来看实验验证:

img

配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
PE1:
version 15.7
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname PE1
!
boot-start-marker
boot-end-marker
!
!
!
no aaa new-model
!
!
!
clock timezone EET 2 0
mmi polling-interval 60
no mmi auto-configure
no mmi pvc
mmi snmp-timeout 180
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!


!
ip vrf CISCO
rd 1:1
route-target export 123:1
route-target import 123:2
!
!
!
!
ip cef
no ipv6 cef
!
multilink bundle-name authenticated
mpls label range 100 199
!
!
!
!
!
!
!
!
!
!
redundancy
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
interface Loopback0
ip address 1.1.1.1 255.255.255.255
!
interface Ethernet0/0
ip vrf forwarding CISCO
ip address 192.168.14.1 255.255.255.0
duplex auto
!
interface Ethernet0/1
ip address 192.168.13.1 255.255.255.0
duplex auto
mpls ip
!
interface Ethernet0/2
no ip address
shutdown
duplex auto
!
interface Ethernet0/3
no ip address
shutdown
duplex auto
!
router ospf 1 vrf CISCO
router-id 11.11.11.11
redistribute bgp 123 subnets
network 192.168.14.1 0.0.0.0 area 0
!
router ospf 123
router-id 1.1.1.1
network 1.1.1.1 0.0.0.0 area 0
network 192.168.13.1 0.0.0.0 area 0
!
router bgp 123
bgp router-id 1.1.1.1
bgp log-neighbor-changes
no bgp default ipv4-unicast
neighbor 2.2.2.2 remote-as 123
neighbor 2.2.2.2 update-source Loopback0
!
address-family vpnv4
neighbor 2.2.2.2 activate
neighbor 2.2.2.2 send-community extended
exit-address-family
!
address-family ipv4 vrf CISCO
redistribute ospf 1 match internal external 1 external 2
exit-address-family
!
ip forward-protocol nd
!
!
no ip http server
no ip http secure-server
!
ipv6 ioam timestamp
!
!
mpls ldp router-id Loopback0
!
control-plane
!
!
!
!
!
!
!
!
line con 0
exec-timeout 0 0
logging synchronous
line aux 0
line vty 0 4
login
transport input none
!
!
end



PE2:
version 15.7
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname PE2
!
boot-start-marker
boot-end-marker
!
!
!
no aaa new-model
!
!
!
clock timezone EET 2 0
mmi polling-interval 60
no mmi auto-configure
no mmi pvc
mmi snmp-timeout 180
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!


!
ip vrf CISCO
rd 1:1
route-target export 123:2
route-target import 123:1
!
!
!
!
ip cef
no ipv6 cef
!
multilink bundle-name authenticated
mpls label range 200 299
!
!
!
!
!
!
!
!
!
!
redundancy
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
interface Loopback0
ip address 2.2.2.2 255.255.255.255
!
interface Ethernet0/0
ip vrf forwarding CISCO
ip address 192.168.25.2 255.255.255.0
duplex auto
!
interface Ethernet0/1
ip address 192.168.23.2 255.255.255.0
duplex auto
mpls ip
!
interface Ethernet0/2
no ip address
shutdown
duplex auto
!
interface Ethernet0/3
no ip address
shutdown
duplex auto
!
router ospf 1 vrf CISCO
router-id 22.22.22.22
redistribute bgp 123 subnets
network 192.168.25.2 0.0.0.0 area 0
!
router ospf 123
router-id 2.2.2.2
network 2.2.2.2 0.0.0.0 area 0
network 192.168.23.2 0.0.0.0 area 0
!
router bgp 123
bgp router-id 2.2.2.2
bgp log-neighbor-changes
no bgp default ipv4-unicast
neighbor 1.1.1.1 remote-as 123
neighbor 1.1.1.1 update-source Loopback0
!
address-family vpnv4
neighbor 1.1.1.1 activate
neighbor 1.1.1.1 send-community extended
exit-address-family
!
address-family ipv4 vrf CISCO
redistribute ospf 1 match internal external 1 external 2
exit-address-family
!
ip forward-protocol nd
!
!
no ip http server
no ip http secure-server
!
ipv6 ioam timestamp
!
!
mpls ldp router-id Loopback0
!
control-plane
!
!
!
!
!
!
!
!
line con 0
exec-timeout 0 0
logging synchronous
line aux 0
line vty 0 4
login
transport input none
!
!
end



CE1:
version 15.7
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname CE1
!
boot-start-marker
boot-end-marker
!
!
!
no aaa new-model
!
!
!
clock timezone EET 2 0
mmi polling-interval 60
no mmi auto-configure
no mmi pvc
mmi snmp-timeout 180
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!


!
!
!
!
ip cef
no ipv6 cef
!
multilink bundle-name authenticated
!
!
!
!
!
!
!
!
!
!
redundancy
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
interface Loopback0
ip address 1.1.1.1 255.255.255.255
!
interface Loopback2
ip address 1.1.2.5 255.255.255.0
!
interface Ethernet0/0
ip address 192.168.14.4 255.255.255.0
duplex auto
!
interface Ethernet0/1
no ip address
shutdown
duplex auto
!
interface Ethernet0/2
no ip address
shutdown
duplex auto
!
interface Ethernet0/3
no ip address
shutdown
duplex auto
!
router ospf 1
network 1.1.1.0 0.0.0.255 area 0
network 1.1.2.0 0.0.0.255 area 1
network 192.168.14.4 0.0.0.0 area 0
!
ip forward-protocol nd
!
!
no ip http server
no ip http secure-server
!
ipv6 ioam timestamp
!
!
!
control-plane
!
!
!
!
!
!
!
!
line con 0
exec-timeout 0 0
logging synchronous
line aux 0
line vty 0 4
login
transport input none
!
!
end



CE2:
version 15.7
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname CE2
!
boot-start-marker
boot-end-marker
!
!
!
no aaa new-model
!
!
!
clock timezone EET 2 0
mmi polling-interval 60
no mmi auto-configure
no mmi pvc
mmi snmp-timeout 180
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!


!
!
!
!
ip cef
no ipv6 cef
!
multilink bundle-name authenticated
!
!
!
!
!
!
!
!
!
!
redundancy
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
interface Loopback0
ip address 5.5.5.5 255.255.255.255
!
interface Ethernet0/0
ip address 192.168.25.5 255.255.255.0
duplex auto
!
interface Ethernet0/1
no ip address
shutdown
duplex auto
!
interface Ethernet0/2
no ip address
shutdown
duplex auto
!
interface Ethernet0/3
no ip address
shutdown
duplex auto
!
router ospf 1
router-id 5.5.5.5
redistribute connected subnets
network 192.168.25.5 0.0.0.0 area 0
!
ip forward-protocol nd
!
!
no ip http server
no ip http secure-server
!
ipv6 ioam timestamp
!
!
!
control-plane
!
!
!
!
!
!
!
!
line con 0
exec-timeout 0 0
logging synchronous
line aux 0
line vty 0 4
login
transport input none
!
!
end



P:
version 15.7
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname P
!
boot-start-marker
boot-end-marker
!
!
!
no aaa new-model
!
!
!
clock timezone EET 2 0
mmi polling-interval 60
no mmi auto-configure
no mmi pvc
mmi snmp-timeout 180
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!


!
!
!
!
ip cef
no ipv6 cef
!
multilink bundle-name authenticated
mpls label range 300 399
!
!
!
!
!
!
!
!
!
!
redundancy
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
interface Loopback0
ip address 3.3.3.3 255.255.255.255
!
interface Ethernet0/0
ip address 192.168.13.3 255.255.255.0
duplex auto
mpls ip
!
interface Ethernet0/1
ip address 192.168.23.3 255.255.255.0
duplex auto
mpls ip
!
interface Ethernet0/2
no ip address
shutdown
duplex auto
!
interface Ethernet0/3
no ip address
shutdown
duplex auto
!
router ospf 123
router-id 3.3.3.3
network 0.0.0.0 255.255.255.255 area 0
!
ip forward-protocol nd
!
!
no ip http server
no ip http secure-server
!
ipv6 ioam timestamp
!
!
mpls ldp router-id Loopback0
!
control-plane
!
!
!
!
!
!
!
!
line con 0
exec-timeout 0 0
logging synchronous
line aux 0
line vty 0 4
login
transport input none
!
!
end

接下来看CE1和CE2上的路由表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
CE1#show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
a - application route
+ - replicated route, % - next hop override, p - overrides from PfR

Gateway of last resort is not set

1.0.0.0/8 is variably subnetted, 3 subnets, 2 masks
C 1.1.1.1/32 is directly connected, Loopback0
C 1.1.2.0/24 is directly connected, Loopback2
L 1.1.2.5/32 is directly connected, Loopback2
5.0.0.0/32 is subnetted, 1 subnets
O E2 5.5.5.5 [110/20] via 192.168.14.1, 00:08:55, Ethernet0/0
192.168.14.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.14.0/24 is directly connected, Ethernet0/0
L 192.168.14.4/32 is directly connected, Ethernet0/0
O IA 192.168.25.0/24 [110/11] via 192.168.14.1, 00:08:55, Ethernet0/0



CE2#show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
a - application route
+ - replicated route, % - next hop override, p - overrides from PfR

Gateway of last resort is not set

1.0.0.0/32 is subnetted, 2 subnets
O IA 1.1.1.1 [110/21] via 192.168.25.2, 00:08:53, Ethernet0/0
O IA 1.1.2.5 [110/21] via 192.168.25.2, 00:08:53, Ethernet0/0
5.0.0.0/32 is subnetted, 1 subnets
C 5.5.5.5 is directly connected, Loopback0
O IA 192.168.14.0/24 [110/11] via 192.168.25.2, 00:08:53, Ethernet0/0
192.168.25.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.25.0/24 is directly connected, Ethernet0/0
L 192.168.25.5/32 is directly connected, Ethernet0/0

CE1上的5.5.5.5路由为OE,CE2上1.1.1.1和1.1.2.5路由为OIA。如果在PE2上修改OSPF进程号,将进程号改为与PE1不同,或修改Domain ID,则CE2上的路由类型会变为OE:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
PE2(config)#router ospf 1 vrf CISCO
PE2(config-router)#domain-id 6.6.6.6



CE2#show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
a - application route
+ - replicated route, % - next hop override, p - overrides from PfR

Gateway of last resort is not set

1.0.0.0/32 is subnetted, 2 subnets
O E2 1.1.1.1 [110/11] via 192.168.25.2, 00:00:26, Ethernet0/0
O E2 1.1.2.5 [110/11] via 192.168.25.2, 00:00:26, Ethernet0/0

Case2

img

PE1、PE2在VRF上跑OSPF,与各自的CE建立邻接关系,且两个PE上的VRF OSPF进程号相同时,CE1上1.1.1.0属于Area1,PE1与CE1在Area1建立邻接关系,CE2上的5.5.5.0路由为重发布,CE1上学到的5.5.5.0路由为OE,CE2上学到的1.1.1.0路由为OIA。

Case3

img

PE1、PE2在VRF上跑OSPF,与各自的CE建立邻接关系,PE1、PE2上VRF OSPF进程号相同时,CE1上1.1.1.0属于Area1 , 1.1.2.0为重发布,PE1与CE1在Area1建立邻接关系,CE2上5.5.5.0属于Area0,CE2上学习到的1.1.1.0路由为OIA,1.1.2.0位OE路由。CE2的Area0里无法学习到1.1.1.0与1.1.2.0路由,因为CE2没有将这些三类LSA转进Area0。PE2上能收到CE2发送的5.5.5.0的LSA3,但不会装在进路由表,自然CE1无法学习到5.5.5.0。

结论

  • MPLS VPN在OSPF站点之间存在一个超级骨干区域(Superbackbone),这当然不是一个OSPF区域,不过它扮演了一个骨干区域(Area0)的角色,同时PE也扮演了一个ABR的角色(通过查看PE产生的1类LSA也能证明这一点)

  • 从客户的角度,可以将Superbackbone看做一个Cost=0的Area0

  • 如果一个VRF的多个站点有一台PE在Area0中,那么这个Area0倍分割成了多块,通常来说,被分割的骨干区域需要使用Virtual-link来连接,但在MPLS VPN中由于有IBGP来运载OSPF路由,因此不需要虚链路,OSPF路由会在PE路由器上重建(Superbackbone不会直接泛红LSA)

  • PE路由器扮演了ABR的角色。它将Type3 LSA通告给CE路由器,CE路由器可以在Area0中,也可以在其他区域中,但如果一个站点拥有多个区域,PE路由器就必须在Area0中,因为它们是ABR,如果它们不在Area0中,就需要在PE上创建Virtual-link来确保PE和Area0的连接

  • 一个CE从Area0中发送的路由,在另一端CE的Area0中显示为区域间路由

Metric传递

1、PE1和PE2的VRF OSPF进程号相同的情况下,OSPF内部路由的Metric传递:

img

在PE路由器上将OSPF内部和外部路由重发布进BGP的时候,PE路由器将使用OSPFmetric来设置BGP MED,例如上图中,CE1穿了一条OSPF路由过来(实际上是LSA),该LSA的cost为1,那么R2通过VRF的OSPF进程学习到之后,再类加上本地的cost值(为1)以后,最终在VRF路由表中的Cost=2.现在R2(PE1)将VRF路由表中OSPF的路由注入BGP后,路由的COST将会拷贝到BGP路由的MED上,然后传递出去。

在对端PE2上,要将BGP路由注入回OSPF,那么产生的OSPF路由为3类LSA,metric也是从BGP的MED中拷贝。如果这里过来的BGP路由没有携带MED值,那么OSPF将使用默认的种子Metric。

2、PE1及PE2的VRF OSPF进程号相同的情况下,OSPF外部路由的Metric传递:

R1始发的OSPF路由1.1.1.1/32是一条OE2的外部路由,那么这条路由在PE1学习到以后,在它的VRF路由表中的Metric还是11。现在PE1将OSPF路由重发布到BGP,11这个Cost值将会被拷贝到VPNV4前缀1:1:1.1.1.1/32的MED属性中。路由被传递到了PE2,那么PE2将BGP路由重发布进OSPF形成了OE2的外部路由1.1.1.1/32,这条路由的Metric仍然拷贝BGP的MED。

3、PE1及PE2的VRF OSPF进程号不同的情况下,OSPF内部路由的Metric传递:

img

注意,这里PE1和PE的VRF OSPF进程ID不同,那么CE1上始发的OSPF内部路由,携带COST=1,到了PE1被注入到BGP后,MED属性拷贝COST值2,然后传递给PE2,到了PE2,BGP重发布到OSPF后,由于Domain ID不匹配因此形成外部路由1.1.1.1/32,这个路由的Metric同样拷贝BGP路由的MED属性值。

4、非OSPF始发路由的Metric传递:

img

CE1——PE1之间运行的是RIPV2协议,那么这条路由传递到PE1上以后,跳数为1,重发布进BGP后,VPNV4前缀携带的MED属性值为1,这是直接拷贝的RIP路由的Metric。那么VPNV4前缀传递到PE2后,重发布进OSPF,形成OE2的外部路由1.1.1.1/32,同样的,也是拷贝了BGP路由的MED属性值,所以Cost=1。

Down Bit

概述

An additional bit – down bit has been introduced in the Options field of the OSPF LSA header

PE routers set the down bit when redistributing routes from MP-BGP into OSPF

PE routers never redistribute OSPF routes with the down bit set into MP-BGP

Down bit位于OSPF LSA头部的Option字段内,当PE路由器将MP-BGP路由重发布进OSPF协议时,会将Down Bit置1。当OSPF路由的Down Bit置1时,PE路由器绝对不会将该OSPF路由重发布进MP-BGP中。

具体理论

img

上图中,右侧VPN站点有两个PE:PE2、PE3。

当PE2通过已经建立好的MP-IBGP连接从PE1学习到CE1客户路由,它将路由重发布到本地的OSPF进程中,这样CE2就能学习到这些客户路由。但是由于还有PE3的存在,如果PE3上部署了OSPF-BGP的双向重发布,CE2有可能会将路由更新给PE3,由于OSPF的AD比是110,比IBGP的200要小,那么从CE2处学到的路由就会比从PE1上学到的路由优先级高,能进入路由表。比如CE1上如果有一条路由1.1.1.0/24,这条路由传递给PE2以后,PE2传递给CE2,然后CE2上这条AD为110的OSPF的1.1.1.0/24的路由,就会比从PE1发过来的AD值为200的IBGP的1.1.1.0/24更优先,更优先的OSPF路由就会加入PE3的路由表中,这种情况下如果PE3要发送数据给1.1.1.0/24就会经过CE2-PE2-PE1这条次优路线。这显然是我们不希望看到的情况。

因此又了Down Bit的设计,在PE2将从PE1学习来的BGP路由注入到本地VRF的OSPF进程时,如果是以3类LSA的形式注入,那么这些3类LSA会做特殊的置位,也就是Down Bit会置1,那么当PE3收到PE2从BGP重发布到OSPF的3类LSA,发现这些路由都设置了Down Bit,PE3在计算路由时,会直接忽略掉做这些Down Bit置1的LSA,自然这些路由也就不会被PE3从OSPF再重发布回BGP,可以起到防环作用。

Down Bit只出现在3类LSA中,在RFC 2547-BGP/MPLS VPNs中定义:

img

可以用show ip ospf database summary X.X.X.X查看:

img

作用

img

上面这种拓扑,当PE3从OSPF(CE1发送而来)和MP-IBGP(PE2发送而来)同时学到了Site1的路由,它将如何选择呢?虽然OSPF路由的AD值110小于MP-IBGP的200,但由于OSPF的路由是经过PE2重发布的,由PE2从MP-BGP发布进OSPF的,所以OSPF路由的Down Bit置1,当PE3收到PE2从BGP重发布到OSPF的3类LSA,发现这些路由都设置了Down Bit,PE3在计算路由时,会直接忽略掉做这些Down Bit置1的LSA,自然这些路由也就不会被PE3从OSPF再重发布回BGP,可以起到防环作用。

特别提醒

由于3类LSA的传播范围只有一个区域,且Down bit只在MPLS VPN情况下出现,一个Down bit置1的3类LSA,传播到另一个区域中会经由Area中间的ABR重新生成一个新的3类LSA,新生成这条3类LSA的ABR路由器很可能不在MPLS VPN区域,此时Down bit就会被消除掉。比如下图中,R3-PE1上进行了OSPF-BGP的双向重发布,当BGP重发布进OSPF时,R3-PE1生成了3类LSA,由于此时该路由器在MPLS VPN环境,所以重分布的OSPF的LSA为3类(两端PE的OSPF VRF进程号相同则重发布到远端PE的OSPF域后是3类LSA)且带有Down bit,这条3类LSA进入Area0后,会经由CE2传递到Area1(3类LSA会从骨干区域范洪到非骨干区域)。由于3类LSA的传播范围只有一个区域,CE2作为ABR会重新生成这条3类LSA,因为CE2不在MPLS VPN环境,会删除掉Down bit置位,这条3类LSA丧失掉了防环作用。

img

Domain-tag

img

Domain-tag和Down Bit功能类似,只不过它是用于OSPF外部路由。

如上图,在PE2上,将BGP路由重发布进OSPF后,如果是以外部路由的形式进入OSPF,则这些路由会被打上Tag(这个tag有默认的设置方式,参照RFC1745,也可以通过Domain-tag命令在PE路由上手工配置)。

这些路由在Site内,如果传递到本Site的另一台PE路由器PE3,那么一旦它自己本地设置的Domain-tag匹配到了这个路由携带的tag,这条路由就不会被重发布进BGP(这些OSPF路由不会被转载进VRF路由表,自然无法被发布进BGP)。

默认情况下,Domain-tag的设置是根据RFC1745来进行的,BGP的AS号码将会在无意义的16bit中被编码为OSPF外部路由标记。在上图中,PE2上BGP重发布到OSPF后,这些路由会被打上TAG,tag中包含BGP的AS号,路由传递到PE3后,PE3发现这些OSPF路由的tag与本地的BGP的AS号匹配,那么它就只将LSA放入OSPF的Database而不将路由装载进路由表,因此PE3上,对于这些远端站点的路由仍然是优先通过BGP学习到的路由传递数据,忽略从CE的OSPF学到的路由。但如果在PE2上,做BGP向OSPF路由重发布的时候,手工修改Domain-tag,使得与PE3的tag不匹配,那么PE3同时从OSPF及BGP学到这些外部路由,并且TAG不匹配,那么PE3会优选OSPF路由,因为OSPF的AD值110小于BGP的AD值200。

1
2
3
4
5
6
7
8
9
R5#sh ip ro 1.1.2.0 
Routing entry for 1.1.2.0/24
Known via "ospf 1", distance 110, metric 20
Tag Complete, Path Length == 1, AS 234, , type extern 2, forward metric 1
Last update from 10.1.45.4 on FastEthernet0/0, 00:00:00 ago
Routing Descriptor Blocks:
* 10.1.45.4, from 44.44.44.44, 00:00:00 ago, via FastEthernet0/0
Route metric is 20, traffic share count is 1
Route tag 3489661162

上面的tag3,489661162 ,将它转换成二进制: 11010000000000000000000011101010,最后的16bit,在转换成10进制,就是BGP的AS号,234。

TAG值在OSPF域之间传递,也就是在不同的OSPF域间传递,不会丢失,这个特性非常有用。

TAG值也可手工设置:redistribute….tag XXX,这样路由被重发布进OSPF后,tag值就是这个手工设置的值。

修改本地OSPF进程的Domain-tag:

1
2
3
R4(config)#router os 1 vrf ABC 
R4(config-router)#domain-tag ?
<1-4294967295> OSPF domain tag - 32-bit value

EIGRP

概述

PE路由器在做EIGRP到BGP重发布的时候,可以通过诸如BGP扩展community属性等来保存EIGRP路由的部分内容,包括metric、AS、TAG以及对外部路由而言的远程AS号、远程ID,远程协议和远程度量值,这些都是可以在EIGRP的拓扑表中找到的EIGRP特征。

如果EIGRP所通告的路由是内部路由,并且BGP扩展community属性中所携带的源AS号码能够匹配到目的AS号的话,这条路由会以内部路由的形式通告给远端站点,如果AS号不匹配,则这条路由会背重建为一跳EIGRP外部路由。

关于EIGRP的BGP扩展community属性:

img

来看一跳EIGRP内部路由在PE上重发布进BGP后的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
PE2#sh ip bgp vpnv4 all 1.1.1.0 (内部路由)
BGP routing table entry for 234:2:1.1.1.0/24, version 1489
Paths: (1 available, best #1, table ABC)
Flag: 0x820
Not advertised to any peer
Local, imported path from 234:1:1.1.1.0/24
2.2.2.2 (metric 3) from 2.2.2.2 (2.2.2.2)
Origin incomplete, metric 156160, localpref 100, valid, internal, best
Extended Community: RT:234:1 Cost:pre-bestpath:128:156160
0x8800:32768:0 0x8801:1:130560 0x8802:65281:25600 0x8803:65281:1500
mpls labels in/out nolabel/21



PE2#sh ip b vpnv4 all 1.1.2.0 (外部路由)
BGP routing table entry for 234:1:1.1.2.0/24, version 1486
Paths: (1 available, best #1, table ABC)
Flag: 0x820
Not advertised to any peer
Local
2.2.2.2 (metric 3) from 2.2.2.2 (2.2.2.2)
Origin incomplete, metric 261120, localpref 100, valid, internal, best
Extended Community: RT:234:1 Cost:pre-bestpath:129:261120 0x8800:0:0
0x8801:1:5120 0x8802:65281:256000 0x8803:65281:1500 0x8804:0:16843009
0x8805:11:0
mpls labels in/out nolabel/19

这些扩展的community值能够很好的保持EIGRP路由的特性,使得EIGRP路由在从一个站点经过MPLS VPN Backbone传输到另一个站点后,这些路由能在远端PE上被很好的还原。

配置

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
R1:
router eigrp 1
no auto-summary
network 10.0.0.0
network 1.0.0.0



R2:
router eigrp 1
no auto-summary
address-family ipv4 vrf ABC #在地址族下配置
network 10.1.12.0 0.0.0.255
no auto-summary
autonomous-system 1 #eigrp的as号,必须和CE上的匹配
redistribute bgp 234

EIGRP VRF的配置也是在ipv4 vrf地址簇中进行的。

EBGP

配置

img

img

AS65531内CE1的F0/0接口IP为10.1.12.1/24;PE1的F0/0为10.1.12.2/24.重点看CE1和PE1的配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
关键配置:
R1:
router bgp 65531
bgp router-id 1.1.1.1
bgp log-neighbor-changes
network 1.1.1.1 mask 255.255.255.255
neighbor 10.1.12.2 remote-as 234


R2:
ip vrf CISCO
rd 1:1
route-target export 234:2
route-target import 234:4
!
interface Ethernet0/0
ip vrf forwarding CISCO
ip address 10.1.12.2 255.255.255.0
!
router bgp 234
address-family ipv4 vrf CISCO
neighbor 10.1.12.1 remote-as 65531
neighbor 10.1.12.1 activate
exit-address-family

记得指向CE的neighbor指令不能在全局BGP进程里去指,因为F0/0这个接口,是在VRF CISCO中的,全局路由表中没有该直连网段。

VPNV4地址簇的邻居,需要在BPG主进程中先指neighbor,再去VPNV4地址簇中激活,使用show ip bgp vpnv4 vrf CISCO查看vrf 中BGP邻居是否建立。记得MPLS VPN有内外两层标签,内层标签由MP-BGP分配,外层标签由LDP分配,出现问题时分别排查内外标签。

Allowas-in

概念

img

注意这是个Hub&Spoke环境,客户要求Spoke之间的通信,需要通过Hub长点,这样一来Spoke的站点路由需要先经过MPLS Backbone AS1然后传递到Hub,然后再从Hub传回Backbone AS1再传到另一个Spoke站点。

这样一来,对于PE3来说就有问题了,有可能在路由的AS_PATH中看到自己的AS号,当路由器在一条路由更新中看到自己的AS号时,它不会接受这条路由更新。这时可使用Allowas-in特性。

实验

img

上面的拓扑环境中,两个站点用的都是相同的AS号,AS12,这样的情况下,由于AS_PATH放环机制的存在,如果一个路由器收到的路由更新中的AS_PATH中,包含着本AS的AS号在内,则路由器不会接受路由更新。通常情况下这种放环机制是很有作用的,但在某些情况下需要打破这种防环机制。

基本配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
P:
interface Loopback0
ip address 3.3.3.3 255.255.255.255
!
interface Ethernet0/1
ip address 192.168.23.3 255.255.255.0
duplex auto
mpls ip
!
interface Ethernet0/2
ip address 192.168.34.3 255.255.255.0
duplex auto
mpls ip
!
router ospf 234
router-id 3.3.3.3
network 0.0.0.0 255.255.255.255 area 0
!
mpls ldp router-id Loopback0




PE1:
ip vrf CISCO
rd 1:1
route-target export 234:1
route-target import 234:2
!
interface Loopback0
ip address 2.2.2.2 255.255.255.255
!
interface Ethernet0/1
ip vrf forwarding CISCO
ip address 192.168.12.2 255.255.255.0
duplex auto
!
interface Ethernet0/2
ip address 192.168.23.2 255.255.255.0
duplex auto
mpls ip
!
router ospf 234
router-id 2.2.2.2
network 2.2.2.2 0.0.0.0 area 0
network 192.168.23.2 0.0.0.0 area 0
!
router bgp 234
bgp router-id 2.2.2.2
bgp log-neighbor-changes
no bgp default ipv4-unicast
neighbor 4.4.4.4 remote-as 234
neighbor 4.4.4.4 update-source Loopback0
!
address-family vpnv4
neighbor 4.4.4.4 activate
neighbor 4.4.4.4 send-community extended
exit-address-family
!
address-family ipv4 vrf CISCO
neighbor 192.168.12.1 remote-as 12
neighbor 192.168.12.1 activate
exit-address-family
!
ip forward-protocol nd
!
!
no ip http server
no ip http secure-server
!
ipv6 ioam timestamp
!
!
mpls ldp router-id Loopback0




PE2:
ip vrf CISCO
rd 1:1
route-target export 234:2
route-target import 234:1
!
interface Loopback0
ip address 4.4.4.4 255.255.255.255
!
interface Ethernet0/1
ip vrf forwarding CISCO
ip address 192.168.45.4 255.255.255.0
duplex auto
!
interface Ethernet0/2
ip address 192.168.34.4 255.255.255.0
duplex auto
mpls ip
!
router ospf 234
router-id 4.4.4.4
network 4.4.4.4 0.0.0.0 area 0
network 192.168.34.4 0.0.0.0 area 0
!
router bgp 234
bgp router-id 4.4.4.4
bgp log-neighbor-changes
no bgp default ipv4-unicast
neighbor 2.2.2.2 remote-as 234
neighbor 2.2.2.2 update-source Loopback0
!
address-family vpnv4
neighbor 2.2.2.2 activate
neighbor 2.2.2.2 send-community extended
exit-address-family
!
address-family ipv4 vrf CISCO
neighbor 192.168.45.5 remote-as 12
neighbor 192.168.45.5 activate
exit-address-family
!
mpls ldp router-id Loopback0




CE1:
interface Loopback0
ip address 1.1.1.1 255.255.255.255
!
interface Ethernet0/0
no ip address
shutdown
duplex auto
!
interface Ethernet0/1
ip address 192.168.12.1 255.255.255.0
duplex auto
!
router bgp 12
bgp router-id 1.1.1.1
bgp log-neighbor-changes
network 1.1.1.1 mask 255.255.255.255
neighbor 192.168.12.2 remote-as 234



CE2:
interface Loopback0
ip address 5.5.5.5 255.255.255.255
!
interface Ethernet0/1
ip address 192.168.45.5 255.255.255.0
duplex auto
!
router bgp 12
bgp router-id 5.5.5.5
bgp log-neighbor-changes
network 5.5.5.5 mask 255.255.255.255
neighbor 192.168.45.4 remote-as 234

CE1和CE2都有一个宣告进BGP进程的loopback接口,先来看对端的PE是否收到了这两个loopback接口的路由:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
PE1#show ip bgp vpnv4 all
BGP table version is 4, local router ID is 2.2.2.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
Route Distinguisher: 1:1 (default for vrf CISCO)
*> 1.1.1.1/32 192.168.12.1 0 0 12 i
*>i 5.5.5.5/32 4.4.4.4 0 100 0 12 i



PE2#show ip bgp vpnv4 all
BGP table version is 4, local router ID is 4.4.4.4
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
Route Distinguisher: 1:1 (default for vrf CISCO)
*>i 1.1.1.1/32 2.2.2.2 0 100 0 12 i
*> 5.5.5.5/32 192.168.45.5 0 0 12 i

可以看到,两个PE都收到了对端CE的loopback接口路由,那么两个PE将路由发给对端的CE了吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
PE1#show ip bgp vpnv4 all neighbors 192.168.12.1 advertised-routes
BGP table version is 4, local router ID is 2.2.2.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
Route Distinguisher: 1:1 (default for vrf CISCO)
*>i 5.5.5.5/32 4.4.4.4 0 100 0 12 i

Total number of prefixes 1



PE2#show ip bgp vpnv4 all neighbors 192.168.45.5 advertised-routes
BGP table version is 4, local router ID is 4.4.4.4
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
Route Distinguisher: 1:1 (default for vrf CISCO)
*>i 1.1.1.1/32 2.2.2.2 0 100 0 12 i

Total number of prefixes 1

从上面的输出中可以看到,CE也将路由发送给了对端的PE,那么CE路由器的路由表有路由吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CE1# show ip bgp
BGP table version is 2, local router ID is 1.1.1.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
*> 1.1.1.1/32 0.0.0.0 0 32768 i



CE2#show ip bgp
BGP table version is 2, local router ID is 5.5.5.5
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
*> 5.5.5.5/32 0.0.0.0 0 32768 i

可以看到CE上只有自身宣告进BGP的路由,为什么它们拒绝接受从PE发来的路由呢?用debug命令看一下

1
2
3
4
5
6
7
8
9
10
CE1#debug ip bgp all updates 
BGP updates debugging is on for all address families


然后重启BGP进程
CE1#clear ip bgp *


来看看CE1上的信息提示:
CE1# BGP(0): 192.168.12.2 rcv UPDATE about 5.5.5.5/32 -- DENIED due to: AS-PATH contains our own AS;

和理论分析一致,CE1拒绝了路由更新,因为它从路由更新中发现了自己的AS号在AS_PATH中,这时有两种解决办法:

  • 使用Allow-AS特性打破防环机制;
  • 使用AS Override改变PE上的AS号打破防环机制;

这里我们使用allow as这个特性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
CE1(config)#router bgp 12
CE1(config-router)#neighbor 192.168.12.2 allowas-in



CE2(config)#router bgp 12
CE2(config-router)#neighbor 192.168.45.4 allowas-in


CE1上的debug如下:
CE1#
BGP(0): Revise route installing 1 of 1 routes for 5.5.5.5/32 -> 192.168.12.2(global) to main IP table



然后再看CE1和CE2的路由表:
CE1#show ip route 5.5.5.5
Routing entry for 5.5.5.5/32
Known via "bgp 12", distance 20, metric 0
Tag 234, type external
Last update from 192.168.12.2 00:01:46 ago
Routing Descriptor Blocks:
* 192.168.12.2, from 192.168.12.2, 00:01:46 ago
Route metric is 0, traffic share count is 1
AS Hops 2
Route tag 234
MPLS label: none


CE2#show ip route 1.1.1.1
Routing entry for 1.1.1.1/32
Known via "bgp 12", distance 20, metric 0
Tag 234, type external
Last update from 192.168.45.4 00:01:55 ago
Routing Descriptor Blocks:
* 192.168.45.4, from 192.168.45.4, 00:01:55 ago
Route metric is 0, traffic share count is 1
AS Hops 2
Route tag 234
MPLS label: none


CE2#ping 1.1.1.1 source loop 0
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 1.1.1.1, timeout is 2 seconds:
Packet sent with a source address of 5.5.5.5
!!!!!
两侧也顺利ping通

AS-Override

概念

没有AS-Override时

img

CE与PE之间运行EBGP,CE1和CE2使用相同的AS号,AS213,当路由10.1.1.0/24从CE1传递到CE2的时候,该路由的AS_PATH中有115和213两个AS号,CE2收到该路由后发现AS_PATH中出现了自己的AS号,因此双方都会忽略源自对方的路由更新。

配置了AS-Override后:

img

  • 如果AS_PATH中的AS号与该PE的CE(EBGP对等体,在上图中也就是CE2)的AS号相同,则将该AS号213替换成Provider的AS号,也就是中间的AS号115;

  • 如果这个AS号在AS_PATH中重复出现了(可能上游使用了as-path prepend命令),比如AS_PATH是213 213,那么在配置了AS-Override命令后,所有的重复AS号都会被替换,AS_PATH会变成115 115;

  • 在上述替换完成后,Provider的AS号会在此插入到AS_PATH中。

实验

img

拓扑和前面Allow AS-in的相同,上面的拓扑环境中,两个站点用的都是相同的AS号,AS12,这样的情况下,由于AS_PATH放环机制的存在,如果一个路由器收到的路由更新中的AS_PATH中,包含着本AS的AS号在内,则路由器不会接受路由更新。通常情况下这种放环机制是很有作用的,但在某些情况下需要打破这种防环机制。

基本配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
P:
interface Loopback0
ip address 3.3.3.3 255.255.255.255
!
interface Ethernet0/1
ip address 192.168.23.3 255.255.255.0
duplex auto
mpls ip
!
interface Ethernet0/2
ip address 192.168.34.3 255.255.255.0
duplex auto
mpls ip
!
router ospf 234
router-id 3.3.3.3
network 0.0.0.0 255.255.255.255 area 0
!
mpls ldp router-id Loopback0




PE1:
ip vrf CISCO
rd 1:1
route-target export 234:1
route-target import 234:2
!
interface Loopback0
ip address 2.2.2.2 255.255.255.255
!
interface Ethernet0/1
ip vrf forwarding CISCO
ip address 192.168.12.2 255.255.255.0
duplex auto
!
interface Ethernet0/2
ip address 192.168.23.2 255.255.255.0
duplex auto
mpls ip
!
router ospf 234
router-id 2.2.2.2
network 2.2.2.2 0.0.0.0 area 0
network 192.168.23.2 0.0.0.0 area 0
!
router bgp 234
bgp router-id 2.2.2.2
bgp log-neighbor-changes
no bgp default ipv4-unicast
neighbor 4.4.4.4 remote-as 234
neighbor 4.4.4.4 update-source Loopback0
!
address-family vpnv4
neighbor 4.4.4.4 activate
neighbor 4.4.4.4 send-community extended
exit-address-family
!
address-family ipv4 vrf CISCO
neighbor 192.168.12.1 remote-as 12
neighbor 192.168.12.1 activate
exit-address-family
!
ip forward-protocol nd
!
!
no ip http server
no ip http secure-server
!
ipv6 ioam timestamp
!
!
mpls ldp router-id Loopback0




PE2:
ip vrf CISCO
rd 1:1
route-target export 234:2
route-target import 234:1
!
interface Loopback0
ip address 4.4.4.4 255.255.255.255
!
interface Ethernet0/1
ip vrf forwarding CISCO
ip address 192.168.45.4 255.255.255.0
duplex auto
!
interface Ethernet0/2
ip address 192.168.34.4 255.255.255.0
duplex auto
mpls ip
!
router ospf 234
router-id 4.4.4.4
network 4.4.4.4 0.0.0.0 area 0
network 192.168.34.4 0.0.0.0 area 0
!
router bgp 234
bgp router-id 4.4.4.4
bgp log-neighbor-changes
no bgp default ipv4-unicast
neighbor 2.2.2.2 remote-as 234
neighbor 2.2.2.2 update-source Loopback0
!
address-family vpnv4
neighbor 2.2.2.2 activate
neighbor 2.2.2.2 send-community extended
exit-address-family
!
address-family ipv4 vrf CISCO
neighbor 192.168.45.5 remote-as 12
neighbor 192.168.45.5 activate
exit-address-family
!
mpls ldp router-id Loopback0




CE1:
interface Loopback0
ip address 1.1.1.1 255.255.255.255
!
interface Ethernet0/0
no ip address
shutdown
duplex auto
!
interface Ethernet0/1
ip address 192.168.12.1 255.255.255.0
duplex auto
!
router bgp 12
bgp router-id 1.1.1.1
bgp log-neighbor-changes
network 1.1.1.1 mask 255.255.255.255
neighbor 192.168.12.2 remote-as 234



CE2:
interface Loopback0
ip address 5.5.5.5 255.255.255.255
!
interface Ethernet0/1
ip address 192.168.45.5 255.255.255.0
duplex auto
!
router bgp 12
bgp router-id 5.5.5.5
bgp log-neighbor-changes
network 5.5.5.5 mask 255.255.255.255
neighbor 192.168.45.4 remote-as 234

PE1和PE2都向对端的CE1和CE2宣告了路由,但CE1和CE2由于路由更新中有自身的AS_PATH号,触发了防环机制,并没将路由更新放入路由表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
PE1#show ip bgp all neighbors 192.168.12.1 advertised-routes
For address family: VPNv4 Unicast
BGP table version is 7, local router ID is 2.2.2.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
Route Distinguisher: 1:1 (default for vrf CISCO)
*>i 5.5.5.5/32 4.4.4.4 0 100 0 12 i


PE2#show ip bgp vpnv4 all neighbors 192.168.45.5 advertised-routes
BGP table version is 4, local router ID is 4.4.4.4
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
Route Distinguisher: 1:1 (default for vrf CISCO)
*>i 1.1.1.1/32 2.2.2.2 0 100 0 12 i






CE1#show ip bgp
BGP table version is 2, local router ID is 1.1.1.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
*> 1.1.1.1/32 0.0.0.0 0 32768 i


CE2#show ip bgp
BGP table version is 2, local router ID is 5.5.5.5
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
*> 5.5.5.5/32 0.0.0.0 0 32768 i

这里使用as-override来打破环路:

1
2
3
4
5
6
7
8
9
PE1(config)#router bgp 234
PE1(config-router)#address-family ipv4 vrf CISCO
PE1(config-router-af)#neighbor 192.168.12.1 as-override



PE2(config)#router bgp 234
PE2(config-router)#address-family ipv4 vrf CISCO
PE2(config-router-af)#neighbor 192.168.45.5 as-override

配置完毕以后再看CE1和CE2的路由表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
CE1#show ip bgp
BGP table version is 3, local router ID is 1.1.1.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
*> 1.1.1.1/32 0.0.0.0 0 32768 i
*> 5.5.5.5/32 192.168.12.2 0 234 234 i


CE2#show ip bgp
BGP table version is 3, local router ID is 5.5.5.5
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
*> 1.1.1.1/32 192.168.45.4 0 234 234 i
*> 5.5.5.5/32 0.0.0.0 0 32768 i

路由更新进入了路由表。

MPLS VPN高级特性

限制VRF中路由数量

运营商提供MPLS VPN服务,如果PE-CE之间采用BGP连接,由于BGP往往用于承载大量的路由前缀信息,因此实际上PE设备承担着一定的风险,例如CE网络中的攻击行为,或路由条目过多导致PE设备过载等等,因此需要针对特定客户分配的资源进行限制。思科提供了两种方法:

  1. 限制从BGP邻居收到的路由前缀条目;
  2. 限制VRF中的路由条目数量;

限制BGP路由数量

1
2
3
4
5
6
7
8
9
10
router bgp 2345
address-family ipv4 vrf ABC
neighbor 5.5.5.5 maximum-prefix YYY
限制从邻居接收的前缀最大数量,如果超出了这个数字,路由器就会关闭与该邻居的BGP连接,在使用clear ip bgp 命令之前都不会再次建立BGP会话

neighbor maximum-prefix XX restart YY
当从邻居接收的前缀数量超过XX这个数量后,断开与邻居的BGP连接,Y分钟后才能重新连接

neighbor maximum-prefix 300 90% warning-only
当从邻居接收的前缀数量超过了最大数字300的90%时(默认75%),生成一条日志消息

限制VRF路由数量

VRF路由表中的路由学习来源有两个,分别是从CE(PE-CE之间的IGP),以及VPNV4(也就是MP-BGP),那么这个特性的限制对这两个途径学习到的路由都有效。

1
2
ip vrf ABC
maximum XXX

SOO

基本概念

  • SOO全称是Site Of Origin,SOO是一个扩展BGP community,用来标识路由的起源站点的唯一性,防止从VRF路由表进入BGP路由表的路由又回到起源站点,防止出现路由环路(对于那些连接着多个PE的CE来说,如果CE只连接了单PE则不需要该属性防环)或出现次优路径。

  • SOO用于PE-CE之间是IGP协议时,或当AS_PATH作为防环手段不再可靠的BGP环境中(比如使用了AS-Override或Allow-as-in)。

  • 如果在PE上为一个CE配置了SOO时,当这个PE从VPNV4邻居处收到一个带有同样SOO的VPNV4路由更新后,PE不会将这个VPNV4路由更新放入VRF路由表,也不会更新给CE。所以SOO是在VRF上配置的。

  • 所有从CE学到的路由都会被赋予相同的SOO值,即使来自该站点的路由来自不同的PE路由器。这样才能确保来自单一CE的这些路由进入BGP时都带有该SOO,才能防止环路出现。比如如果CE1同时连接了PE1和PE2,那么PE1和PE2都要对CE1使用SOO特性。

  • 当PE-CE之间是EBGP邻居关系时,SOO在PE上用route-map方式进行配置;当PE-CE之间是其他IGP路由协议时,SOO在适当的VRF接口上配置。

img

比如上图中的CE2,和PE3以及PE2相连接,在PE2和PE3上都要对CE2通告过来的,进入VRF中的路由赋予相同的SOO值,1:100,这样来自CE2的路由不管从哪个途径进入BGP,试图重新传回CE2或和CE2相连的PE时,都会携带SOO,当PE收到重新传回的那些带有SOO的VPNV4路由时,不会被放入VRF路由表中。

配置命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
EBGP情况:
route-map test permit 10
set extcommunity soo 1:100
router bgp 1
address-family ipv4 vrf ABC
neighbor 10.10.2.1 remote-as 1
neighbor 10.10.2.1 route-map test in
在EBGP情况下,直接使用route-map命令,然后在neighbor中进行关联



非BGP情况:
interface e0/0
ip vrf sitemap test
在恰当的vrf interface 的ip vrf sitemap中配置

也可以在直连和静态路由重发布到BGP的时候关联设置SOO的route-map。

选择性Import\Export

选择性import

1
2
3
4
5
6
7
8
ip vrf ABC
import map test
route-target import 2345:10


access-list 10 permit 10.1.1.0
route-map test
match ip address 10

路由在导入VRF路由表前,先经过RT过滤一遍,再经过Import map后跟的route-map过滤一遍。VRF路由表学习路由的来源有两个途径,一个是通过CE学习到,另一个是通过VPNV4路由,也就是MP-BGP学习到,那么这个选择性Import的特性,过滤的路由是针对VPNV4学习到的路由。前面通过maximum限制路由最大数量的命令则对MP-BGP和VPNV4学习到的路由都生效。

img

两条VPNV4路由到达PE,两条VPNV4路由的RT都是115:317,符合VRF配置的RTimport,但由于VRF上还配置了import map,还要根据名为RTMAP的route-map再过滤一遍,由于这个route-map需要match192.168.30.0网段的地址,所以来自192.168.31.0网段的那条VPNV4地址无法导入VRF。

选择性export

1
2
3
4
5
6
7
8
ip vrf ABC
export map test
route-target export 2345:20

access-list 10 permit 10.2.2.0
route-map test
match ip address 10
set extcommunity rt 2345:2020 additive

‘export map test’并不能起到过滤导出路由的作用,而是给匹配route-map test的路由附加额外配置的RT值,就是‘set extcommunity rt 2345:2020 additive’中配置的RT值,如果后面不加additive,则为覆盖原有RT值,加上additive,则为额外增加一个RT值。这个命令只针对从VRF导入MP-BGP的路由生效,而且只能set RT值。

img

上图中,配置了export map,其中access-list匹配的是192.168.30.0网段,附加的RT值是115:273且应用了additive命令,所以这条192.168.30.0的VPNV4路由除了原有的115:317,还有一个额外的RT值,115:273。

MPLS VPN双PE防环

实验1:CE运行OSPF

拓扑及环境

img

左右两个Site,两边的PE-CE路由协议都是OSPF,R5为RR,PE1、PE2、PE3都是它的Client。左右两个Site都将客户路由发送给PE,最终要实现Site之间能够互访。R3-R5,R4-R5,R5-R6之间均为MP-IBGP关系,R5为RR。

本实验重点关注两个Site在各种OSPF网络设计的情况下,网络的特征和产生的变化,以及Site1双PE在各种环境下的问题和解决办法。

OSPF单区域情况

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
R1:
interface Loopback0
ip address 1.1.1.1 255.255.255.255
!
interface Ethernet0/0
ip address 10.1.13.1 255.255.255.0
duplex auto
!
interface Ethernet0/1
ip address 10.1.12.1 255.255.255.0
duplex auto
!
interface Ethernet0/2
no ip address
shutdown
duplex auto
!
interface Ethernet0/3
no ip address
shutdown
duplex auto
!
router ospf 1
router-id 1.1.1.1
network 1.1.1.1 0.0.0.0 area 0
network 10.1.12.1 0.0.0.0 area 0
network 10.1.13.1 0.0.0.0 area 0






R2:
interface Loopback0
ip address 2.2.2.2 255.255.255.255
!
interface Ethernet0/0
ip address 10.1.24.2 255.255.255.0
duplex auto
!
interface Ethernet0/1
ip address 10.1.12.2 255.255.255.0
duplex auto
!
interface Ethernet0/2
no ip address
shutdown
duplex auto
!
interface Ethernet0/3
no ip address
shutdown
duplex auto
!
router ospf 1
router-id 2.2.2.2
network 2.2.2.2 0.0.0.0 area 0
network 10.1.12.2 0.0.0.0 area 0
network 10.1.24.2 0.0.0.0 area 0







R3:
ip vrf CISCO
rd 1:1
route-target export 3456:12
route-target import 3456:3
route-target import 3456:12
!
ip cef
no ipv6 cef
!
multilink bundle-name authenticated
mpls label range 300 399
!
interface Loopback0
ip address 3.3.3.3 255.255.255.255
!
interface Ethernet0/0
ip vrf forwarding CISCO
ip address 10.1.13.3 255.255.255.0
duplex auto
!
interface Ethernet0/1
ip address 10.1.35.3 255.255.255.0
duplex auto
mpls ip
!
interface Ethernet0/2
no ip address
shutdown
duplex auto
!
interface Ethernet0/3
no ip address
shutdown
duplex auto
!
router ospf 1 vrf CISCO
redistribute bgp 3456 subnets
network 10.1.13.3 0.0.0.0 area 0
!
router ospf 3456
router-id 3.3.3.3
network 3.3.3.3 0.0.0.0 area 0
network 10.1.35.3 0.0.0.0 area 0
!
router bgp 3456
bgp router-id 3.3.3.3
bgp log-neighbor-changes
no bgp default ipv4-unicast
neighbor 5.5.5.5 remote-as 3456
neighbor 5.5.5.5 update-source Loopback0
!
address-family vpnv4
neighbor 5.5.5.5 activate
neighbor 5.5.5.5 send-community extended
exit-address-family
!
address-family ipv4 vrf CISCO
redistribute ospf 1 match internal external 1 external 2
exit-address-family
!
ip forward-protocol nd
!
!
no ip http server
no ip http secure-server
!
ipv6 ioam timestamp
!
!
mpls ldp router-id Loopback0






R4:
ip vrf CISCO
rd 1:2
route-target export 3456:12
route-target import 3456:12
route-target import 3456:3
!
ip cef
no ipv6 cef
!
multilink bundle-name authenticated
mpls label range 400 499
!
interface Loopback0
ip address 4.4.4.4 255.255.255.255
!
interface Ethernet0/0
ip vrf forwarding CISCO
ip address 10.1.24.4 255.255.255.0
duplex auto
!
interface Ethernet0/1
ip address 10.1.45.4 255.255.255.0
duplex auto
mpls ip
!
interface Ethernet0/2
no ip address
shutdown
duplex auto
!
interface Ethernet0/3
no ip address
shutdown
duplex auto
!
router ospf 1 vrf CISCO
redistribute bgp 3456 subnets
network 10.1.24.4 0.0.0.0 area 0
!
router ospf 3456
router-id 4.4.4.4
network 4.4.4.4 0.0.0.0 area 0
network 10.1.45.4 0.0.0.0 area 0
!
router bgp 3456
bgp router-id 4.4.4.4
bgp log-neighbor-changes
no bgp default ipv4-unicast
neighbor 5.5.5.5 remote-as 3456
neighbor 5.5.5.5 update-source Loopback0
!
address-family vpnv4
neighbor 5.5.5.5 activate
neighbor 5.5.5.5 send-community extended
exit-address-family
!
address-family ipv4 vrf CISCO
redistribute ospf 1 match internal external 1 external 2
exit-address-family
!
ip forward-protocol nd
!
!
no ip http server
no ip http secure-server
!
ipv6 ioam timestamp
!
!
mpls ldp router-id Loopback0






R5:
interface Loopback0
ip address 5.5.5.5 255.255.255.255
!
interface Ethernet0/0
ip address 10.1.35.5 255.255.255.0
duplex auto
mpls ip
!
interface Ethernet0/1
ip address 10.1.45.5 255.255.255.0
duplex auto
mpls ip
!
interface Ethernet0/2
--More--
*Mar 27 17:33:26.911: %SYS-5-CONFIG_I: Configured from console by console
ip address 10.1.56.5 255.255.255.0
duplex auto
mpls ip
!
interface Ethernet0/3
no ip address
shutdown
duplex auto
!
router ospf 3456
router-id 5.5.5.5
network 0.0.0.0 255.255.255.255 area 0
!
router bgp 3456
bgp router-id 5.5.5.5
bgp log-neighbor-changes
no bgp default ipv4-unicast
neighbor 3.3.3.3 remote-as 3456
neighbor 3.3.3.3 update-source Loopback0
neighbor 4.4.4.4 remote-as 3456
neighbor 4.4.4.4 update-source Loopback0
neighbor 6.6.6.6 remote-as 3456
neighbor 6.6.6.6 update-source Loopback0
!
address-family vpnv4
neighbor 3.3.3.3 activate
neighbor 3.3.3.3 send-community extended
neighbor 3.3.3.3 route-reflector-client
neighbor 4.4.4.4 activate
neighbor 4.4.4.4 send-community extended
neighbor 4.4.4.4 route-reflector-client
neighbor 6.6.6.6 activate
neighbor 6.6.6.6 send-community extended
neighbor 6.6.6.6 route-reflector-client
exit-address-family
!
ip forward-protocol nd
!
!
no ip http server
no ip http secure-server
!
ipv6 ioam timestamp
!
!
mpls ldp router-id Loopback0






R6:
ip vrf CISCO
rd 1:3
route-target export 3456:3
route-target import 3456:12
!
ip cef
no ipv6 cef
!
multilink bundle-name authenticated
mpls label range 600 699
!
interface Loopback0
ip address 6.6.6.6 255.255.255.255
!
interface Ethernet0/0
ip address 10.1.56.6 255.255.255.0
duplex auto
mpls ip
!
interface Ethernet0/1
ip vrf forwarding CISCO
ip address 10.1.67.6 255.255.255.0
duplex auto
!
interface Ethernet0/2
no ip address
shutdown
duplex auto
!
interface Ethernet0/3
no ip address
shutdown
duplex auto
!
router ospf 1 vrf CISCO
redistribute bgp 3456 subnets
network 10.1.67.6 0.0.0.0 area 0
!
router ospf 3456
router-id 6.6.6.6
network 6.6.6.6 0.0.0.0 area 0
network 10.1.56.6 0.0.0.0 area 0
!
router bgp 3456
bgp router-id 6.6.6.6
bgp log-neighbor-changes
no bgp default ipv4-unicast
neighbor 5.5.5.5 remote-as 3456
neighbor 5.5.5.5 update-source Loopback0
!
address-family vpnv4
neighbor 5.5.5.5 activate
neighbor 5.5.5.5 send-community extended
exit-address-family
!
address-family ipv4 vrf CISCO
redistribute ospf 1 match internal external 1 external 2
exit-address-family
!
ip forward-protocol nd
!
!
no ip http server
no ip http secure-server
!
ipv6 ioam timestamp
!
!
mpls ldp router-id Loopback0






R7:
interface Loopback0
ip address 7.7.7.7 255.255.255.255
!
interface Ethernet0/0
ip address 10.1.67.7 255.255.255.0
duplex auto
!
interface Ethernet0/1
no ip address
shutdown
duplex auto
!
interface Ethernet0/2
no ip address
shutdown
duplex auto
!
interface Ethernet0/3
no ip address
shutdown
duplex auto
!
router ospf 1
router-id 7.7.7.7
network 7.7.7.7 0.0.0.0 area 0
network 10.1.67.7 0.0.0.0 area 0

路由分析

img

假设先配置的是PE1,然后配置的是PE2,来看看路由传递的过程,关键看VPNV4路由从R5传递给PE1后,PE1将路由注入到OSPF,形成3类LSA,这些3类LSA的DownBit都置为1了,因此即使再经过Site1内的OSPF网络被传到PE2,PE2也不会用这些3类LSA参与路由的计算,因为DownBit置1的路由会被路由器直接忽略掉,也不会加载进路由表,更不会在PE2上经过OSPF到BGP的重发布倒灌回BGP。注意,此刻PE2是恒定忽略掉DownBit置1的3类LSA的,即使Shutdown掉PE2连接R5的接口也一样,在此环境中,得益于OSPF的DownBit设计,网络显得很可靠。

img

假设PE1先配置的OSPF到BGP的重发布,那么Site1内的客户路由,被PE1注入到MP-BGP形成了VPNV4的前缀,经由RR反射给了PE2,这时对于PE2来说,一遍是VRF的OSPF路由进程学习到Site1内的路由,另一方面,从MP-IBGP也学习到这些路由,OSPF进程的AD为110,MP-IBGP的AD为200,OSPF的AD小于MP-IBGP的AD值,所以优选OSPF路由,不会造成次优路由的问题。

OSPF多区域情况

img

首先看PE1上发生了什么,PE1上首先通过BGP学习到了7.7.7.7这条Site2内的路由,然后将BGP路由重新发布到OSPF,形成Down bit置1的3类LSA。那么CE1就能学习到关于7.7.7.7的OIA路由,并且继续将3类LSA传递给CE2,CE2也收下了,由于它是ABR,从Area0收到3类LSA,于是CE2重新生成了一条3类LSA传递给PE2,此时这条3类LSA中的Downbit置1已经被清除,失去了防环功能,因为CE2并没有在MPLS VPN环境中,Downbit是只有在该环境中重发布时才会置位的。这还不是最糟糕的,更糟糕的是,3类LSA被传递给PE2以后,对于OSPF来说,MPLS VPN Backbone就是一个Super backbone area超级骨干区域,那么PE2一边连着Area1,另一边连着这个Super backbone area,既是一台ASBR又是一台ABR,ASBR是因为它引入了BGP的外部路由,ABR是因为它连接着Area 0和Area1。PE2是一台ABR,但却从Area1收到了3类LSA,这违反了OSPF关于‘3类LSA必须经过Area0中转’这一原则,因此PE2会忽略在Area1上收到的任何来自CE2的3类LSA,当然产生自CE2的Area1内的区域内部的1类LSA还是会接收的。

正是由于PE2的ABR属性,造成另一个问题是,来自Site1内Area0的路由,经由CE2以3类LSA的形式通告给PE2,PE2在路由计算的时候也照样忽略它们,这将导致接下去产生次优路径的问题。PE1上学到了Site1内的OSPF路由,它将这些OSPF重发布到BGP,并经由RR反射给了PE2,于是PE2从BGP学习到了这些Site 1内的路由,另一方面PE2又忽略了CE2更新过来的关于Site1内部路由的3类LSA,因此PE2的路由表里关于Site1中Area0的路由全是BGP的:

1
2
3
4
5
6
B        1.1.1.1 [200/11] via 3.3.3.3, 01:27:08 
B 1.1.1.1 [200/11] via 3.3.3.3, 01:27:08
B 7.7.7.7 [200/11] via 6.6.6.6, 01:27:08
B 10.1.12.0/24 [200/20] via 3.3.3.3, 01:27:08
B 10.1.13.0/24 [200/0] via 3.3.3.3, 01:27:08
B 10.1.67.0/24 [200/0] via 6.6.6.6, 01:27:08

img

刚才描述的过程,可以用上面的图片来描述,即使将PE2上连接RR的接口Shutdown,PE2依旧会直接忽略从CE2传来的3类LSA,这种情况下PE2的VRF路由表变成了:

1
O                2.2.2.2 [110/11] via 10.1.24.2, 00:10:48, Ethernet0/0 

只有一条Area 1内的路由,但查看PE2的OSPF Database发现,还是有许多CE2发过来的3类LSA,很明显验证了前面的说法,PE2认为它是个ABR,直接忽略了CE2发过来的3类LSA。

由于PE2路由表中存在的这个次优路径,加上PE2又做了OSPF和BGP的双向重发布,那么PE2上,这些从PE1倒灌过来的关于Site1内的路由,此时在PE2的路由表中是BGP路由,在BGP到OSPF的重发布动作后,这些路由又被倒灌回了Site1:

img

现在来看CE2上:

  • 对于Site1内Area0中的路由,从Area0学到的是1类LSA和2类LSA,从PE2倒灌回来的是3类LSA,CE2当然优选1类LSA和2类LSA的路由,所以这里天然防环。

  • 对于对端站点Site2内的路由,CE2同时能学到PE1和PE2更新过来的3类LSA,此时会比较Metric,最后优选PE2作为下一跳。

  • 关键点,这里有个细节,R2是一台ABR,既然是ABR,那么当它收到PE2重发布进来的OSPF的3类LSA的时候,即使将3类LSA放进了LSDB也是应该忽略掉的,因为它从常规区域Area1收到的这些3类LSA,违法了‘3类LSA必须经过Area0中转’这一原则,但实际上在这个环境中,CE2不但将LSA装载进了LSDB,并且,这些LSA还参与了路由计算。但这些3类LSA,CE2自己是收下了也参与了路由计算,却不会将它们泛洪到Area0中,也就是说,只影响了CE2自己。

综上所述,当Site1内规划成多区域时,有可能引发一系列潜在的问题,所以:

  • MPLS VPN环境中,OSPF网络的设计要非常谨慎;

  • 上面的问题,可以考虑在CE2和PE2之间,建立一个Virtual-link;

  • 再有就是可以利用一些策略工作过滤掉路由;

OSPF单区域进程号不同

img

两边VRF OSPF进程号不同,Site 2的路由被PE1注入进OSPF后,会以5类LSA的形式注入,然后:

img

之前笔记中写过,Domain-tag功能和Down bit类似,不过DownBit是用于内部路由而Domain-Tag用于外部路由,由于两边VRF的OSPF进程号不同,所以重发布进OSPF的BGP路由,是以带有Domain-tag的5类LSA进入的OSPF区域,经由CE1-CE2传到PE2的时候,PE2收到这条5类LSA发现携带着Domain-tag值,且和本地的Domain-tag值匹配,因此这些5类LSA不会参与路由计算,可以达到防止次优路径的目的。同样也不用担心Site1内的路由被PE1注入到BGP然后经由RR反射回PE2,这里直接比AD值,反射回PE2的路由为AD值是200的IBGP路由,而PE2还收到了AD值为110的OSPF路由,BGP落败,就不会有次优路由的问题了。

双PE运行EIGRP

img

一边EIGRP一边非EIGRP

img

实验中,Site1使用EIGRP,Site2使用OSPF,首先来看Site1内部路由的传递问题。

拿路由1.1.1.1举例,CE2及PE1都能学到这条EIGRP内部路由,那么在CE2及PE1上,1.1.1.1为EIGRP内部路由,且Metric都是537600,现在R2将这条路由更新给了PE2,那么在PE2上,路由的Metric是563200。

另一方面,PE1上,由于路由表中有了EIGRP路由1.1.1.1,且Metric为537600,因此这条路由在EIGRP到BGP的重发布过程中,被注入到了BGP,而这条路由的一些EIGRP特性,比如带宽、负载、延迟、AS号等等都被放进BGP路由的扩展community中,与前缀一并传递给了RR,RR将路由反射给了PE2。

现在关键问题就在PE2上,PE2将同时从EIGRP以及BGP学习到这条路由,PE2会如何选择?在OSPF-BGP环境下,会比较OSPF和BGP的AD值最后OSPF胜出,但这里情况不同,PE2在EIGRP环境中不会去比较AD值而是去比较Metric值。

为什么会这样?因为Site1内的EIGRP路由被PE1将路由注入到BGP后,这些EIGRP路由的许多特性都被很好的保存在BGP的扩展Community中,随着路由被一起运载到了PE2上,那么PE2可以根据这些扩展community值去还原EIGRP路由。

1
2
3
4
5
6
7
8
9
10
11
R3-PE1#sh ip b vpnv4 all 1.1.1.1 
BGP routing table entry for 1:1:1.1.1.1/32, version 1072
Paths: (1 available, best #1, table cisco)
Advertised to update-groups:
4
Local
10.1.13.1 from 0.0.0.0 (3.3.3.3)
Origin incomplete, metric 409600, localpref 100, weight 32768, valid, sourced, best
0x8800:32768:0 0x8801:1:153600 0x8802:65281:256000 0x8803:65281:1500
!! 丰富的扩展 community 值很好的保护了 EIGRP 路由的原始生态特征
mpls labels in/out 313/nolabel

因此,对于EIGRP来说,此刻MPLS VPN Backbone就相当于一个透明区域,所以PE2虽然同时从EIGRP以及MP-IBGP收到1.1.1.1/32,但它不会去比较AD而是比较Metric。CE2将EIGRP路由更新给PE2,PE2经由CE2去往1.1.1.1的Metric是563200,而从MPLS VPN这一侧通过PE1走,Metric是537600,因此最终,PE2优选BGP的1.1.1.1路由放进了路由表。

这样一来就出问题了,对于PE2而言,去往1.1.1.1走的是MPLS VPN Backbone这条次优路径,而且更郁闷的是,由于这条路由在PE2的VRF路由表里是BGP的,而PE2又部署了BGP与EIGRP的双向重发布,这条次优路由又被倒灌回了EIGRP,这也是我们非常不想看到的。

解决的办法,可以考虑在PE1及PE2上,BGP进程中过滤掉Site1内的路由而防止自己从MP-IBGP再学习到这些路由,这种方法有个潜在的问题是,如果CE1-CE2之间的链路断掉的话,那么CE1-CE2之间的连通性就丢失了。另一个用于解决该问题的方法是采用SOO,同样的也存在刚才说的那个缺陷。

下面来看另一种情况:

img

如果R1始发的1.1.1.1路由不是EIGRP内部路由,而是由直连重发布所产生的路由,那么情况就大不一样了。

这条路由首先是分别被PE1和PE2学习到,那么假设我们先在PE1上做的EIGRP到BGP的重发布,那么这条路由又通过MP-IBGP传递给了PE2,所以症结又在PE2这里了,PE2会如何选择?此时PE2不再比较Metric了,而是比较AD值,所以PE2路由表里装的1.1.1.1路由,还是EIGRP的。

为什么一会儿比较AD一会儿比较Metric呢?来看PE1发出的VPNV4前缀:

1
2
3
4
5
6
7
R3-PE1#sh ip b vpnv4 all 1.1.1.1  
BGP routing table entry for 1:1:1.1.1.1/32, version 1049
Paths: (2 available, best #2, table cisco)
10.1.13.1 from 0.0.0.0 (3.3.3.3)
Origin incomplete, metric 537600, localpref 100, weight 32768, valid, sourced, best
Extended Community: RT:3456:12 !! 扩展 Community 里只有 RT
mpls labels in/out 300/nolabel

可以看到,PE1学习到的这条EIGRP外部路由,在注入BGP后,并没有像内部路由那样,将各个参数保存到BGP的扩展community中,这样的一个直接后果就是,在路由被RR反射到PE2后,PE2完全没有足够的信息将路由还原成EIGRP路由,既然如此,PE2就当该路由是一条纯粹的从MP-IBGP学习到的路由,自然而然的就与另一侧的EIGRP去PK路由协议的AD值,最终EIGRP外部的170AD值小于MP-IBGP的200的AD值,EIGRP外部路由胜出。

Site2路由传播

img

再看Site2的路由传播,假设PE1先做的重发布,那么7.7.7.7的路由被注入到了EIGRP中,由于这条路由的来源是OSPF协议,因此路由是以外部路由的方式注入到EIGRP中,这条EIGRP外部路由最终更新给了PE2,而PE2也从MP-IBGP学习到了这条路由,这里毫无疑问是要比较这两个路由的AD值的,因为都是外部路由,所以最终PE2的路由表里存放的关于7.7.7.7的路由是EIGRP的,因为EIGRP的外部路由AD值为170小于MP-IBGP的AD值200。

由于PE2上又做了EIGRP到BGP的重发布,因此这条路由又被倒灌回了MP-BGP。解决的办法是在PE1和PE2上,将BGP路由注入到EIGRP的时候关联一个route-map,给路由打上Tag,然后在EIGRP向BGP重发布时,将这些打了Tag的路由Deny掉,放行其他即可。

两边均为EIGRP

两端AS号一致

img

在该环境中,Site2运行的PE-CE协议为EIGRP,且AS号也为1.现在来看Site2到Site1的路由传递过程。

7.7.7.7这条EIGRP内部路由,被PE3注入到EIGRP后,形成了一条VPNV4前缀,同时还携带着用于保留EIGRP特性的那些扩展community。路由分别被传递到了PE1和PE2。

假设在PE1上先行配置的BGP到EIGRP的重发布,那么这条BGP路由被PE1注入了EIGRP,得益于路由携带的扩展community属性,这条路由被还原成了一条EIGRP内部路由,然后被放进了Site1的EIGRP域。这样一来这条路由就会经过R2最终传递给了PE2。

现在PE2上从EIGRP学到了一条内部路由7.7.7.7,另一方面,也从MP-IBGP学习到了这条路由,该怎么办?这里不会比较EIGRP和MP-IBGP的AD值,而是去比较Metric值。因为MP-IBGP传递过来的这条路由中的扩展community能够使得路由在PE2上的BGP重发布到EIGRP后被还原成了一条EIGRP内部路由,此时从PE2的视角来看,MPLS VPN Backbone相当于完全透明的,相当于:

img

上面这个情况,PE2在面对两条内部EIGRP路由的情况下,会比较Metric值。也就是说当EIGRP路由在穿越MPLS VPN Backbone时,如果路由的各项特性能够完好的保存下来,此时MPLS VPN Backbone对于EIGRP相当于透明的。

两端AS号不同

img

img

Inter-AS MPLS VPN

概述

Inter-AS MPLS VPN是一种牛逼的解决方案,到目前为止,接触的MPLS VPN中,Backbone都属于一个单一的AS,单一的ISP,如果两端的站点分布在两个不同的ISP下属的MPLS VPN网络呢?这就需要考虑域间的MPLS VPN解决方案了,Inter-AS MPLS VPN是一种基于基础MPLS VPN构架的扩展,在RFC 2547中定义。

img

最终目的非常简单,就是在两个AS之间传递VPN路由,使得各VPN客户的不同站点能够互访。

img

总结起来Inter-AS MPLS VPN有四种方式,分别是option A、B、C和C+,根据场景需要使用不同的方案,简单场景一般用Option A,复杂场景使用Option C。

img

img

Option A

模型解析

概述

  • 当PE-ASBRs之间在一条物理连接的情况下可以考虑部署,并建议只部署在少量VRFs要求的环境中;

  • 两个PE-ASBRs之间只有一条物理线路连接;

  • 两个PE-ASBRs各自将对方视为一台CE,两者之间可使用任意一种PE-CE动态路由协议;

  • 在两个PE-ASBRs之间流量传递的是传统的IP流量,两台ASBR之间不维护任何MP-BGP邻接关系,也不维护任何LDP邻接关系;

  • 这种Inter-AS MPLS VPN方案最简单,但是很明显,扩展性非常差,当有大量VRF的情况下无法胜任;

  • 不同ISP之间的ASBR都会把对方ASBR看成是CE,在两端ASBR上创建VRF并形成邻居,彼此之间传输的是IPV4路由,但会把对方传过来的路由加入VRF表;

数据交互过程

img

实验说明

img

MPLS标签范围为路由器编号,比如R1的label range为100-199。R3为RR,PE-ASBR1及ASBR2之间两边接口都不能运行LDP,使用一个OSPF协议来作为PE-CE的IGP,双方互相将对方视为自己的VRF客户。CE1-PE1、CE2-PE2以及SP1ASBR-SP2ASBR之间都运行BGP协议。

实验配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
基础配置:
CE-R1:
interface Loopback0
ip address 1.1.1.1 255.255.255.255
!
interface Ethernet0/0
ip address 10.1.12.1 255.255.255.0
duplex auto
!
router bgp 10
bgp log-neighbor-changes
network 1.1.1.1 mask 255.255.255.255
neighbor 10.1.12.2 remote-as 100







SP1-PE1-R2:
interface Loopback0
ip address 2.2.2.2 255.255.255.255
!
interface Ethernet0/0
ip address 10.1.12.2 255.255.255.0
duplex auto
!
interface Ethernet0/1
ip address 10.1.23.2 255.255.255.0
!
router ospf 1
network 2.2.2.2 0.0.0.0 area 0
network 10.1.23.2 0.0.0.0 area 0






SP1-P-R3:
interface Loopback0
ip address 3.3.3.3 255.255.255.255
!
interface Ethernet0/0
ip address 10.1.23.3 255.255.255.0
!
interface Ethernet0/1
ip address 10.1.34.3 255.255.255.0
!
router ospf 1
router-id 3.3.3.3
network 0.0.0.0 255.255.255.255 area 0






SP1-ASBR-R4:
interface Loopback0
ip address 4.4.4.4 255.255.255.255
!
interface Ethernet0/0
ip address 10.1.34.4 255.255.255.0
duplex auto
!
router ospf 1
router-id 4.4.4.4
network 4.4.4.4 0.0.0.0 area 0
network 10.1.34.4 0.0.0.0 area 0






SP2-ASBR-R5:
interface Loopback0
ip address 5.5.5.5 255.255.255.255
!
interface Ethernet0/1
ip address 10.1.56.5 255.255.255.0
!
router ospf 567
router-id 5.5.5.5
network 5.5.5.5 0.0.0.0 area 0
network 10.1.56.5 0.0.0.0 area 0






SP2-P-R6:
interface Loopback0
ip address 6.6.6.6 255.255.255.255
!
interface Ethernet0/0
ip address 10.1.56.6 255.255.255.0
!
interface Ethernet0/1
ip address 10.1.67.6 255.255.255.0
!
router ospf 567
router-id 6.6.6.6
network 0.0.0.0 255.255.255.255 area 0





SP2-PE1-R7:
interface Loopback0
ip address 7.7.7.7 255.255.255.255
!
interface Ethernet0/0
ip address 10.1.67.7 255.255.255.0
duplex auto
!
interface Ethernet0/1
no ip address
duplex auto
!
router ospf 567
router-id 7.7.7.7
network 7.7.7.7 0.0.0.0 area 0
network 10.1.67.7 0.0.0.0 area 0





CE2-R8:
interface Loopback0
ip address 8.8.8.8 255.255.255.255
!
interface Ethernet0/0
ip address 10.1.78.8 255.255.255.0
duplex auto
!
router bgp 20
bgp router-id 8.8.8.8
bgp log-neighbor-changes
neighbor 10.1.78.7 remote-as 200
network 8.8.8.8 mask 255.255.255.255

AS100和AS200两个Backbone的内部路由用OSPF打通确保彼此之间有到对方Loopback接口的路由,确保外部MPLS标签不出问题,CE1和CE2客户路由的BGP已经配置上,目的是让两个CE之间的Loopback接口能够通信,下面配置ISP内部设备。

首先CE-PE之间建立邻居关系,为了隔离不同客户之间的路由,先设置VRF,这里CE1这端用VRF BLUE,CE2那端用VRF RED,然后建立两端PE-CE之间的邻居关系:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
SP1-PE1-R2:
ip vrf BLUE
rd 100:100
route-target export 100:100
route-target import 100:100

interface Ethernet0/0
ip vrf forwarding BLUE
ip address 10.1.12.2 255.255.255.0



验证VRF的配置:
R2#show ip vrf
Name Default RD Interfaces
BLUE 100:100 Et0/0



接下来配置PE-CE间BGP邻居
router bgp 100
bgp router-id 2.2.2.2
no bgp default ipv4-unicast
!
address-family ipv4 vrf BLUE
neighbor 10.1.12.1 remote-as 10
neighbor 10.1.12.1 activate



验证是否收到了1.1.1.1路由
R2#show bgp vpnv4 unicast all
BGP table version is 2, local router ID is 2.2.2.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
Route Distinguisher: 100:100 (default for vrf BLUE)
*> 1.1.1.1/32 10.1.12.1 0 0 10 i






在SP2-PE1-R7上做类似的配置:
ip vrf RED
rd 200:200
route-target export 200:200
route-target import 200:200


interface Ethernet0/1
ip vrf forwarding RED
ip address 10.1.78.7 255.255.255.0


R7#show ip vrf
Name Default RD Interfaces
RED 200:200 Et0/1


router bgp 200
bgp router-id 7.7.7.7
no bgp default ipv4-unicast
!
address-family ipv4 vrf RED
neighbor 10.1.78.8 remote-as 20
neighbor 10.1.78.8 activate


R7收到了8.8.8.8的路由:
R7#show bgp vpnv4 unicast all
BGP table version is 2, local router ID is 7.7.7.7
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
Route Distinguisher: 200:200 (default for vrf RED)
*> 8.8.8.8/32 10.1.78.8 0 0 20 i

在单ISP的MPLS VPN情况下,PE之间会建立VPNV4邻居,但在本实验拓扑中,PE位于不同的AS中,所以它们彼此之间无法建立VPNV邻居。拓扑中,SP1-ASBR和SP2-ASBR这两个在ISP边缘的路由器,在这里我们把它们看作是是连接客户的PE路由器。接下来要建立SP1-PE1和SP1-ASBR之间,以及SP2-PE2和SP2-ASBR之间的VPNV4邻居关系,BGP的TCP连接由OSPF协议打通:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
SP1-ASBR:
ip vrf BLUE
rd 100:100
route-target export 100:100
route-target import 100:100
!
router bgp 100
bgp router-id 2.2.2.2
no bgp default ipv4-unicast
neighbor 4.4.4.4 remote-as 100
neighbor 4.4.4.4 update-source Loopback0
!
address-family vpnv4
neighbor 4.4.4.4 activate
neighbor 4.4.4.4 send-community extended
exit-address-family



SP1-PE1-R2:
router bgp 100
bgp router-id 2.2.2.2
no bgp default ipv4-unicast
neighbor 4.4.4.4 remote-as 100
neighbor 4.4.4.4 update-source Loopback0
!
address-family vpnv4
neighbor 4.4.4.4 activate
neighbor 4.4.4.4 send-community extended




来看PE1和ASBR之间的VPNV4邻居是否建立:
R4#show ip bgp vpnv4 all summary
BGP router identifier 4.4.4.4, local AS number 100
BGP table version is 3, main routing table version 3
1 network entries using 156 bytes of memory
1 path entries using 84 bytes of memory
1/1 BGP path/bestpath attribute entries using 168 bytes of memory
1 BGP AS-PATH entries using 24 bytes of memory
1 BGP extended community entries using 24 bytes of memory
0 BGP route-map cache entries using 0 bytes of memory
0 BGP filter-list cache entries using 0 bytes of memory
BGP using 456 total bytes of memory
BGP activity 1/0 prefixes, 1/0 paths, scan interval 60 secs

Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
2.2.2.2 4 100 28 27 3 0 0 00:21:39 1



验证ASBR是否收到了PE1发来的VPNV4路由:
R4#show ip bgp vpnv4 all
BGP table version is 3, local router ID is 4.4.4.4
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
Route Distinguisher: 100:100 (default for vrf BLUE)
*>i 1.1.1.1/32 2.2.2.2 0 100 0 10 i






SP2-ASBR-R5:
ip vrf RED
rd 200:200
route-target export 200:200
route-target import 200:200
!
router bgp 200
bgp router-id 5.5.5.5
no bgp default ipv4-unicast
neighbor 7.7.7.7 remote-as 200
neighbor 7.7.7.7 update-source Loopback0
!
address-family vpnv4
neighbor 7.7.7.7 activate
neighbor 7.7.7.7 send-community extended
exit-address-family




SP2-PE1-R7:
router bgp 200
bgp router-id 7.7.7.7
no bgp default ipv4-unicast
neighbor 5.5.5.5 remote-as 200
neighbor 5.5.5.5 update-source Loopback0
!
address-family vpnv4
neighbor 5.5.5.5 activate
neighbor 5.5.5.5 send-community extended
exit-address-family




此时SP2-ASBR-R5也收到了8.8.8.8这条路由:
R5#show bgp vpnv4 unicast all
BGP table version is 3, local router ID is 5.5.5.5
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
Route Distinguisher: 200:200 (default for vrf RED)
*>i 8.8.8.8/32 7.7.7.7 0 100 0 20 i

在Option A(Back-to-Back VRF)中,ASBR将对方对接的路由器看成客户设备,所以SP1-ASBR会把自己看做PE而把对端的SP2-ASBR看做CE,反之亦然。

如果有多个客户,也就是有多个VRF,这种情况下可以为每个客户配置不同的子接口,用子接口来交换路由信息。在本实验中,我们用VLAN100来配置,在两端的ASBR上分别配置位于不同VRF的子接口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SP2-ASBR-R5:
interface Ethernet0/0.100
encapsulation dot1Q 100
ip vrf forwarding RED
ip address 10.1.45.5 255.255.255.0




SP1-ASBR-R4:
interface Ethernet0/1.100
encapsulation dot1Q 100
ip vrf forwarding BLUE
ip address 10.1.45.4 255.255.255.0



R4#ping vrf BLUE 10.1.45.5
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.1.45.5, timeout is 2 seconds:
.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max = 1/1/1 ms

两端连通性搞定以后,就可以在两端ASBR上运行IGP或BGP来交换路由信息,在这里我们使用BGP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
SP2-ASBR-R5:
router bgp 200
address-family ipv4 vrf RED
neighbor 10.1.45.4 remote-as 100
neighbor 10.1.45.4 activate



SP1-ASBR-R4:
router bgp 100
address-family ipv4 vrf BLUE
neighbor 10.1.45.5 remote-as 200
neighbor 10.1.45.5 activate






R5#show bgp vpnv4 unicast all
BGP table version is 4, local router ID is 5.5.5.5
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
Route Distinguisher: 200:200 (default for vrf RED)
*> 1.1.1.1/32 10.1.45.4 0 100 10 i
*>i 8.8.8.8/32 7.7.7.7 0 100 0 20 i



R4#show bgp vpnv4 unicast all
BGP table version is 4, local router ID is 4.4.4.4
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
Route Distinguisher: 100:100 (default for vrf BLUE)
*>i 1.1.1.1/32 2.2.2.2 0 100 0 10 i
*> 8.8.8.8/32 10.1.45.5 0 200 20 i

可以看到,两个ISP的ASBR都收到了对方CE的路由,然后由VPNV4通过P-PE-CE发送到用户,先看AS100中的ISP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
R2#show bgp vpnv4 unicast all
BGP table version is 4, local router ID is 2.2.2.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
Route Distinguisher: 100:100 (default for vrf BLUE)
*> 1.1.1.1/32 10.1.12.1 0 0 10 i
*>i 8.8.8.8/32 4.4.4.4 0 100 0 200 20 i



R1#show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
a - application route
+ - replicated route, % - next hop override, p - overrides from PfR

Gateway of last resort is not set

1.0.0.0/32 is subnetted, 1 subnets
C 1.1.1.1 is directly connected, Loopback0
8.0.0.0/32 is subnetted, 1 subnets
B 8.8.8.8 [20/0] via 10.1.12.2, 00:05:57

接下来看AS200中ISP的路由:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
R7#show bgp vpnv4 unicast all
BGP table version is 4, local router ID is 7.7.7.7
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
Route Distinguisher: 200:200 (default for vrf RED)
*>i 1.1.1.1/32 5.5.5.5 0 100 0 100 10 i
*> 8.8.8.8/32 10.1.78.8 0 0 20 i



R8#show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
a - application route
+ - replicated route, % - next hop override, p - overrides from PfR

Gateway of last resort is not set

1.0.0.0/32 is subnetted, 1 subnets
B 1.1.1.1 [20/0] via 10.1.78.7, 00:07:34

此时两边CE已经有对端的路由了,但此时依旧无法Ping通,因为MPLS VPN的外部标签还没配置,也就是ISP内部的MPLS还没配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
mpls ldp router-id loop 0
mpls label range X00 X99
比如在R3上标签的范围就是300 399,在R4上就是400 499

在R2的E0/1,R3的E0/0-1,R4的E0/0,R5的E0/1,R6的E0/0-1,R7的E0/0上配置:
mpls ip


查看MPLS LDP邻居建立:
R6#show mpls ldp neighbor
Peer LDP Ident: 5.5.5.5:0; Local LDP Ident 6.6.6.6:0
TCP connection: 5.5.5.5.646 - 6.6.6.6.37958
State: Oper; Msgs sent/rcvd: 112/112; Downstream
Up time: 01:32:24
LDP discovery sources:
Ethernet0/0, Src IP addr: 10.1.56.5
Addresses bound to peer LDP Ident:
10.1.56.5 5.5.5.5
Peer LDP Ident: 7.7.7.7:0; Local LDP Ident 6.6.6.6:0
TCP connection: 7.7.7.7.22578 - 6.6.6.6.646
State: Oper; Msgs sent/rcvd: 11/11; Downstream
Up time: 00:03:26
LDP discovery sources:
Ethernet0/1, Src IP addr: 10.1.67.7
Addresses bound to peer LDP Ident:
10.1.67.7 7.7.7.7



R3#show mpls ldp neighbor
Peer LDP Ident: 2.2.2.2:0; Local LDP Ident 3.3.3.3:0
TCP connection: 2.2.2.2.646 - 3.3.3.3.53179
State: Oper; Msgs sent/rcvd: 114/114; Downstream
Up time: 01:32:38
LDP discovery sources:
Ethernet0/0, Src IP addr: 10.1.23.2
Addresses bound to peer LDP Ident:
10.1.23.2 2.2.2.2
Peer LDP Ident: 4.4.4.4:0; Local LDP Ident 3.3.3.3:0
TCP connection: 4.4.4.4.45468 - 3.3.3.3.646
State: Oper; Msgs sent/rcvd: 58/59; Downstream
Up time: 00:44:54
LDP discovery sources:
Ethernet0/1, Src IP addr: 10.1.34.4
Addresses bound to peer LDP Ident:
10.1.34.4 4.4.4.4


内外层标签均配置完毕后,查看CE1和CE2的连通性:
R1#ping 8.8.8.8 source 1.1.1.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 8.8.8.8, timeout is 2 seconds:
Packet sent with a source address of 1.1.1.1
!!!!!



R1#tr 8.8.8.8 source 1.1.1.1
Type escape sequence to abort.
Tracing the route to 8.8.8.8
VRF info: (vrf in name/id, vrf out name/id)
1 10.1.12.2 0 msec 0 msec 1 msec
2 10.1.23.3 [MPLS: Labels 302/403 Exp 0] 2 msec 1 msec 2 msec
3 10.1.45.4 [MPLS: Label 403 Exp 0] 2 msec 2 msec 1 msec
4 10.1.45.5 2 msec 2 msec 1 msec
5 10.1.56.6 [MPLS: Labels 602/16 Exp 0] 3 msec 3 msec 2 msec
6 10.1.78.7 [MPLS: Label 16 Exp 0] 1 msec 5 msec 1 msec
7 10.1.78.8 2 msec 4 msec *

过程分析

控制层面

img

CE1-R1和SP1-PE1-R2之间通过BGP协议的方式,将IPV4路由宣告给PE路由器的VRF BLUE路由表,为VRF BLUE配置了RD以及RT,所以64bit长的RD被添加到32bit的Ipv4路由上,构成了96bit长的VPNV4地址,使得前缀在ISP中具有唯一性,RT值被添加到MPBGP的community扩展属性上。PE1和ASBR形成了MP-IBGP邻居关系,互相宣告带有MPLS标签(也就是VPN标签,由MPBGP分配给前缀)以及VPNV4路由前缀以及RT值,VPNV4路由宣告给ASBR后,导入IPV4 VRF以后,再到IPV4路由的形式宣告给SP2-ASBR,而后IPV4导入VRF中,然后前缀加上RD以后变成了96bit长的VPNV4前缀,宣告给了MP-IBGP邻居R7,由R7以IPV4形式通过BGP传递给了R8。R4和R5之间是纯IP形式交互,Option A可以理解成两个MPLS VPN在跨域的时候用IP形成了缝合。

数据层面

img

1
2
3
4
5
6
7
8
9
10
11
R1#tr 8.8.8.8 source 1.1.1.1
Type escape sequence to abort.
Tracing the route to 8.8.8.8
VRF info: (vrf in name/id, vrf out name/id)
1 10.1.12.2 0 msec 0 msec 1 msec
2 10.1.23.3 [MPLS: Labels 302/403 Exp 0] 2 msec 1 msec 2 msec
3 10.1.45.4 [MPLS: Label 403 Exp 0] 2 msec 2 msec 1 msec
4 10.1.45.5 2 msec 2 msec 1 msec
5 10.1.56.6 [MPLS: Labels 602/16 Exp 0] 3 msec 3 msec 2 msec
6 10.1.78.7 [MPLS: Label 16 Exp 0] 1 msec 5 msec 1 msec
7 10.1.78.8 2 msec 4 msec *

从Traceroute中可以看出,CE1发出来的数据是纯IP,到了PE1以后路由器发现收到的是个数据包,会查CEF表,因此:

1
2
3
4
5
6
7
8
9
10
11
R2#show ip cef vrf BLUE 8.8.8.8 detail
8.8.8.8/32, epoch 0, flags [rib defined all labels]
recursive via 4.4.4.4 label 403
nexthop 10.1.23.3 Ethernet0/1 label 302-(local:201)




R2#show ip cef vrf BLUE 8.8.8.8/32
8.8.8.8/32
nexthop 10.1.23.3 Ethernet0/1 label 302-(local:201) 403

MPLS VPN有两层标签,先看外层标签,由LDP分配,因为MPLS不会为BGP分配标签但会为BGP的下一跳分配标签,PE1和PE2由loopback接口建立邻居,更新原地址是彼此的loopback接口,所以下一跳是4.4.4.4:

1
2
3
4
5
6
7
8
9
10
11
12
13
R2#show bgp vpnv4 unicast all
BGP table version is 4, local router ID is 2.2.2.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
Route Distinguisher: 100:100 (default for vrf BLUE)
*> 1.1.1.1/32 10.1.12.1 0 0 10 i
*>i 8.8.8.8/32 4.4.4.4 0 100 0 200 20 i

4.4.4.4的outgoing标签是302由LDP分配,所以外层标签是302,这个外层标签是由R3分配的,从标签范围上也可能看出来。路由表中4.4.4.4的下一跳是10.1.23.3,所以递归后,到8.8.8.8的下一跳是10.1.23.3,也就是发给R3。

1
2
3
4
R2#show mpls forwarding-table
Local Outgoing Prefix Bytes Label Outgoing Next Hop
Label Label or Tunnel Id Switched interface
201 302 4.4.4.4/32 0 Et0/1 10.1.23.3

内层标签由MP-BGP分配,具体来说就是由SP1-ASBR-R3分配:

1
2
3
4
R4#show mpls forwarding-table
Local Outgoing Prefix Bytes Label Outgoing Next Hop
Label Label or Tunnel Id Switched interface
403 No Label 8.8.8.8/32[V] 2302 Et0/1.100 10.1.45.5

所以最后这个IP包压上两层标签,内层标签为403,外层标签为302,下一跳是10.1.23.3,然后将数据发给SP1-P-R3,R3收到该数据后,由于是个MPLS标签包,所以查看LFIB表:

1
2
3
4
5
R3#show mpls forwarding-table
Local Outgoing Prefix Bytes Label Outgoing Next Hop
Label Label or Tunnel Id Switched interface
302 Pop Label 4.4.4.4/32 42891 Et0/1 10.1.34.4
303 Pop Label 2.2.2.2/32 41172 Et0/0 10.1.23.2

对于外层标签是302的标签包,R3会将最外层标签包弹出(Pop label),然后下一跳是4.4.4.4,也就是叫给SP1-ASBR-R4。标签头是403的MPLS包到了R4以后,查询LFIB表:

1
2
3
4
R4#show mpls forwarding-table
Local Outgoing Prefix Bytes Label Outgoing Next Hop
Label Label or Tunnel Id Switched interface
403 No Label 8.8.8.8/32[V] 2302 Et0/1.100 10.1.45.5

标签头是403的MPLS包下一跳是10.1.45.5,动作是No Label,也就是将所有标签都剥掉,所以发给SP2-ASBR-R5的是一个IP包,R5收到这个IP包以后会查询自己的CEF表:

1
2
3
R5#show ip cef vrf RED 8.8.8.8
8.8.8.8/32
nexthop 10.1.56.6 Ethernet0/1 label 602-(local:503) 16

CEF上显示,下一步动作是打上外部标签602以及内部标签16,先看外层标签,由LDP分配,因为MPLS不会为BGP分配标签但会为BGP的下一跳分配标签,SP2-ASBR-R5和SP2-PE1-R7用loopback接口建立邻居,所以更新原地址是对方的loopback接口,所以下一跳是7.7.7.7:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
R5#show mpls forwarding-table
Local Outgoing Prefix Bytes Label Outgoing Next Hop
Label Label or Tunnel Id Switched interface
503 602 7.7.7.7/32 0 Et0/1 10.1.56.6



R5#show ip route
7.0.0.0/32 is subnetted, 1 subnets
O 7.7.7.7 [110/21] via 10.1.56.6, 06:47:19, Ethernet0/1




R5#show bgp vpnv4 unicast all
BGP table version is 4, local router ID is 5.5.5.5
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Network Next Hop Metric LocPrf Weight Path
Route Distinguisher: 200:200 (default for vrf RED)
*>i 8.8.8.8/32 7.7.7.7 0 100 0 20 i

到7.7.7.7的outgoing标签是602由LDP分配,所以外层标签是602,由R6分配该标签,路由表中7.7.7.7的下一跳是10.1.56.6,也就是发送给R6。

接下来看内层标签,内层标签由MP-BGP分配,具体来说是由SP2-PE1-R7分配:

1
2
3
4
R7#show mpls forwarding-table
Local Outgoing Prefix Bytes Label Outgoing Next Hop
Label Label or Tunnel Id Switched interface
16 No Label 8.8.8.8/32[V] 1824 Et0/1 10.1.78.8

所以最后这个IP包压上两层标签,外层标签为602,内层标签为16,然后发送到下一跳10.1.56.6,也就是R6,R6收到MPLS包后会查看LFIB:

1
2
3
4
R6#show mpls forwarding-table
Local Outgoing Prefix Bytes Label Outgoing Next Hop
Label Label or Tunnel Id Switched interface
602 Pop Label 7.7.7.7/32 52717 Et0/1 10.1.67.7

由于Outgoing是Pop label,R6会将顶部的外层标签602弹出,只剩下了内层标签16,然后将数据交给10.1.67.7,也就是R7,当MPLS数据到R7以后查询R7的LFIB表:

1
2
3
4
R7#show mpls forwarding-table
Local Outgoing Prefix Bytes Label Outgoing Next Hop
Label Label or Tunnel Id Switched interface
16 No Label 8.8.8.8/32[V] 1824 Et0/1 10.1.78.8

标签16的outgoing标签为No label,所以R7会将该标签包的所有标签剥离,变成一个IP数据,然后交给10.1.78.8,也就是发送给R8,最终顺利到达R8上的loopback0接口。

https://blog.csdn.net/weixin_45821358/article/details/108396786

http://ciskonetwork.blogspot.com/2015/08/inter-as-mpls-vpn-option-back-to-back.html

http://www.amolak.net/mpls-l3vpn-inter-as-vpn-option-a/

https://ccieblog.co.uk/mpls/difference-between-the-rd-and-rt

https://www.networkfuntimes.com/route-distinguishers-vs-route-targets-what-are-they-why-do-we-need-them-both/

https://ipwithease.com/rd-vs-rt-in-mpls/

img