Multiprotocol Label Switching (MPLS) Traffic Engineering
In this MPLS article we will look at MPLS Traffic Engineering. Before getting too far into this I want to point out that Multiprotocol Label Switching traffic engineering does not support by all routing protocols. If you plan to deploy MPLS traffic engineering you are going to be limited to using OSPF, or ISIS. With that, we have to depart from the routing protocol implementation used in Multiprotocol Label Switching part II, which was mistakenly EIGRP.
Let’s jump right in, but be sure you have grabbed the MPLS Lab Topology and IP Address Scheme. If you have followed through from Multiprotocol Label Switching Parts I and II, you will want to modify your routing protocol to be OSPF, as we will be using OSPF in this article. I won’t be going over the details of OSPF configuration here, as they are quite simple. The 2nd change we have to make to all the routers in our MPLS topology is the addition of Loopback addresses to support consistent OSPF router-id configuration and also in order to support the end points of our MPLS traffic engineering tunnels. The IP scheme for the Loopback addresses is as follows:
MPLS1: 10.0.0.1/32
MPLS2: 10.0.0.2/32
MPLS3: 10.0.0.3/32
MPLS4: 10.0.0.4/32
MPLS5: 10.0.0.5/32
MPLS6: 10.0.0.6/32
MPLS7: 10.0.0.7/32
Be sure to advertise these addresses via OSPF, as they will need to be globally routable for the tunnels that we are creating, and to support future Multiprotocol Label Switching labs as they become available. Now that all that is done, we are going to begin the configuration of Multiprotocol Label Switching Traffic Engineering. As stated in MPLS Part II, you will need to make sure CEF is enabled. It can be enabled as follows:
MPLS1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
MPLS1(config)#ip cef
MPLS1(config)#^Z
MPLS1#
With every Multiprotocol Label Switching device participating in MPLS Traffic Engineering you will need to enable Multiprotocol Label Switching Traffic Engineering support as follows:
MPLS1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
MPLS1(config)#mpls traffic-eng tunnels
MPLS1(config)#^Z
MPLS1#
Moving on, we are now going to enable each Multiprotocol Label Switching device’s interface to support an RSVP-based Multiprotocol Label Switching Traffic Engineering Tunnel, which is done as follows:
MPLS1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
MPLS1(config)#int fa1/0
MPLS1(config-if)#mpls traffic-eng tunnels
MPLS1(config-if)#ip rsvp bandwidth 100
MPLS1(config-if)#^Z
MPLS1#
Now that the routers have been configured to support MPLS Traffic Engineering, we need to make sure our routing protocol is ready also. We are using OSPF in this example, so that is what we will show here:
MPLS1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
MPLS1(config)#router ospf 1
MPLS1(config-router)#mpls traffic-eng router-id Loopback0
MPLS1(config-router)#mpls traffic-eng area 0
MPLS1(config-router)#^Z
MPLS1#
Next we are going to define the paths that we want our traffic to take through the network. I am going to show the configuration of three different paths here. I will make a point about these later, so please do all three of them for clarity later on.
MPLS1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
MPLS1(config)#ip explicit-path name ACG enable
MPLS1(cfg-ip-expl-path)#next-address 172.16.13.3
MPLS1(cfg-ip-expl-path)#next-address 172.16.37.3
MPLS1(cfg-ip-expl-path)#next-address 172.16.37.7
MPLS1(cfg-ip-expl-path)#next-address 10.0.0.7
MPLS1(cfg-ip-expl-path)#^Z
MPLS1#
MPLS1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
MPLS1(config)#ip explicit-path name ABDFG enable
MPLS1(cfg-ip-expl-path)#next-address 172.16.12.2
MPLS1(cfg-ip-expl-path)#next-address 172.16.24.2
MPLS1(cfg-ip-expl-path)#next-address 172.16.24.4
MPLS1(cfg-ip-expl-path)#next-address 172.16.46.4
MPLS1(cfg-ip-expl-path)#next-address 172.16.46.6
MPLS1(cfg-ip-expl-path)#next-address 172.16.67.6
MPLS1(cfg-ip-expl-path)#next-address 172.16.67.7
MPLS1(cfg-ip-expl-path)#next-address 10.0.0.7
MPLS1(cfg-ip-expl-path)#^Z
MPLS1#
MPLS1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
MPLS1(config)#ip explicit-path name AEG enable
MPLS1(cfg-ip-expl-path)#next-address 172.16.15.5
MPLS1(cfg-ip-expl-path)#next-address 172.16.57.5
MPLS1(cfg-ip-expl-path)#next-address 172.16.57.7
MPLS1(cfg-ip-expl-path)#next-address 10.0.0.7
MPLS1(cfg-ip-expl-path)#^Z
MPLS1#
We do the same thing on MPLS7. The relevant portion of the running config of MPLS7 is shown below:
ipexplicit-pathnameGCAenable
next-address172.16.37.3
next-address172.16.13.3
next-address172.16.13.1
next-address10.0.0.1
ipexplicit-pathnameGFDBAenable
next-address172.16.67.6
next-address172.16.46.6
next-address172.16.46.4
next-address172.16.24.4
next-address172.16.24.2
next-address172.16.12.2
next-address172.16.12.1
next-address10.0.0.1
ipexplicit-pathnameGEAenable
next-address172.16.57.5
next-address172.16.15.5
next-address172.16.15.1
next-address10.0.0.1
Now we have enabled Multiprotocol Label Switching Traffic Engineering support for all of our routers. We have also configured OSPF support for Multiprotocol Label Switching Traffic Engineering, and now we have specified the traffic engineering paths through the MPLS network. With all that done it is time for us to begin building the tunnels. This is all very simple, but it is also a powerful tool to use in controlling the flow of traffic through your network. First, we create a tunnel interface, setting the destination, encapsulation, defining an Multiprotocol Label Switching path, and specifying the relative load each path will take, as shown here (note we are creating 3 tunnels, one for each of our paths):
MPLS1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
MPLS1(config)#interface Tunnel7
MPLS1(config-if)#ip unnumbered Loopback0
MPLS1(config-if)#tunnel destination 10.0.0.7
MPLS1(config-if)#tunnel mode mpls traffic-eng
MPLS1(config-if)#tunnel mpls traffic-eng priority 7 7
MPLS1(config-if)#tunnel mpls traffic-eng bandwidth 100
MPLS1(config-if)#tunnel mpls traffic-eng path-option 1 explicit name ACG
MPLS1(config-if)#tunnel mpls traffic-eng load-share 10
MPLS1(config-if)#^Z
MPLS1#
MPLS1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
MPLS1(config)#interface Tunnel702
MPLS1(config-if)#ip unnumbered Loopback0
MPLS1(config-if)#tunnel destination 10.0.0.7
MPLS1(config-if)#tunnel mode mpls traffic-eng
MPLS1(config-if)#tunnel mpls traffic-eng priority 7 7
MPLS1(config-if)#tunnel mpls traffic-eng bandwidth 100
MPLS1(config-if)#tunnel mpls traffic-eng path-option 1 explicit name ABDFG
MPLS1(config-if)#tunnel mpls traffic-eng load-share 10
MPLS1(config-if)#^Z
MPLS1#
MPLS1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
MPLS1(config)#interface Tunnel703
MPLS1(config-if)#ip unnumbered Loopback0
MPLS1(config-if)#tunnel destination 10.0.0.7
MPLS1(config-if)#tunnel mode mpls traffic-eng
MPLS1(config-if)#tunnel mpls traffic-eng priority 7 7
MPLS1(config-if)#tunnel mpls traffic-eng bandwidth 100
MPLS1(config-if)#tunnel mpls traffic-eng path-option 1 explicit name AEG
MPLS1(config-if)#tunnel mpls traffic-eng load-share 10
MPLS1(config-if)#^Z
MPLS1#
Here is the running configuration of the tunnel interfaces created on MPLS7, since that is where the endpoint of the tunnel is terminated:
interfaceTunnel1
ipunnumberedLoopback0
tunneldestination10.0.0.1
tunnelmodemplstraffic-eng
tunnelmplstraffic-engpriority77
tunnelmplstraffic-engbandwidth100
tunnelmplstraffic-engpath-option1explicitnameGCA
tunnelmplstraffic-engload-share10
noroutingdynamic
interfaceTunnel102
ipunnumberedLoopback0
tunneldestination10.0.0.1
tunnelmodemplstraffic-eng
tunnelmplstraffic-engpriority77
tunnelmplstraffic-engbandwidth100
tunnelmplstraffic-engpath-option1explicitnameGFDBA
tunnelmplstraffic-engload-share10
noroutingdynamic
interfaceTunnel103
ipunnumberedLoopback0
tunneldestination10.0.0.1
tunnelmodemplstraffic-eng
tunnelmplstraffic-engpriority77
tunnelmplstraffic-engbandwidth100
tunnelmplstraffic-engpath-option1explicitnameGEA
tunnelmplstraffic-engload-share10
noroutingdynamic
Let’s check to see if those tunnels have come up as we expected. We do that with the following command:
MPLS1#showmplstraffic-engtunnelsbrief
SignallingSummary:
LSPTunnelsProcess:running
RSVPProcess:running
Forwarding:enabled
Periodicreoptimization:every3600seconds,nextin125seconds
Periodicauto-bwcollection:disabled
TUNNELNAMEDESTINATIONUPIFDOWNIFSTATE/PROT
MPLS1_t710.0.0.7-Fa1/0up/up
MPLS1_t70210.0.0.7-Fa1/1up/up
MPLS1_t70310.0.0.7-Fa2/0up/up
MPLS7_t110.0.0.1Fa1/0-up/up
MPLS7_t10210.0.0.1Fa1/1-up/up
MPLS7_t10310.0.0.1Fa2/0-up/up
Displayed3(of3)heads,0(of0)midpoints,3(of3)tails
It looks like all THREE of our tunnels are up. But there is still one little problem. We’ll start by looking at the Multiprotocol Label Switching Forwarding Table, also known as the LFIB for the tunnel’s destination endpoint. This is shown below:
MPLS1#shomplsforwarding-table10.0.0.7
LocalOutgoingPrefixBytestagOutgoingNextHop
tagtagorVCorTunnelIdswitchedinterface
323210.0.0.7/320Fa2/0172.16.15.5
3210.0.0.7/320Fa1/0172.16.13.3
Hmmm?? Where is the third tunnel path? Well, since the LFIB relies on the Forwarding Information Base, let’s look at the Forwarding Information Base. Again, this is below:
MPLS1#showipcef10.0.0.7detail
10.0.0.7/32,version58,epoch0,per-destinationsharing
0packets,0bytes
taginformationset
localtag:32
via172.16.15.5,FastEthernet2/0,0dependencies
trafficshare1
nexthop172.16.15.5,FastEthernet2/0
validadjacency
tagrewritewithFa2/0,172.16.15.5,tagsimposed:32
via172.16.13.3,FastEthernet1/0,0dependencies
trafficshare1
nexthop172.16.13.3,FastEthernet1/0
validadjacency
tagrewritewithFa1/0,172.16.13.3,tagsimposed:32
0packets,0bytesswitchedthroughtheprefix
tmstats:external0packets,0bytes
internal0packets,0bytes
Huh. Yeah, let’s see what is going on. The FIB is received from the Layer 3 Engine in the control plane. Let’s have a look at the routing table to see what on earth is going on.
MPLS1#showiproute10.0.0.7
Routingentryfor10.0.0.7/32
Knownvia”ospf1″,distance110,metric3,typeintraarea
Lastupdatefrom172.16.15.5onFastEthernet2/0,00:22:54ago
RoutingDescriptorBlocks:
*172.16.15.5,from10.0.0.7,00:22:54ago,viaFastEthernet2/0
Routemetricis3,trafficsharecountis1
172.16.13.3,from10.0.0.7,00:22:54ago,viaFastEthernet1/0
Routemetricis3,trafficsharecountis1
Well, that did not do us any good, other than to demonstrate the dependence of the LFIB on the FIB, and the FIB on the routing table. You should notice in all of the above commands that these are all physical interfaces – none of them are the tunnel interfaces. We have to force OSPF to use the tunnel interfaces in its calculations. We can do THAT by creating the following configuration on each tunnel interface:
MPLS1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
MPLS1(config)#int tunnel 7
MPLS1(config-if)#tunnel mpls traffic-eng autoroute announce
MPLS1(config-if)#^Z
MPLS1#
MPLS1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
MPLS1(config)#int tunnel 702
MPLS1(config-if)#tunnel mpls traffic-eng autoroute announce
MPLS1(config-if)#^Z
MPLS1#
MPLS1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
MPLS1(config)#int tunnel 703
MPLS1(config-if)#tunnel mpls traffic-eng autoroute announce
MPLS1(config-if)#^Z
MPLS1#
MPLS7#conf t
Enter configuration commands, one per line. End with CNTL/Z.
MPLS7(config)#int tunnel 1
MPLS7(config-if)#tunnel mpls traffic-eng autoroute announce
MPLS7(config-if)#^Z
MPLS7#
MPLS7#conf t
Enter configuration commands, one per line. End with CNTL/Z.
MPLS7(config)#int tunnel 102
MPLS7(config-if)#tunnel mpls traffic-eng autoroute announce
MPLS7(config-if)#^Z
MPLS7#
MPLS7#conf t
Enter configuration commands, one per line. End with CNTL/Z.
MPLS7(config)#int tunnel 103
MPLS7(config-if)#tunnel mpls traffic-eng autoroute announce
MPLS7(config-if)#^Z
MPLS7#
Alrighty. Let’s verify our configs as we did earlier. Again, let’s start by viewing the LFIB:
MPLS1#shomplsforwarding-table10.0.0.7
LocalOutgoingPrefixBytestagOutgoingNextHop
tagtagorVCorTunnelIdswitchedinterface
32Poptag[T]10.0.0.7/320Tu7point2point
Poptag[T]10.0.0.7/320Tu702point2point
Poptag[T]10.0.0.7/320Tu703point2point
[T]ForwardingthroughaTSPtunnel.
Viewadditionaltagginginfowiththe’detail’option
Awesome! We have 3 paths now to the destination endpoint. To take a closer look, I’m opting now to see the detailed view:
MPLS1#shomplsforwarding-table10.0.0.7detail
LocalOutgoingPrefixBytestagOutgoingNextHop
tagtagorVCorTunnelIdswitchedinterface
32Poptag10.0.0.7/320Tu7point2point
MAC/Encaps=14/18,MRU=1512,TagStack30,viaFa1/0
CA020ADC001CCA000ADC001C88470001E000
Nooutputfeatureconfigured
Per-destinationload-sharing,slots:036912
Poptag10.0.0.7/320Tu702point2point
MAC/Encaps=14/18,MRU=1512,TagStack32,viaFa1/1
CA010ADC001CCA000ADC001D884700020000
Nooutputfeatureconfigured
Per-destinationload-sharing,slots:1471013
Poptag10.0.0.7/320Tu703point2point
MAC/Encaps=14/18,MRU=1512,TagStack31,viaFa2/0
CA040ADC001CCA000ADC003888470001F000
Nooutputfeatureconfigured
Per-destinationload-sharing,slots:2581114
This view offers details about the interfaces used, and which slots are used in each tunnel for traffic distribution among the tunnels. Now THAT is some good stuff. We now know it is working, but we are going to go ahead and view the Forwarding Information Base to solidify our knowledge of the relationships between the LFIB and the Forwarding Information Base. The Forwarding Information Base is shown below:
MPLS1#showipcef10.0.0.7detail
10.0.0.7/32,version63,epoch0,per-destinationsharing
0packets,0bytes
taginformationset
localtag:32
via10.0.0.7,Tunnel7,0dependencies
trafficshare1
nexthop10.0.0.7,Tunnel7
validadjacency
tagrewritewithTu7,point2point,tagsimposed:30
via10.0.0.7,Tunnel702,0dependencies
trafficshare1
nexthop10.0.0.7,Tunnel702
validadjacency
tagrewritewithTu702,point2point,tagsimposed:32
via10.0.0.7,Tunnel703,0dependencies
trafficshare1
nexthop10.0.0.7,Tunnel703
validadjacency
tagrewritewithTu703,point2point,tagsimposed:31
0packets,0bytesswitchedthroughtheprefix
tmstats:external0packets,0bytes
internal0packets,0bytes
Now we view the routing table, which shows the relationship between the FIB and the Layer 3 Engine below:
MPLS1#showiproute10.0.0.7
Routingentryfor10.0.0.7/32
Knownvia”ospf1″,distance110,metric3,typeintraarea
Lastupdatefrom10.0.0.7onTunnel703,00:09:26ago
RoutingDescriptorBlocks:
*10.0.0.7,from10.0.0.7,00:09:26ago,viaTunnel7
Routemetricis3,trafficsharecountis1
10.0.0.7,from10.0.0.7,00:09:26ago,viaTunnel702
Routemetricis3,trafficsharecountis1
10.0.0.7,from10.0.0.7,00:09:26ago,viaTunnel703
Routemetricis3,trafficsharecountis1
And now we finally get to do here is a traceroute with the probe option set to 3, since we have 3 paths. Notice the results, and do some reflection. It’s not difficult to see and I’m not giving the answer to this away here, but keep it in mind. This topology was chosen to bring some potential issues to your attention. Check it out:
MPLS1#traceroute10.0.0.7probe3
Typeescapesequencetoabort.
Tracingtherouteto10.0.0.7
1172.16.12.2[MPLS:Label32Exp0]112msec
172.16.15.5[MPLS:Label31Exp0]96msec
172.16.13.3[MPLS:Label30Exp0]96msec
2172.16.24.4[MPLS:Label32Exp0]88msec
172.16.57.792msec
172.16.37.796msec
I hope you’ve enjoyed all that has been provided here. If you deal with Multiprotocol Label Switching, I’m sure you will find it useful. Thanks, and goodnight.