说明
在之前提到过跨域用Open A的方案来解决,可是Open A的缺点非常多,并且对于维护和设备性能都要很高的要求,由于那个是早期的解决方案,所以后续推出了Open B和Open C的解决方案,它们很好的解决了这些问题。
其实在于单域中***不会出现任何的问题,是因为标签都是连续性的,而不同ISP之间由于属于不同的企业,它们并不会和其他ISP之间建立LDP和IGP的邻居关系,这样防止内部信息被泄露了。所以给跨域的模型带来了很大的困难。 之前Open A是利用VRF来解决不同MPLS 域之间的连通,但是在ASBR之间传递的时候 纯属IP包过去,然后在压入双层标签,这样非常的不好。
Open B是在ASBR之间建立MPBGP邻居关系(***V4),这里路由可以批量更新了,并且***V4可以为客户分配标签,在Open B中建立MPBGP邻居关系后,会产生一条32位的主机路由,这是在cisco路由器上有的特性,就是因为这条32位的主机路由,才正好解决了这个模型的关键。那么是必让各自的MPLS ***域知道怎么去往地方的32位主机路由,或者是改变下一跳,因为不这样做的话,就导致下一跳不可达,比如MPLS *** AS1的PE1传递路由更新给ASBR1,ASBR1通过***V4传递给ASBR2,然后在传递给PE2,这是PE2的下一跳显示的是ASBR1的更新源地址,所以导致下一跳不可达,路由也不会传递给客户。 我们都知道在Ipv4 BGP中下一跳不可达的解决方便是next-hop-self,或者把这个地址重分布进IGP中 让下一跳可达, 在MPBGP中一样的,可以用这两个技术来解决,只是注意的是在MPBGP中用next-hop-self是改变了下一跳,那么它就会为改变了下一跳的路由分配标签。 另外默认情况下ASBR是不会建立VRF的,所以导致的情况是拒绝接收所以客户的路由,我们必须关掉这个RT检测功能,让它的路由可以正常接收。
这里环境跟Open A是一样的,除了ASBR不同以外,其余的基本配置都一样, ISP1 MPLS和 ISP2 MPLS底层是EIGRP,CE之间运行OSPF。 ASBR之间建立MPBGP邻居关系 (***V4)
Router-ISP1_PE(config)#int lo 0
Router-ISP1_PE(config-if)#ip add 1.1.1.1 255.255.255.255
Router-ISP1_PE(config)#int s1/1
Router-ISP1_PE(config-if)#ip add 12.1.1.1 255.255.255.0
Router-ISP1_PE(config-if)#no shut
ISP1_P(config)#int s1/1
ISP1_P(config-if)#ip add 12.1.1.2 255.255.255.0
ISP1_P(config-if)#no shut
ISP1_P(config-if)#int lo 0
ISP1_P(config-if)#ip add 2.2.2.2 255.255.255.255
ISP1_P(config-if)#int s1/2
ISP1_P(config-if)#ip add 23.1.1.1 255.255.255.0
ISP1_P(config-if)#no shut
Router-ISP1_ASBR(config)#int s1/2
Router-ISP1_ASBR(config-if)#ip add 23.1.1.2 255.255.255.0
Router-ISP1_ASBR(config-if)#no shut
Router-ISP1_ASBR(config-if)#int lo 0
Router-ISP1_ASBR(config-if)#ip add 3.3.3.3 255.255.255.255
Router-ISP1_CE(config)#int lo 0
Router-ISP1_CE(config-if)#ip add 1.1.1.1 255.255.255.255
Router-ISP1_CE(config)#int s1/0
Router-ISP1_CE(config-if)#ip add 192.168.1.1 255.255.255.0
Router-ISP1_CE(config-if)#no shu
先把ISP1的MPLS 和***打通,这里限制下标签的范围,到时候分析标签置换好分析。
Router-ISP1_PE(config)#mpls label range 100 199
Router-ISP1_PE(config)#mpls ldp router-id lo 0
Router-ISP1_PE(config)#int s1/1
Router-ISP1_PE(config-if)#mpls ip
ISP1_P(config)#mpls label range 200 299
ISP1_P(config)#mpls ldp router-id lo 0
ISP1_P(config)#int s1/1
ISP1_P(config-if)#mpls ip
ISP1_P(config-if)#int s1/2
ISP1_P(config-if)#mpls ip
Router-ISP1_ASBR(config)#mpls ldp router-id lo 0
Router-ISP1_ASBR(config)#mpls label range 300 399
Router-ISP1_ASBR(config)#
Router-ISP1_ASBR(config)#int s1/2
Router-ISP1_ASBR(config-if)#mpls ip
Router-ISP1_PE(config)#router eigrp 1
Router-ISP1_PE(config-router)#no auto-summary
Router-ISP1_PE(config-router)#network 12.1.1.1 0.0.0.0
Router-ISP1_PE(config-router)#network 1.1.1.1 0.0.0.0
ISP1_P(config)#router eigrp 1
ISP1_P(config-router)#no auto-summary
ISP1_P(config-router)#network 12.1.1.2 0.0.0.0
ISP1_P(config-router)#network 23.1.1.1 0.0.0.0
ISP1_P(config-router)#network 2.2.2.2 0.0.0.0
Router-ISP1_ASBR(config)#router eigrp 1
Router-ISP1_ASBR(config-router)#no auto-summary
Router-ISP1_ASBR(config-router)#network 23.1.1.2 0.0.0.0
Router-ISP1_ASBR(config-router)#network 3.3.3.3 0.0.0.
Router-ISP1_PE(config)#ip vrf A
Router-ISP1_PE(config-vrf)#rd 1:1
Router-ISP1_PE(config-vrf)#route-target 1:1
Router-ISP1_PE(config)#int s1/0
Router-ISP1_PE(config-if)#ip vrf forwarding A
Router-ISP1_PE(config-if)#ip add 192.168.1.2 255.255.255.0
Router-ISP1_PE(config-if)#no shut
Router-ISP1_PE(config)#router ospf 1 vrf A
Router-ISP1_PE(config-router)#router-id 192.168.1.2
Router-ISP1_PE(config-router)#network 192.168.1.2 0.0.0.0 a 0
Router-ISP1_PE(config-router)#redistribute bgp 1 subnets
Router-ISP1_CE(config)#router ospf 1
Router-ISP1_CE(config-router)#router-id 1.1.1.1
Router-ISP1_CE(config-router)#network 1.1.1.1 0.0.0.0 a 0
Router-ISP1_CE(config-router)#network 192.168.1.1 0.0.0.0 a
关于ASBR的VRF后续在创建,先把ISP1 和ISP2的***的路由搞定
Router-ISP1_PE(config)#router bgp 1
Router-ISP1_PE(config-router)#bgp router-id 1.1.1.1
Router-ISP1_PE(config-router)#no bgp default ipv4
Router-ISP1_PE(config-router)#neighbor 3.3.3.3 remote 1
Router-ISP1_PE(config-router)#neighbor 3.3.3.3 upda lo 0
Router-ISP1_PE(config-router)#address-family ***v4
Router-ISP1_PE(config-router-af)#neighbor 3.3.3.3 ac
Router-ISP1_PE(config-router)#address-family ipv4 vrf A
Router-ISP1_PE(config-router-af)#redistribute ospf 1
Router-ISP1_ASBR(config)#router bgp 1
Router-ISP1_ASBR(config-router)#bgp router-id 3.3.3.3
Router-ISP1_ASBR(config-router)#no bgp default ipv4-unicast
Router-ISP1_ASBR(config-router)#neighbor 1.1.1.1 remote 1
Router-ISP1_ASBR(config-router)#neighbor 1.1.1.1 upda lo 0
Router-ISP1_ASBR(config-router)#address-family ***v4
Router-ISP1_ASBR(config-router-af)#neighbor 1.1.1.1 ac
ISP1的***路由搞定了,这里ASBR不是作为PE存在,所以暂时不操作,把ISP2的基本搞定。
Router-ISP2_ASBR(config)#int s1/0
Router-ISP2_ASBR(config-if)#ip add 45.1.1.1 255.255.255.0
Router-ISP2_ASBR(config-if)#no shut
Router-ISP2_ASBR(config-if)#int lo 0
Router-ISP2_ASBR(config-if)#ip add 4.4.4.4 255.255.255.255
Router-ISP2_ASBR(config-if)#router eigrp 1
Router-ISP2_ASBR(config-router)#no auto-summary
Router-ISP2_ASBR(config-router)#network 45.1.1.1 0.0.0.0
Router-ISP2_ASBR(config-router)#network 4.4.4.4 0.0.0.0
ISP2_P(config)#int s1/0
ISP2_P(config-if)#ip add 45.1.1.2 255.255.255.0
ISP2_P(config-if)#no shut
ISP2_P(config-if)#int s1/1
ISP2_P(config-if)#ip add 56.1.1.1 255.255.255.0
ISP2_P(config-if)#no shut
ISP2_P(config-if)#int lo 0
ISP2_P(config-if)#ip add 5.5.5.5 255.255.255.255
ISP2_P(config-if)#router eigrp 1
ISP2_P(config-router)#no auto-summary
ISP2_P(config-router)#network 5.5.5.5 0.0.0.0
ISP2_P(config-router)#network 45.1.1.2 0.0.0.0
ISP2_P(config-router)#network 56.1.1.1 0.0.0.0
Router-ISP2_PE(config)#int s1/1
Router-ISP2_PE(config-if)#ip add 56.1.1.2 255.255.255.0
Router-ISP2_PE(config-if)#no shut
Router-ISP2_PE(config-if)#int lo 0
Router-ISP2_PE(config-if)#ip add 6.6.6.6 255.255.255.255
Router-ISP2_PE(config-if)#router eigrp 1
Router-ISP2_PE(config-router)#no auto-summary
Router-ISP2_PE(config-router)#network 56.1.1.2 0.0.0.0
Router-ISP2_PE(config-router)#network 6.6.6.6 0.0.0.0
基本地址配置和EIGRP的建立
Router-ISP2_ASBR(config)#mpls ldp router-id lo 0
Router-ISP2_ASBR(config)#mpls label range 400 499
Router-ISP2_ASBR(config)#int s1/0
Router-ISP2_ASBR(config-if)#mpls ip
ISP2_P(config)#mpls label range 500 599
ISP2_P(config)#mpls ldp router-id lo 0
ISP2_P(config)#int s1/0
ISP2_P(config-if)#mpls ip
ISP2_P(config-if)#int s1/1
ISP2_P(config-if)#mpls ip
Router-ISP2_PE(config)#mpls label range 600 699
Router-ISP2_PE(config)#mpls ldp router-id lo 0
Router-ISP2_PE(config)#int s1/1
Router-ISP2_PE(config-if)#mpls ip
MPLS完成
Router-ISP2_ASBR(config-if)#router bgp 2
Router-ISP2_ASBR(config-router)#bgp router-id 4.4.4.4
Router-ISP2_ASBR(config-router)#neighbor 6.6.6.6 remote 2
Router-ISP2_ASBR(config-router)#neighbor 6.6.6.6 upda lo 0
Router-ISP2_ASBR(config-router)#no bgp default ipv4-unicast
Router-ISP2_ASBR(config-router)#address-family ***v4
Router-ISP2_ASBR(config-router-af)#neighbor 6.6.6.6 activate
Router-ISP2_PE(config)#router bgp 2
Router-ISP2_PE(config-router)#bgp router-id 6.6.6.6
Router-ISP2_PE(config-router)#no bgp default ipv4-unicast
Router-ISP2_PE(config-router)#neighbor 4.4.4.4 remote 2
Router-ISP2_PE(config-router)#neighbor 4.4.4.4 upda lo 0
Router-ISP2_PE(config-router)#address-family ***v4
Router-ISP2_PE(config-router-af)#neighbor 4.4.4.4 activat
Router-ISP2_PE(config-router)#address-family ipv4 vrf A
Router-ISP2_PE(config-router-af)#redistribute ospf 1
Router-ISP2_PE(config)#ip vrf A
Router-ISP2_PE(config-vrf)#rd 1:1
Router-ISP2_PE(config-vrf)#route-target 1:1
Router-ISP2_PE(config-vrf)#int s1/2
Router-ISP2_PE(config-if)#ip vrf forwarding A
Router-ISP2_PE(config-if)#ip add 192.168.2.2 255.255.255.0
Router-ISP2_PE(config-if)#no shut
Router-ISP2_PE(config)#router ospf 1 vrf A
Router-ISP2_PE(config-router)#network 192.168.2.2 0.0.0.0 a 0
Router-ISP2_PE(config-router)#redistribute bgp 2 subnets
Router-ISP2_CE(config)#int s1/2
Router-ISP2_CE(config-if)#ip add 192.168.2.1 255.255.255.0
Router-ISP2_CE(config-if)#no shut
Router-ISP2_CE(config-if)#int lo 0
Router-ISP2_CE(config-if)#ip add 2.2.2.2 255.255.255.255
Router-ISP2_CE(config-if)#router ospf 1
Router-ISP2_CE(config-router)#router-id 2.2.2.2
Router-ISP2_CE(config-router)#network 2.2.2.2 0.0.0.0 a 0
Router-ISP2_CE(config-router)#network 192.168.2.1 0.0.0.0 a 0
这里ISP1 和ISP2的MPLS ***路由更新和底层都完成了,开始ASBR之间问题。
Router-ISP1_ASBR(config)#int s1/3
Router-ISP1_ASBR(config-if)#ip add 34.1.1.1 255.255.255.0
Router-ISP1_ASBR(config-if)#no shut
Router-ISP1_ASBR(config)#router bgp 1
Router-ISP1_ASBR(config-router)#neighbor 34.1.1.2 remote 2
Router-ISP1_ASBR(config-router)#address-family ***v4
Router-ISP1_ASBR(config-router-af)#neighbor 34.1.1.2 activate
这里接口属于global接口,把***V4给激活
Router-ISP2_ASBR(config)#int s1/3
Router-ISP2_ASBR(config-if)#ip add 34.1.1.2 255.255.255.0
Router-ISP2_ASBR(config-if)#no shut
Router-ISP2_ASBR(config-if)#router bgp 2
Router-ISP2_ASBR(config-router)#neighbor 34.1.1.1 remote 1
Router-ISP2_ASBR(config-router)#address-family ***v4
Router-ISP2_ASBR(config-router-af)#neighbor 34.1.1.1 ac
发现没有路由,之前说过 默认情况下 MPBGP是不会接收自身没有关于这些VRF信息的路由。所以关闭检测
Router-ISP1_ASBR(config-router)#no bgp default route-target filter
Router-ISP1_ASBR#clear ip bgp * soft
Router-ISP2_ASBR(config-router)#no bgp default route-target filter
Router-ISP2_ASBR#clear ip bgp * soft
在Router-ISP2_ASBR上有条去往34.1.1.1的32位主机路由,查看LIB表看分配了什么标签
只有本地标签400,没有关于远端分配的标签,如果在平时的话,没有远端分配的标签是会出现untagged动作的,但是这里不是,而是Pop。
它这个标签动作是自己分配的,这就是32位主机路由的特效,让标签不被全部弹出来。还会发现带有RT前缀的路由信息,它是由MPBGP传递过来的,这也是跨域模型中才会有,有这个标志 通常会要置换内层标签,并且压入外层标签。
发现下一跳不优,因为它们不知道怎么去往34.1.1.1,对应的Router-ISP1_PE上也会出现相对应的情况 不知道怎么去往34.1.1.2,解决办法有两个,一个是重分布32位主机路由到IGP,让路由可达,另外一个就是改变下一跳。 我们这把 ISP1_ASRB上做next-hop-self。在Router-ISP2_ASBR上做重分布。
Router-ISP1_ASBR(config)#router bgp 1
Router-ISP1_ASBR(config-router)#address-family ***v4
Router-ISP1_ASBR(config-router-af)#neighbor 1.1.1.1 next-hop-self
Router-ISP2_ASBR(config)#ip prefix-list Router-ISP1_ASBR permit 34.1.1.1/32
Router-ISP2_ASBR(config)#route-map Router-ISP1_ASBR permit 10
Router-ISP2_ASBR(config-route-map)#match ip address prefix-list Router-ISP1_ASBR
Router-ISP2_ASBR(config)#router eigrp 1
Router-ISP2_ASBR(config-router)#redistribute connected route-map Router-ISP1_ASBR metric 1500 100 255 1 1500
在Router-ISP1_ASBR上做next-hop-self,在ISP2上做重分布直连,做了个过滤 只让32位的主机路由进去,这时候32位的主机路由到达IGP协议里面,那么LDP就会为这条路由分配标签。 而Router-ISP1_ASBR是改变下一跳,所以MPBGP会为它分配标签。
ISP1的PE上看到的下一跳是3.3.3.3,也就是ASBR的
关于ISP2上看到的下一跳是34.1.1.1,这里没有任何的改变。
这样的结果导致,两边的标签动作可能不一样,分析下
1、Router-ISP2_CE发送一个去往1.1.1.1的IP包,交给PE
2、PE收到以后查看关于属于这个VRF的FIB表,
内层标签是306,我们可以从最简单的分析 因为限制了标签范围,所以这个肯定是关于Router-ISP1_ASBR的标签,为什么是它分配的呢,因为这条路由在Router-ISP2_ASBR收到以后传递给Router-ISP2_PE之间并没有改变下一跳,下一跳还是34.1.1.1,也就是Router-ISP1_ASBR的更新源接口,所以标签不会更改。 外层标签是关于怎么去往这个ASBR的,也就是重分布进IGP的34.1.1.1 ,502是LDP分配的标签。
3、P收到这标签以后,这里不会执行Pop动作,因为Router-ISP2_ASBR关于34.1.1.1 不是它本身产生的,它发现自己接口信息中跟本没有这条32位的信息,所以它不会向P发送Pop 3的信息,所以在P上是置换动作。502—400, 这里因该要注意
从抓包看 外层标签是400,内层标签306不变,双层标签交给Router-ISP2_ASBR
4、Router-ISP2_ASBR收到以后Pop动作,因为这个标签动作是它自身产生的,而不是对方告诉它的,这是因为32位主机路由的特点,如果这里用环回口建立邻居的话,标签就会出现递归,会导致通信失败。 这里Pop动作以后,剩下306的标签跟出接口S/13发送给ASBR
5、Router-ISP1_ASBR收到以后,306置换从104,之前提到过带有RT的路由信息,一般是要置换内层标签,然后打上外层的标签才能转发。因为这里104如果转发到P路由器,P路由器是没有客户路由的,它也没有关于104的任何标签信息,它有的只是关于这个104的下一跳信息,因为104是Router-ISP1_PE MPBGP分配给Router-ISP1_ASBR的。
由于ASBR上没有创建VRF,所以也不能查看FIB表看是否压入标签,这里可以用show mpls forwarding-tabole labels 306 detail来查看
内层104标签,外层201标签。
可以看到1.1.1.1这条路由,本地分配是306的标签,别人分配给我的是104标签,104就是内存标签,201是关于怎么去这个MPBGP的下一跳标签,也就是1.1.1.1的标签。
6、P路由器收到以后,执行Pop动作
7、Router-ISP1_PE收到以后,执行untagged 把标签信息全部弹出,把数据包交给CE1。
可以看出来ISP2执行的是重分布动作,所以内层标签一直是关于Router-ISP1_ASBR的,没有改变过。 可是从ISP1这边分析就不同了,因为改变了下一跳。
1、Router-ISP1_CE发送一个关于2.2.2.2的IP数据包交给PE。
2、PE收到以后查看FIB表。
内层标签是关于305的,因为在Router-ISP1_ASBR上是做了next-hop-slef的,所以是305分配的标签,改变了下一跳。 外层标签是200,是关于ASBR的下一跳标签信息。
3、这时候P路由是执行Pop动作的,在之前分析的到ISP1的时候可以发现,其实也可以从标签中看出来,因为是关于ASBR的
4、Router-ISP1_ASBR收到以后,305置换成406,之间发送给Router-ISP2_ASBR,这里是单层标签过去的
5、Router-ISP2_ASBR收到以后,压入的双层标签,内层标签是604,这个是Router-ISP2_PE分配的,这个跟单域MPLS ***一样,路由分配到PE在传递给另外个PE改变了下一跳。 外层标签500是关于怎么去PE的。
所以这里置换 406到604只是置换的内层标签,还需要压入外层标签、500 是去往6.6.6.6的
关于2.2.2.2 本地分配的标签是604
6、P路由器收到以后,执行Pop动作,剩下604的标签传递给PE
7、PE收到以后执行untagged ,弹出所有标签 把数据包传递给CE。
总结:Open B的方案,比Open A执行起来复杂一点,但是对于维护和设备性能要求就合理得多了,这里重分布和next-hop-self从实验中可以看出来,重分布比较好,因为它不需要ASBR在为每条路由分配标签。 缺点就是 ASBR的工作量还是很大,它必须要承载不同客户端的路由信息,如果这张网还是intenet,那么它还有公网的路由,这对于ASBR来说负担还是很重。 Open C方案很好的解决了这个问题。
本文首发于公众号:网络之路博客