首先完成整个拓扑的IP地址的配置,保证直连互通。IP地址规划如下:
然后完成OSPF网络中的互通,然后在R1,R2,R5,R6上配置BGP,IBGP邻居关系通告回环口建立,并在R1上和R6上通告其对应的回环口路由,这时候产生了路由黑洞。
首先报文进行正常的传输,用普通的ip报头进行封装,也就是进行传统的IP转发,R1首先查看R1的路由表:
去往6.6.6.6的下一跳为12.12.12.2。然后查看去往12.12.12.2/24的路由条目:(直连,可达,出接口是g0/0/0)。
我们将ping包发往目的MAC地址为12.12.12.2的MAC地址,当R2收到ping包以后,查看路由表:
去往6.6.6.6的下一跳为5.5.5.5,我们就需要看5.5.5.5是否可达:
可以看到最终去往6.6.6.6的下一跳为23.23.23.3。
然后查看去往23.23.23.0/24的路由条目:(直连,可达,出接口是g0/0/1)
R2发送的ping包发往目的的MAC地址为23.23.23.3的MAC地址,当R3收到ping包以后,查看路由表:
发现R3上并没去往6.6.6.6的路由条目,所以我们将ping包丢掉了,这也就是路由黑洞,因为在AS 200中路由器没有使用IBGP的全互联,而没有建立IBGP关系的路由器是不可能获得到达1.1.1.1/32和2.2.2.2/32的BGP的路由(只会进行相应的传输报文信息,自己不会学习到),造成了通信到一半就丢包这一情况。我们可以使用MPLS来解决路由黑洞的问题。
我们需要在路由黑洞的区域配置MPLS,使IP路由转发变成使用标签转发。路由黑洞存在的区域R2到R5之间,我们从R2到R5依次配置:
R2:
首先指定MLPS的lsr-id,因为默认情况下,Transport Address为LSR的Router-id也就是LSR-id,设备会通过这个IP地址进行标签的分发,发送保持活跃的报文和LDP会话的初始化报文,所以必须要互相TCP能通行。而OSPF协议已经完成了各路由器回环口的互相通信。如果不开起此功能是无法开启MPLS功能的。
[R2]mpls lsr-id 2.2.2.2
配置完成了lsr-id以后,我们需要在R2上开启mpls:
[R2]mpls
因为MPLS需要借助LDP才能形成动态的分发标签的功能(静态的我们这里不进行拓展),所以要全局配置的模式下打开LDP:
[R2]mpls ldp
配置完成以后,然后进入属于MPLS区域的接口:g0/0/1
将接口启动MPLS和LDP协议,打开了LDP功能的接口此接口来发送LDP的hello包建立LDP的邻居关系:
interface GigabitEthernet0/0/1
mpls
mpls ldp
同理,我们在R3上进行配置:
[R3]mpls lsr-id 3.3.3.3
[R3]mpls
[R3]mpls ldp
R3在MPLS中有两个接口:g0/0/0和g0/0/1
interface GigabitEthernet0/0/0
mpls
mpls ldp
interface GigabitEthernet0/0/0
mpls
mpls ldp
配置完成后我们用相同的方法配置R4:
[R4]mpls lsr-id 4.4.4.4
[R4-mpls]mpls
[R4]mpls ldp
进入接口配置:
interface GigabitEthernet0/0/0
mpls
mpls ldp
interface GigabitEthernet0/0/0
mpls
mpls ldp
配置完成后我们配置R5:
[R5]mpls lsr-id 5.5.5.5
[R5]mpls
[R5]mpls ldp
进入属于MPLS的接口:
interface GigabitEthernet0/0/0
mpls
mpls ldp
现在查看R2,R3,R4,R5之间的LDP邻居关系建立是否成功:
在R3和R4上查看即可,因为LDP没有进行特殊的配置只能和直连的路由器建立邻居关系(使用的是组播报文),而R3和R4处于MPLS隧道的中间,会跟两边的路由器建立LDP关系:
R3上:(使用命令dis mpls ldp peer)
可以看到对方ldp邻居的传输地址,自己从哪个接口发送hello报文发现的此邻居
R4上:
邻居关系建立成功。
将所有在MPLS区域中的路由器配置完成后,我们继续用回环口ping 1.1.1.1 ping 6.6.6.6。
此步完成以后,还是无法进行通信,那是因为在华为路由器之中,如果流量原来使用的是传统IP转发,你要修改成用标签转发,需要将流量引入MPLS中,就是在两边的LER(Lable边缘路由器中将流量进行引入)。
在本拓扑中,需要在R2和R5中配置:
R2和R5上:
[R2]route recursive-lookup tunnel
[R5]route recursive-lookup tunnel
配置完成后我们继续进行ping测试:(成功了,说明MPLS协议起到了相应的作用)
我们从R1的回环口1.1.1.1 ping 6.6.6.6进行一次分析,首先1.1.1.1作为R1的回环口,当去往6.6.6.6时时会查看自己的fib表(因为封装的帧头协议字段为0x0800,表示是ipv4的报文,会经过fib表进行相应的转发):dis fib可以查看fib表:
去往6.6.6.6的路由条存,下一跳为12.12.12.2,并且是由g0/0/0接口发送出去的发送出去,流量发送出去以后,就会到达R2,因为协议字段仍然为0x0800,会首先查看fib表进行相应的转发:
这里我们会发现,多出来了一个隧道的ID,这个ID就是表示需要进入相应的MPLS隧道进行转发了,这时候我们就会查看lfib表:dis mpls lsp verbose(查看的是详细的信息)。
我们根据隧道的编号进行匹配,匹配到了这个条目,我们可以看到很多信息,比如入标签为空,出标签为1026,出接口为g0/0/1,在这条隧道中,这个设备的角色为Ingress,表示的是进入的设备,动作是PUSH,表示是一个加标签的过程,于是相应的流量就会加上1026的标签从出接口g0/0/1发送标签除去。
补充:如果不添加参数verbose查看的信息如下:
这时候我们会发现,除了与自己直连的2.2.2.2/32的条目,其他条目都有2个条目,这是因为一个入标签为空的条目是给自己发送报文到达目的地进行使用的,而一个有入标签和出标签的条目是给转发报文使用的。另外默认自己直连的标签为3(是一个特殊的标签),如果传给了别人,别人就知道出接口就是下一条了,会进行标签提前弹出的操作,减少的链路的负担。另外需要说,虽然去往5.5.5.5的条目有两个,但是实际上有出标签的条目是没有作用的,这是因为本台设备不可能转发别人发出的带标签的流量到目的地,只能是自己发出的或者是没有打标签的流量到目的地。
当然,流量会通过R3的g0/0/0接收,然后查看数据真的协议字段,会发现为0x8847,表示为MPLS封装的报文,这个时候就会交给相应MPLS模块进行处理,这时候会查看打上的标签为1026,然后我们查看LFIB表,根据流量标签和自己的条目的入标签进行对应,然后对应到相应的条目进行转发:
标签的动作为SWAP,表示标签交换,打上的新的出标签为1024,出接口为G0/0/1,另外这台设备在这个隧道里面的雷神为Transit,表示为中间节点
同理,R4收到了带有标签的报文后查看对应的LFIB条目:
虽然我们发现标签的操作为SWAP(交换),设备的类型为Transit,但是,我们发现了他的出标签为3,这是一个特殊的标签,代表下一跳为隧道的出口了(这个标签为下一跳产生R4的,表示目的地5.5.5.5与自己直连,然后发送给了R3),这就代表着我们需要将标签直接进行剥离,然后按照表中的出接口g0/0/1发送出去,我们可以进行抓包查看:在R3,R4的g0/0/1上抓包(为了进行对比),用R1的回环口PING R6的回环口:
抓包信息:
对比我们发现R4上的报文没有带有任何标签信息,说明已经进行了提前剥离标签的操作,既然标签都剥离了,那么R5收到后处理就简单了,因为数据真的协议类型字段为0x0800,表示为普通的IP数据包,自己查找FIB表进行转发了,目的地址为6.6.6.6,条目是有的:
这里需要注意的是,隧道ID为0,表示不用查找LFIB表了。流量通过接口g0/0/1发送给R6,R6收到以后,同样会查找FIB表:
下一跳为127.0.0.1,表示为自己的本地回环口,交给本地进行处理,这样一来,就完成了一次单向的通信,回来的过程同理,这里不进行过多的解释。
如果我们在R4收到的不是3这个标签,而是一个1024以上的正常标签,我们会直接按照LFIB表的动作进行操作:
然后打上出标签发送从对应的接口发送给R5,R5收到以后,同样会用数据的标签和自己的入标签进行对应,然后查看到相应的LFIB条目:
我们会发现,设备在本条隧道的类型为Egress,表示出接口,标签的动作为POP,也就是去掉标签,没有出接口,只有一个127.0.0.1本地回环口的下一跳,然后会发送带本地回环口进行处理,因为没有带有标签了,就会查找相应的FIB表进行转发,从这里开始又和之前下一跳弹出标签的一致了,不进行多余的演示了。
总结:
在进行了下一跳的提前剥离的情况下:
在隧道的入口,会查找两张表,FIB和LFIB表(会进行路由查找和标签添加),在中间节点会只查找LFIB表(只需要标签交换),在出接点只需要查看FIB(进行路由的查找)。
在没有进行下一跳的提前剥离的情况下:
在隧道入口设备和中间设备查看的表项都不会改变的,只有出隧道的设备会多查看LFIB表,然后才会查看FIB进行相应的转发。
修改为显示空标签:
mpls
label advertise explicit-null
因为值作用于新的MPLS,重启后才生效。再在R4上查看:修改成功
在R4的g0/0/1接口上抓包查看(仍然带有标签0)。
配置LDP会话建立的认证
在R4和R5上配置:
[R4-mpls-ldp]md5-password cipher 5.5.5.5 huawei
[R5-mpls-ldp]md5-password cipher 4.4.4.4 huawei
抓包查看:(加密信息在TCP的Option字段中)
配置标签分配控制方式,和标签发布方式
配置标签分配控制方式: 只需在一条LSP的上游设备上配置(模拟器上不能配置,只需要在MPLS LDP模式下配置,作用于整个LSR设备)
配置标签发布方式:向下游请求时对方才发送对应标签,例如在以FEC:2.2.2.2的下游R2为例:
[R2-GigabitEthernet0/0/1]mpls ldp advertisement dod //在下游设备连接上游的接口上配置
[R3-GigabitEthernet0/0/0]mpls ldp advertisement dod //在上游设备连接下游的接口上配置
在R3上查看,修改成功,表示R2会按R3发送的需求向R3。
配置策略lsp-trigger all
[R5-mpls]lsp-trigger all //在R5上配置为所有IGP条目分配入标签
其实我们只看到,多为了直连的条目分发了标签,为什么没有为其他IGP条目分配标签呢?这是因为标签分配的方式是有序的,没有得到下游设备发送标签是无法向为上游分配标签的。所以只有自己直连的条目会分配。