mpls 多协议标签交换
本文中为了解决“BGP水平分割”的问题举例说明mpls的配置,工作原理。
案例1:
环境描述:
1.中间的黄色区域配置OSPF area0
*宣告回环接口和内网接口
2.配置BGP
*注意AS200中只有R2和R5建邻居
*注意R2和R5需要next-hop-local
MPLS配置
什么是LDP?
-LDP的概念
标签分发协议LDP(Label Distribution Protocol)是 MPLS 体系中的一种主要协议。在 MPLS 网络中,两个标签交换路由器(LSR)必须用在它们之间或通过它们转发流量的标签上达成一致。
标签分发协议结构
-LDP的4中消息:
-LDP的工作阶段:
1.邻居发现,使用UDP 646报文,周期性发送,周期时间为5S
2.会话建立,使用tcp 646报文,周期性发送,周期时间为15s
如果45s收不到,那么邻居就挂掉了。
mpls工作过程:
1.LDP不为BGP路由分配标签,仅仅为IGP分配标签
2.按照BGP路由转发的数据包,使用的标签信息,是:去往这个BGP路由的下一跳IP地址时,所使用的标签
例如在R2上:
去往10.10.6.6/32时,必须走10.10.5.5
但是去往10.10.5.5时,使用的是OSPF路由,所以LDP会为该路由分配一个标签(1026)
查看相关信息
*查看mpls标签表:
display mpls lsp
*查看路由标签表
display ip routing-table 10.10.6.6 verbose -->关注tunnel ID
*查看mpls标签表,详细信息
display mpls lsp verbose -->关注 token
*查看mpls ldp邻居表
display mpls ldp peer
*查看mpls ldp 会话
display mpls ldp session
mpls ldp会话,使用的是tcp会话,主动方发起连接的端口号是随机的,被动方固定
IP地址大的一方是主动发起方,IP地址小的一方是被动方。
只有建立会话之后才会传递标签
------------------------------------------------MPLS的应用----------------------------------------------
1.代替传统的IP路由转发
2.MPLS-VPN
VPN:virtual private network 虚拟专用网络
常见的分类:
1. 1层VPN---专线(电话线拨号)
2. 2层VPN---通过2层技术实现的VPN(pptp vpn和 l2pt vpn)
&MPLS--VPN属于2.5层VPN
3. 3层VPN---通过3层技术实现的VPN(ipsec vpn)
在运营商售卖自己的MPLS-VPN业务的时候,必然会遇见以下的问题:
1. 在运营商的边界设备上,同时连接多个VPN客户的时候,边界设备如何区分不同的VPN客户的相同的私有网络的条目?
解决方案:
我们在边界路由器上,使用VRF(virtual router forwarding)技术,将一个真实的路由器虚拟成多个虚拟路由,每个虚拟路由器都对应着一个VPN客户。
虚拟路由器之间,是完全隔离的,不能相互访问的。
但是,在华为设备上,VRF这种技术,在配置命令中,使用的名词叫做vpn-instance;
即每个vpn-instance,就是一个“虚拟路由器”。
所以,我们在同一个边界路由器上,创建多个VPN实例,分配给每个VPN客户。
每个VPN实例都有一个名字,名字不能相同。
2.运营商的边界设备上可以学习到自己相连的每个VPN客户的路由,那么接下来需要考虑的就是让不同的VPN客户的路由,进行相互传递。
那么,此时能够在边界设备之间传递路由的协议,我们只能选择BGP。
但是,通过BGP传递路由的时候,我们知道:BGP永远值传输那个“最好”的路由,即前面带着“>”的;
因为,在边界路由器上,无论是哪个虚拟路由器,他们的路由必须宣告进入到BGP协议;
一旦宣告,BGP这个协议该如何区分不同的VPN客户的路由呢?
解决方案:
为了能够让BGP在传递VPN客户路由的时候,区分出不同的VPN路由。
我们在这些路由条目前面添加了一个字段,叫做:RD(route distinguisher),即路由区分符;
RD长度是64bit;
但是平时BGP传递的IPV4路由,长度为32bit;
所以,此时BGP所传递的VPN客户路由应该是:64+32 =96bit,这种路由我们称之为:VPNV4路由。
那么,我们平时使用的传递IPV4路由的BGP,我们就统称之为BGP;
现在传递VPNV4路由的BGP,我们应该称之为:MP-BGP(多协议的BGP),
即这个BGP协议,什么类型的路由,都能传递
比如:IPV4/VPNv4/IPV6/组播路由
MP-BGP为了区分不同类型的路由的操作命令,在配置模式中,针对每种协议都开发了一个对应的
address-family
3.一旦VPN的路由,通过MP-BGP协议传递到了对端的“边界路由器上”,此时就会面临着另外一个问题;
众多的VPN客户端,应该如何准确的放入到“边界路由器”上的各个“虚拟路由表”中;
每一个VPN客户的路由,曾经宣告进入到MP-BGP协议的时候,都会携带一个RT,比如是1:1
那么。这个路由到了对端的边界设备上的时候,就会检查对端设备上的每个VRF中的已经配置好的“入向RT”,
如果有一个VRF的入向RT也是1:1,那么久表示:该VRF,仅仅接收那些带着1:1的VPN客户路由。
每个虚拟路由器中,都包含了2中类型的RT;
-出向RT,即当路由从虚拟路由器中,宣告进入到MP-BGP协议时,所需要携带的RT
-入向RT,即该数值直接决定了“该虚拟路由器”会接收哪些VPN客户路由。
只有当VPN客户路由中的RT和自己的VRF中的入向RT相同的时候,才会接收。
4.配置
*配置R2-R5的接口IP地址,R2的1口和2口先不创建IP,R5的0和2口先不用创建IP(忽略)
*配置黄色区域ospf area0,R2和R5只宣告回环接口和运营商内部接口(忽略)
*注意R2和R5要配置一个loopback0 接口,IP分别:10.10.2.2 ;10.10.5.5 ,要宣告进入到OSPF中去
否则后面R2和R5通过loopback0 无法建立MP-BGP邻居。
*mpls配置
R2:
MPLS lsr-id 10.10.2.2
mpls
quit
mpls ldp
quit
int g0/0/0
mpls
mpls ldp
quit
R3:
MPLS lsr-id 10.10.3.3
mpls
quit
mpls ldp
quit
int g0/0/0
mpls
mpls ldp
quit
int g0/0/1
mpls
mpls ldp
quit
R4:
MPLS lsr-id 10.10.4.4
mpls
quit
mpls ldp
quit
int g0/0/0
mpls
mpls ldp
quit
int g0/0/1
mpls
mpls ldp
quit
R5:
MPLS lsr-id 10.10.5.5
mpls
quit
mpls ldp
quit
int g0/0/1
mpls
mpls ldp
quit
*虚拟路由器配置
R2:
#为A公司的客户,创建虚拟路由器A1
测试:
在R2上ping -vpn-instance A1 192.168.1.1,结果是通的!
测试:
在R2上ping -vpn-instance B7 192.168.1.7,结果是通的!
测试:
在R5上 ping -vpn-instance A56 192.168.2.6,结果是通的!
*在边界路由器之间,建立MP-IBGP邻居关系;
R2:
BGP 200
router-id 2.2.2.2
peer 10.10.5.5 as-unmber 200
peer 10.10.5.5 connecct-interface loopback 0
ipv4-family unicast
undo peer 10.10.5.5 enable
quit
ipv4-family vpnv4
peer 10.10.5.5 enable
quit
*运营商的边界路由器,应该讲VPN客户的路由,宣告进入到MP-BGP协议,从而传递到对端设备上;
1.首先在R2上,添加一个去往A客户的路由条目
ip route-static vpn-instance A1 10.10.1.1 32 192.168.1.1
2.将添加好的VPN客户的路由,宣告进入到MP-BGP协议中
bgp 200
ipv4-family vpn-instance A1
network 10.10.1.1 32
quit
3. 宣告成功之后,该路由正式进入到VPNv4的BGP数据库中。
查看vpnv4 BGP数据库:
4. 但是在R5上查看的时候,并没有收到R2传送过来的VPNV4路由条目
因为,运行MP-BGP协议传递VPNV4路由的时候,默认有一个策略:过滤RT,
即,接收一个VPNV4客户路由的时候,该路由是必须携带着RT属性的(VPN-target)
5. 所以我们需要在R2上:将vpn-instance A1中的IPV4路由变成VPNv4 路由的时候,不但要为路由添加一个RD ,还得需要添加一个RT。并且,添加的仅仅是“出向RT”。
所以,为虚拟路由器A1配置如下命令:
ip vpn-instance A1
VPN-target 16:1 export-community
6.为了能够让R5正常接收R2传递过来的VPNV4路由,并且放入到同一个客户的分公司对应的虚拟路由器A56中,
所以我们需要在R5上配置:
ip vpn-instance A56
VPN-target 16:1 import-community
7. 此时检查R5本地的,VPNv4的数据库,以及虚拟路由器A56的路由表,查询命令:
display bgp vpnv4 all routing-table
display ip routing-table vpn-instance A56
此时,R2就通过 MP-BGP ,将客户A的总公司的路由,传递到了分公司的边界路由器上。
接下来,我们想办法让R5,将客户A的分公司的路由,传递到R2上;
1. 在R5上的虚拟路由器A56中,添加一个去往分公司的路由条目
ip route-static vpn-instance A56 10.10.6.6 32 192.168.2.6
2.在R5上,将上述的静态路由,宣告进入到MP-BGP协议中,变成VPNV4路由;
bgp 200
ipv4-family vpn-instance A56
import-route static
quit
3.为了能够让该路由传递到R2那边,并且被正常的接收,所以我们需要配置vpn-target,
-R5需要:配置A56 的出向 RT ,比如可以设置为16:6
-R2需要:配置A1 的入向 RT , 此时必须设置为 16:6
4.此时我们在R2的BGP数据库中,以及A1的路由表中都可以看到R6的路由条目。
但是我们在VPN客户的公司和运营商之间,并没有运行动态路由协议。
所以,为了能够让VPN客户A的总公司和分公司互通。
我们需要在客户的公司设备上,添加额外的路由条目:
R1:
ip route-static 0.0.0.0 0 192.168.1.2
R6:
ip route-static 0.0.0.0 0 192.168.2.5
此时,我们在R1 上进行测试,可以与R6互通:
<R1> ping -a 10.10.1.1 10.10.6.6
------------------------------------------------------------------------------------------------------
分析:R1> ping -a 10.10.1.1 10.10.6.6的数据转发过程
1. 因为R1是标准的IP路由器,所以去往目标IP地址时,查看的是路由表:
通过以上信息可知:数据包应该发送给R2;
2.R2在属于vpn-instance A1的接口g0/0/1,收到一个标准的IP数据包:
所以R2应该查找关于虚拟路由器 A1 的IP路由表(详细信息)
<R2>display ip routeing-table vpn-instance A1 10.10.6.6 verbose
通过以上信息可知:去往10.10.6.6时,使用的路由条目是IBGP 路由:10.10.6.6/32
并且该路由是携带者“标签”的 ------ label:1027;
但是,想要去往 10.10.6.6,必须得首先去往下一跳IP地址:10.10.5.5。
但是,去往该下一跳IP地址的时候,需要走的是标签隧道,因为Tunnel ID是0x9 ,即非0
所以,我们接下来需要查看本地的“标签转发表”的详细信息:要找到某个LSP的TOken的值为 0x9
查看信息如下:
《R2》display mpls lsp verbose
通过以上信息可知:
数据包应该从G0/0/0转发出去,并且再次添加一个出向标签(out-label:1028)
所以,在 R2-R3之间抓包,我们会发现,此时的数据结构应该是:
【2层头部】+【1028】+【1027】+【IP头部】+数据+【2层头部效验和】
3.数据包从R2发送出来,到了R3后,R3能够辨别出:当前收到的数据包时一个“标签”包;
所以R3应该查找自己本地的“标签转发表”
因为该数据包,带了多个标签,所以必须得注意:查找标签的时候,仅仅关注“顶层标签”
所以我们要在R3的标签转发表中,找到一个条目,关注入向标签是:1028
通过以上信息可知:
我们需要将标签1028,交换成1025.然后从端口g0/0/0转发出去,
此时的数据包结构是:
【2层头部】+【1025】+【1027】+【IP头部】+数据+【2层头部效验和】
4.数据包从R3发送出来,到了R4后,R4能够辨别出:当前收到的数据包是一个“标签包” :
所以R4应该查找自己本地的“标签转发表”
因为该数据包,带了多个标签,所以必须得注意:查找标签的时候,仅仅关注“顶层标签”
所以我们要在R4的标签转发表中,找到一个条目,关注入向标签是:1025
通过以上信息可知:
我们需要将标签1025,交换成 3.然后从端口g0/0/1转发出去
即,就是将标签1025弹掉
此时的数据包结构是:
【2层头部】+【1027】+【IP头部】+数据+【2层头部效验和】
5.数据包从R4发送出来,到了R5后,R5能够辨别出:当前收到的数据包时一个“标签”包;
所以R5应该查找自己本地的“标签转发表”
此时,该数据包仅仅携带了1个标签
所以我们要在R5的标签转发表中,找到一个条目,关注入向标签是:1027
通过以上信息可知:
应该讲数据包中的标签 1027干掉,因为对标签的出向动作设置的null(空)
但是,在这个标签转发条目中,又没有明确的说明“出端口”到底是谁?
仅仅是告诉我们应该去查找“虚拟路由表” - A56。
因为,前面的标签处理动作是NUll,所以现在的数据包应该是一个标准的“IP数据包”。
所以,我们应该查找虚拟路由器 A56的路由表,信息如下:
按照上面同样的过程:
R6返回给10.10.1.1的数据包,也是可以顺利返回给R1的。
---------------------------------------------------------------------------------------------------------------------------------------------------
接下来,我们需要将VPN客户B的总公司和分公司之间的路由,搞通!
并且,我们在公司和运营商之间的链路上启用OSPF协议,进程号规定为 78
配置如下:
通过上面的操作:
R7的10.10.7.7/32,就可以发送到R8上;
为了能够让R8 的路由,发送到 R7上。
所以,我们继续下面的配置:
MPLS-VPN之域间VPN
配置思路:Option-A
1.配置AS100
-接口IP地址
-配置OSPF
-配置MPLS
-配置PE-ASBR之间的MP-IBGP邻居关系
2.配置 AS200
-配置接口IP地址
-配置OSPF
-配置MPLS
-配置PE-ASBR之间的 MP-IBGP 邻居关系
3.配置CE-R7
-配置接口IP地址
4.配置CE-R8
-配置接口IP地址
5.配置PE-CE之间
-配置OSPF协议,确保PE-CE之间可以互相学习路由
6.配置ASBR-ASBR之间
7.测试R7和R8之间的回环口的互通
配置命令:
-------------------------------------------------------------------------------------------------------------------
CE-R7的基本配置:
PE-CE之间使用OSPF协议,规划区域为0 ;
并且在PE上使用的 OSPF 进程号为 2;
此时,就能够获得从CE-R7学习过来的路由条目:10.10.7.7/32
此时,就能够获得从CE-R7学习过来的路由条目:10.10.8.8/32
此时,在ASBR-R3的虚拟路由器A中,可以看到通过MP-IBGP学习过来的路由条目;
此时,在ASBR-R4的虚拟路由器A中,可以看到通过MP-IBGP学习过来的路由条目;
------------------------------------------------------------------------------------------------------------------------
此时,我们需要思考的是:在ASBR-R3 和 ASBR-R4之间是如何传递这些VPN客户的路由的。
在该拓扑中,为了简化,我们在 ASBR-ASBR之间使用“静态路由”的方式。
@在 ASBR-R3上添加“虚拟路由器A”中的静态路由,去往 10.10.8.8/32
IP route-static VPN-instance A 10.10.8.8 32 192.168.34.4
@配置 ASBR-R3 上的出向 RT ,然后将VPN-instance A 的静态路由,宣告进入到MP-BGP
----------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
最终,在R7上面进行连通性测试:
<R7> ping -a 10.10.7.7 10.10.8.8 ,结果是通的!
-------------------------------------------------------------------------------------------------------------------------------
以上数据包的流程分析:10.10.7.7-------->10.10.8.8
------>disply mpls lsp verbose
....................
Out-Label : 1025 -----使用该转发条目出去的时候,标签使用1025
Token : 0x3 -----等于 Tunnel ID
......................
6.携带着2层标签的数据吧,发送给了 R5 ,此时R5仅仅关注 顶层标签 1024,查找标签转换表中的入向标签为1024的转发条目:
R7----IP包---R1---标签包-(2个标签)--R2----标签包(1个标签)---R3----IP包----R4----标签包(2个标签)----R5-----标签包(1个标签)-----R6-----IP包---R8
------------------------------------------option-B------------------------------------------------------
上述的拓扑中,R7要核R8通信我们需要做以下配置:
-在ASBR之间传递VPN客户路由:之前的方法叫做Option-A
1.在ASBR上,为vpn客户创建虚拟路由器
2.在ASBR之间,链路需要键入到虚拟路由器中
2.在ASB之间的虚拟路由器之间,传递路由
优点:
-配置简单,好理解
缺点:
-ASBR设备的开销非常大,如果R1这边有很多个VPN客户,那么R1上就需要创建很多个vpn实例,R3(ASBR)也要创建这么多个vpn实例来接收vpn路由。
-ASBR之间需要连接大量的互联链路,每个虚拟路由器都需要1个
特点:
1.ASBR之间传递的是IPV4路由,转发的标准的IP数据包,不支持标签
2.一个运营商可以看做是另外一个运营商的VPN客户(vrf-to-vrf)
针对上述的ASBR之间存在的“缺点”,我们建议:
在ASBR之间的“1个”链路上,同时传输多个“vpn客户”的路由:
此时,有可能面临的问题是“在同一个链路上”,如何区分不同的vpn客户的路由?
那么,我们为不同的VPN客户的路由,添加一个RD。
所以,我们需要在ASBR的一个链路上,需要传输的是:RD_IPV4路由
也就是所谓的vpnv4路由
所以,言外之意,我们需要在ASBR之间建立一个MP-BGP邻居关系
通过这一个邻居关系,同时传递多个VPN客户的路由
同时,既然我们再ASBR之间建立的MP-BGP邻居关系
所以,我们就不需要在ASBR上创建很多个VPN-instance了
但是,每个PE将VPN客户的路由通过MP-IBGP邻居关系传递到ASBR的时候,
都是携带着 vpn-target,如果我们在ASBR上不创建 vpn-instance ,就会导致 ASBR 因为 policy vpn-target,
不接收 vpn客户的路由
所以,在该解决方案中,我们必须得在ASBR上,关掉vpn-instance 的policy vpn-target(过滤策略)
最终:
我们在ASBR之间:
1. 建立的MP-EBGP邻居关系
2.在ASBR上,不需要创建 vpn-instance 了
3.在ASBR上,关掉vpnv4路由的 RT过滤策略
4. 最终在 ASBR之间,传递的是带有标签的数据包
配置:
通过上述的配置,ASBR之间可以建立MP-EBGP邻居关系
但是,
CE-R7 通过 ospf 传递路由给PE-R1 ;
PE-R1 通过 MP-IBGP 传递路由给 ASBR-R3 ;
此时, ASBR-R3 因为收到的是一个VPNV4路由,并且默认情况下需要对这种路由执行“RT过滤策略”
导致,ASBR-R3 本地因为没有配置vpn-instance ,更没有入向RT
所以,ASBR-R3 不接收 PE-R1传递过来的VPNV4路由
为了解决该问题,我们再ASBR-R3上,关闭掉vpnv4路由默认的“RT过滤策略”
命令如下:
同时,我们在ASBR-R4 也能看到从R3学习过来的路由;
但是,ASBR-R4连接ASBR-R3的接口,不支持“标签数据包的转发”
所以,我们在 ASBR-R4 连接ASBR-R3的接口上,开启MPLS就可以了;
此时,CE-R7也能收到CE-R8的路由,测试两者之间,可以正常互通!
总结:
底层标签,是分配给VPNV4路由使用的,是通过MP-BGP 协议分配的;
是由“传输vpnv4”的路由MP-BGP邻居路由器分配的;
顶层标签,是分配给 ipv4(IGP)路由使用的;是通过LDP协议分配的;
是由“传输IPV4”的路由IGP(ospf/isis)邻居路由器分配的;
Option-B:特点
在ASBR之间传递VPN客户路由:
1. 在ASBR中间传递的是VPNV4路由
2.在ASBR上不需要创建虚拟路由器
3.在ASBR上需要关闭“RT”过滤策略
4.在ASBR之间的链路,要启用MPLS
缺点:
ASBR这种设备同时扮演了“路由传递”和“数据转发”的动作;为了 实现不同的AS之间的VPN客户的路由传递,则必须确保
每个ASBR必须拥有自己AS内的所有的VPN客户的路由。
所以,ASBR的压力是非常大的,面临着不断增加的VPN客户,ASBR就会成为“瓶颈”。
方案:
我们系统“路由传递”和“数据转发”这两个活儿能够在ASBR上区分开。
例如:
在每个ASB内存在大量IBGP邻居关系的时候,为了简化内部BGP架构肯定需要部署“路由反射器-RR”,即每个内部邻居都会和RR建立IBGP
邻居,既然如此,我们可以将每个PE设备都和RR建立VPNV4邻居,这样的话,VPNv4邻居关系中,RR就可以同时拥有该AS内的所有的
PE上的各种VPN客户的各种路由条目。
那样的话,我们直接在不同的AS中的RR之间,建立MP-BGP邻居,
传递vpnv4路由,就可以了。
此时的ASBR,仅仅负责vpn客户之间的数据包转发。
那么,这种在“不同的AS的RR之间,建立MP-EBGP邻居,传递vpnv4路由”的方案,称之为“Option-C”
-----------------------------------------------Option-C1--------------------------------------------------
配置思路:
确保R2和R5之间的回环口可以互通;
即要将 AS 100的内部路由和AS 200 的内部路由,互相传递。
不同的AS 之间的IPV4路由,常用的传递方式IPV4 BGP
通过以上配置,R2和R5就可以互相学习到对方的loopback 0
然后,接下来在两者之间,建立一个vpnv4 的MP-EBGP邻居关系。
但是,上述的RR-R2和RR-R5,都没有与自己AS内的,连接VPN客户的PE设备建立MP-BGP邻居,
所以,我们现在让RR-R2和PE-R1建立邻居;RR-R5 和 PE-R6 建立邻居。
同时,我们需要关注的是:ASBR之间曾经建立的VPNV4的邻居可以删除,仅仅保留IPV4的BGP邻居关系。
此时,两边的路由就可以互相学习了!!!
但是,两边的数据包依然是无法互通,原因:R2和R5建立邻居时所使用的回环口的路由条目,是没有标签的。
因为,这两个回环口的路由,是通过普通的IPV4的bgp协议来分配的。
无论是LDP,还是MP-BGP,都不会为IPv4的BGP路由分配标签。
为了能够让这两个路由都有标签,我们只能通过“人为的操作”,即使用路由策略。
比如:我们希望AS100的ASBR-R3 将路由10.10.2.2/32通过BGP传递给R4的时候,添加标签:
同时,R4传输给R5的时候,也可以添加标签。
通过上面的配置,我们就可以在R5的IPV4的BGP的数据库中,查看到10.10.2.2/32
是有标签的。
然后,我们希望AS200的ASBR-R4将路由10.10.5.5/32通过BGP传递给R3的时候,添加标签的同时,R3传输给R2的时候,也可以添加标签。
如果想查看10.10.2.2/32 和 10.10.5.5/32的BGP 路由的标签
可以在R2/R3/R4/R5上,通过以下命令查看:
display bgp routing-table label ------->查看的数据库中带着标签的BGP路由条目
此时10.10.7.7 和10.10.8.8是可以互通的!
---------------------------------------Option-C2-------------------------------------------
在上述的Option-C1方案中,我们在两个AS的RR之间,建立vpnv4邻居关系
关键的问题是:
我们需要在AS之间,通过普通的ipv4 BGP,互相传递双方的 RR 的回环口路由。
但是,为了最终的 VPN 客户数据通信,我们需要确保这两个回环口的路由,得是有“标签”的。
因为,传递这个路由的时候,使用的是BGP协议;所以默认情况下,没办法为 BGP路由产生标签。
所以,我们在IPv4 BGP 邻居之间传递路由的时候,通过策略的方式,为路由产生,并且发送标签信息。
那么,如此一来,就必须有一个前提:
AS内部以及AS之间,存在大量的 ipv4 BGP邻居关系。
如果,我们将上述方案中“AS内部都使用BGP”来简化一下,即:仅仅在AS之间使用BGP,在AS内部没有BGP。
在AS内部,仅仅是通过 IGP 协议通信,在AS 之间依然通过BGP通信。
所以,我们在 AS 之间,依然是通过对BGP协议使用策略的方法,产生并传递标签;
但是,我们在AS内部,通过 LDP 为 ASBR之间传递的 BGP路由分配标签,就可以了
当然,LDP 默认情况下,是不会为BGP路由分配标签的。
但是,我们可以额外开启 LDP 为 BGP 分配标签的功能。
这种解决方案,叫做:Option-C2
配置命令:
@每个 ASBR 从对端的 AS 收到路由以后,引入到IGP 协议中,确保自己的AS的RR可以收到路由。
@通过上述的操作, RR-R2 和 RR-R5 都可以学习到对方的路由,但是这些路由是没有标签的。
此时,通过BGP协议,从R4学习过来的10.10.5.5/32,就可以发送给R2 ,并且都有标签信息了。
ASBR-R4:
mpls
lsp-trigger bgp-label-route ---> 让 LDP 协议,为那些曾经带着标签的BGP路由产生标签信息;
此时,通过 BGP 协议,从R3 学习过来的 10.10.2.2/32,就可以发送给 R5 ,并且都有标签信息了。
-------------------------------------------------------------------------------------------------------------------------
PE-CE 之间的路由协议 之 OSPF
@ domain -id : 用来标识和区分不同的域;影响不同的VPN站点之间的路由是通过几类LSA表示的;
默认情况下,我们在PE设备上的VPN-instance中启用的OSPF协议,是没有domain-id,也可以将其称为null,或者0.0.0.0;
PE-CE之间如果是OSPF协议的话,VPN客户站点的OSPF路由属性信息,会携带到vpnv4 路由的BGP属性中,到了对端的PE,
就可以通过其中的一个参数 doamin-id来与自己本地的虚拟路由器中的OSPF进程设置的 domain-id来比较;
如果两者相同,则对端的VPN客户路由,以3类LSA的形式进入到本地虚拟路由器;
如果两者不相同,则会以5类LSA的形式进入到本地的虚拟路由器。
为了体现domain-id的作用下面我们在R8上将引入到OSPF 2中的静态路由的类型改为1 ,cost改为88:
[R8-OSPF-2]import-route direct type 1 cost 88
然后在R6上查看链路的信息:display ospf lsdb ase 88.1.1.0
【R6】display bgp vpnv4 all routing-table 88.1.1.0
#domain-id,用于确定 不同站点之间传递路由时,LSA的类型;相同就是3类;不同就是5/7类
#OSPF RT ,表示的是该路由当前在自己的站点内是什么类型的LSA;
0.0.0.0,表示的是该路由当年所在的站点中的OSPF区域号;
5 ,表示的是该路由当年所在的站点中的LSA的类型,
但是对于5/7类LSA而言,分为type 1 和 type 2;
1 ,表示的是该路由当年在自己的站点内是5类LSA中的type 2 ; 0表示type 1
#OSPF ROUTER ID ,表示的是该路由所在的站点内的 PE 设备的 OSPF router-id ;
环路和次优路径
当PE-CE之间运行的协议为OSPF的时候,并且一个CE同时连接着同一个AS多个PE的时候,此时就有可能形成OSPF路由环路
为了防止路由环路的发生,我们在使用OSPF的两种属性来防止环路:
1.DN ,使用于 3/5/7类LSA;
当PE设备(ABR/ASBR)向CE产生LSA的时候,都会将DN设置为1 ;
那么,同时连接着CE的另外一个PE,一旦受到一个CE发送过来的LSA,并且发现其中的DN为1,
此时知道:这个LSA当时是由其他的PE刚刚从MPLS-VPN骨干网传递给CE的;
现在,PE为了防止CE的这个路由,再次通过自己返回到 MPLS-VPN骨干网,
所以,就不会使用这种DN为1 的LSA来计算路由。
2.VPN route , 仅仅适用于 5/7 类 LSA ,因为只有5/7 类的LSA才可以设置 tag 。
当PE 向 CE 发送OSPF 路由的时候,我们可以通过以下三种方法为 5/7类的LSA设置 tag:
-import-route 后面直接跟 tag 字段,设置tag值
-route-tag 后面跟tag值
-default tag ,后面跟tag值
那么这种带着tag数值的LSA,就会通过CE 传递到另外一个PE设备上。此时的PE就会使用本地的 vpn-instance 中运行的 OSPF协议中
设置的 route-tag 数值和收到的 LSA 中的tag数值比较:
-如果相同,则直接不使用这个LSA来计算路由,从而防止环路
-如果不同,则可以使用这个LSA来计算路由。
------------------------------------------MCE----------------------------------------
MCE:(multi-vpn-instace CE)
通常情况下,我们是在PE设备上创建多个vpn-instance,为的是区分不同的VPN客户的路由。
但是,这种技术,我们也可以使用在vpn客户公司的边缘设备-----CE上。
目的就是为:在节省设备开销的情况下,通过一个设备区分不同的业务流量,从而实现对数据的保护。
一旦在CE设备上,也使用了vpn-instance,并且,我们再CE 和 PE之间使用的路由协议依然是OSPF。
那么此时的PE和CE就都变成了ABR。
所以,运营商的PE设备,再将路由发送给CE的时候,将DN设置为1.
但是,MCE此时也是ABR,那么久会检查这个DN bit,从而不能使用该LSA计算路由。
结果,PE和CE 之间,能够正常传递LSA, 但是没办法计算路由。
为了解决该问题,我们可以在MCE设备上,使用以下命令:
PE-CE 之 OSPF 次优路径
案例:
背景描述:
当PE-CE 之间是OSPF协议的时候,一定要确保在VPN客户的公司网络中,区域0,一定要是连续的。
即,如果我们在PE-CE之间使用了 OSPF区域中,那么在VPN客户的公司内部,就不建议再次使用区域0了。
如果我们PE-CE之间使用的不是区域0,是其他的非骨干区域。
那么,如果我们在VPN客户公司内部存在的区域0,那么就必须得通过PE-CE之间的区域建立一个虚链路,
确保:
vpn客户的公司内部网络中,仅仅允许存在一个区域0,并且是连续的。
如果,在一个vpn客户的不同站点的分公司内,我们使用的OSPF区域都是相同的,
并且,为了增加vpn站点之间的通信的可靠性,我们在VPN站点之间建立一个“备份链路/后门链路”
这样一来,当MPLS-VPN 业务出现故障以后,站点之间的流量,就可以通过后门链路进行通信。
但是,
当我们在VPN站点之间建立后门链路以后,站点之间的通信流量,后优先选择“后门链路”。
因为,
站点之间的 OSPF 路由,一旦通过 MPLS-vpn 超级骨干区域传递,到了对端的站点后,这些OSPF 路由,就会分别为3/5/7
类LSA的形式,进入到其他站点。
但是,
站点之间如果通过 后门链路 建立了OSPF邻居,那么站点之间传递的就直接是 1 类 LSA,
而,在OSPF协议中,不同类型的LSA 的优先级是不同的,优先级如下(一次降低):1>3>5>7
所以,
如果我们想让站点之间的链路真的作为“备份链路”出现,
那么我们必须经过MPLS-VPN 骨干网,也能学东西到 1类LSA
那么,
此时我们必须通过MPLS-VPN骨干网,也建立一个属于vpn客户网络中的相同的OSPF区域的邻居关系
在该案例中,我们在VPN客户网络中,使用的OSPF区域是 区域0.
所以,我们也需要跨越mpls-vpn 网,建立一个虚拟的链路,并且是属于OSPF区域0.这种跨越MPLS-VPN骨干网建立虚拟链路的技术,
称之为 sham-link
配置方法:
@在PE设备上,专门建立一个稳定的接口,用于OSPF sham-link 的建立
@在PE设备上,将回环口宣告进入到MP-BGP,确保回环口之间是可以互通的。
@在PE设备上,通过VPN-instance 中的OSPF 进程,建立OSPF sham-link;
@在VPN站点之间的后门链路的设备上,修改后门/备份链路的接口的cost(开销),改大;
配置命令:
此时,两个回环口,是可以互相ping通的。
<R1> ping -vpn-instace A -a 10.10.16.1 10.10.16.6
查看 sham-link的状态:
display ospf sham-link
此时,我们再次在R10上查看去往R11接口的IP地址,使用的路由下一跳IP地址是R7,不是R11。
<R10>display ip routing-table 10.10.11.11