Let's go ahead and jump right in, but be sure you have grabbed the MPLS Lab Topology and IP Address Scheme. If you have been following through from MPLS Parts I and II, you will want to modify your routing protocol to be OSPF, as that is what will be demonstrated in this article. I won't be going over the details of OSPF configuration here, as they are quite simple. The 2nd change we are going to make to all the routers in our MPLS topology is the addition of Loopback addresses in order to support consistent OSPF router-id configuration and also 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 MPLS labs as they become available. Now that all that is done, we are going to begin the configuration of MPLS Traffic Engineering. As stated in MPLS Part II, you will need to make sure Cisco Express Forwarding - 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#
On each MPLS device participating in MPLS Traffic Engineering you will need to enable MPLS 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#
The next step we are going to take in this demonstration is to enable each MPLS device's interface to support an RSVP-based MPLS 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 devices 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#
The next thing we are going to do is 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 are going to do the same thing on MPLS7. The relevant portion of the running config of MPLS7 is shown below:
ip explicit-path name GCA enable
next-address 172.16.37.3
next-address 172.16.13.3
next-address 172.16.13.1
next-address 10.0.0.1
!
ip explicit-path name GFDBA enable
next-address 172.16.67.6
next-address 172.16.46.6
next-address 172.16.46.4
next-address 172.16.24.4
next-address 172.16.24.2
next-address 172.16.12.2
next-address 172.16.12.1
next-address 10.0.0.1
!
ip explicit-path name GEA enable
next-address 172.16.57.5
next-address 172.16.15.5
next-address 172.16.15.1
next-address 10.0.0.1
Ok. So far we have enabled MPLS Traffic Engineering support for all of our devices. We have configured OSPF support for MPLS Traffic Engineering, and now we have defined the traffic engineering paths through the MPLS network. Now, it is time for us to begin building the tunnels. This is really pretty simple, but it is also a very powerful tool to use in controlling the flow of traffic through your network. We begin by creating a tunnel interface, setting the destination, encapsulation, defining an MPLS path, and specifying the relative load each path will take, as shown here (note we are creating three 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:
interface Tunnel1
ip unnumbered Loopback0
tunnel destination 10.0.0.1
tunnel mode mpls traffic-eng
tunnel mpls traffic-eng priority 7 7
tunnel mpls traffic-eng bandwidth 100
tunnel mpls traffic-eng path-option 1 explicit name GCA
tunnel mpls traffic-eng load-share 10
no routing dynamic
!
interface Tunnel102
ip unnumbered Loopback0
tunnel destination 10.0.0.1
tunnel mode mpls traffic-eng
tunnel mpls traffic-eng priority 7 7
tunnel mpls traffic-eng bandwidth 100
tunnel mpls traffic-eng path-option 1 explicit name GFDBA
tunnel mpls traffic-eng load-share 10
no routing dynamic
!
interface Tunnel103
ip unnumbered Loopback0
tunnel destination 10.0.0.1
tunnel mode mpls traffic-eng
tunnel mpls traffic-eng priority 7 7
tunnel mpls traffic-eng bandwidth 100
tunnel mpls traffic-eng path-option 1 explicit name GEA
tunnel mpls traffic-eng load-share 10
no routing dynamic
So now we move on to verifying our tunnels have come up as we expected. We do that with the following command:
MPLS1#show mpls traffic-eng tunnels brief
Signalling Summary:
LSP Tunnels Process: running
RSVP Process: running
Forwarding: enabled
Periodic reoptimization: every 3600 seconds, next in 125 seconds
Periodic auto-bw collection: disabled
TUNNEL NAME DESTINATION UP IF DOWN IF STATE/PROT
MPLS1_t7 10.0.0.7 - Fa1/0 up/up
MPLS1_t702 10.0.0.7 - Fa1/1 up/up
MPLS1_t703 10.0.0.7 - Fa2/0 up/up
MPLS7_t1 10.0.0.1 Fa1/0 - up/up
MPLS7_t102 10.0.0.1 Fa1/1 - up/up
MPLS7_t103 10.0.0.1 Fa2/0 - up/up
Displayed 3 (of 3) heads, 0 (of 0) midpoints, 3 (of 3) tails
It looks like all THREE of our tunnels are up. Now is the time I throw a small little wrench into the situation. We'll start by looking at the MPLS Forwarding Table, also known as the Label Forwarding Information Base or LFIB for the tunnel's destination endpoint. This is shown below:
MPLS1#sho mpls forwarding-table 10.0.0.7
Local Outgoing Prefix Bytes tag Outgoing Next Hop
tag tag or VC or Tunnel Id switched interface
32 32 10.0.0.7/32 0 Fa2/0 172.16.15.5
32 10.0.0.7/32 0 Fa1/0 172.16.13.3
What? Where is the third tunnel path? Well, since the LFIB relies on the FIB, let's look at the FIB. Again, this is below:
MPLS1#show ip cef 10.0.0.7 detail
10.0.0.7/32, version 58, epoch 0, per-destination sharing
0 packets, 0 bytes
tag information set
local tag: 32
via 172.16.15.5, FastEthernet2/0, 0 dependencies
traffic share 1
next hop 172.16.15.5, FastEthernet2/0
valid adjacency
tag rewrite with Fa2/0, 172.16.15.5, tags imposed: {32}
via 172.16.13.3, FastEthernet1/0, 0 dependencies
traffic share 1
next hop 172.16.13.3, FastEthernet1/0
valid adjacency
tag rewrite with Fa1/0, 172.16.13.3, tags imposed: {32}
0 packets, 0 bytes switched through the prefix
tmstats: external 0 packets, 0 bytes
internal 0 packets, 0 bytes
Ok. That does it. 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#show ip route 10.0.0.7
Routing entry for 10.0.0.7/32
Known via "ospf 1", distance 110, metric 3, type intra area
Last update from 172.16.15.5 on FastEthernet2/0, 00:22:54 ago
Routing Descriptor Blocks:
* 172.16.15.5, from 10.0.0.7, 00:22:54 ago, via FastEthernet2/0
Route metric is 3, traffic share count is 1
172.16.13.3, from 10.0.0.7, 00:22:54 ago, via FastEthernet1/0
Route metric is 3, traffic share count is 1
Well, shux, that didn't do me much good, other than to demonstrate the dependence of the LFIB on the FIB, and the FIB on the routing table. You will notice in all of the above commands that these are all physical interfaces - none of them are the tunnel interfaces. We have to cause 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#
NNOOWW let's verify our configurations as we did earlier. Again, let's start by viewing the LFIB:
MPLS1#sho mpls forwarding-table 10.0.0.7
Local Outgoing Prefix Bytes tag Outgoing Next Hop
tag tag or VC or Tunnel Id switched interface
32 Pop tag [T] 10.0.0.7/32 0 Tu7 point2point
Pop tag [T] 10.0.0.7/32 0 Tu702 point2point
Pop tag [T] 10.0.0.7/32 0 Tu703 point2point
[T] Forwarding through a TSP tunnel.
View additional tagging info with the 'detail' option
Awesome! We have three paths now to the destination endpoint. To take a closer look, I'm opting now to see the detailed view:
MPLS1#sho mpls forwarding-table 10.0.0.7 detail
Local Outgoing Prefix Bytes tag Outgoing Next Hop
tag tag or VC or Tunnel Id switched interface
32 Pop tag 10.0.0.7/32 0 Tu7 point2point
MAC/Encaps=14/18, MRU=1512, Tag Stack{30}, via Fa1/0
CA020ADC001CCA000ADC001C8847 0001E000
No output feature configured
Per-destination load-sharing, slots: 0 3 6 9 12
Pop tag 10.0.0.7/32 0 Tu702 point2point
MAC/Encaps=14/18, MRU=1512, Tag Stack{32}, via Fa1/1
CA010ADC001CCA000ADC001D8847 00020000
No output feature configured
Per-destination load-sharing, slots: 1 4 7 10 13
Pop tag 10.0.0.7/32 0 Tu703 point2point
MAC/Encaps=14/18, MRU=1512, Tag Stack{31}, via Fa2/0
CA040ADC001CCA000ADC00388847 0001F000
No output feature configured
Per-destination load-sharing, slots: 2 5 8 11 14
This view offers information about the physical interfaces used, and which slots are used in each tunnel for traffic distribution among the tunnels. Now THAT is some good stuff. We know it is working now, but we are going to go ahead and view the FIB to solidify our understanding of the relationship between the LFIB and the FIB. The FIB is shown below:
MPLS1#show ip cef 10.0.0.7 detail
10.0.0.7/32, version 63, epoch 0, per-destination sharing
0 packets, 0 bytes
tag information set
local tag: 32
via 10.0.0.7, Tunnel7, 0 dependencies
traffic share 1
next hop 10.0.0.7, Tunnel7
valid adjacency
tag rewrite with Tu7, point2point, tags imposed: {30}
via 10.0.0.7, Tunnel702, 0 dependencies
traffic share 1
next hop 10.0.0.7, Tunnel702
valid adjacency
tag rewrite with Tu702, point2point, tags imposed: {32}
via 10.0.0.7, Tunnel703, 0 dependencies
traffic share 1
next hop 10.0.0.7, Tunnel703
valid adjacency
tag rewrite with Tu703, point2point, tags imposed: {31}
0 packets, 0 bytes switched through the prefix
tmstats: external 0 packets, 0 bytes
internal 0 packets, 0 bytes
And finally we view the routing table, which shows the relationship between the FIB and the Layer 3 Engine below:
MPLS1#show ip route 10.0.0.7
Routing entry for 10.0.0.7/32
Known via "ospf 1", distance 110, metric 3, type intra area
Last update from 10.0.0.7 on Tunnel703, 00:09:26 ago
Routing Descriptor Blocks:
* 10.0.0.7, from 10.0.0.7, 00:09:26 ago, via Tunnel7
Route metric is 3, traffic share count is 1
10.0.0.7, from 10.0.0.7, 00:09:26 ago, via Tunnel702
Route metric is 3, traffic share count is 1
10.0.0.7, from 10.0.0.7, 00:09:26 ago, via Tunnel703
Route metric is 3, traffic share count is 1
The final thing we are going 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. I'm not giving the answer to this away here, but keep it in mind. This topology was chosen to bring different potential issues to your attention. Check it out:
MPLS1#traceroute 10.0.0.7 probe 3
Type escape sequence to abort.
Tracing the route to 10.0.0.7
1 172.16.12.2 [MPLS: Label 32 Exp 0] 112 msec
172.16.15.5 [MPLS: Label 31 Exp 0] 96 msec
172.16.13.3 [MPLS: Label 30 Exp 0] 96 msec
2 172.16.24.4 [MPLS: Label 32 Exp 0] 88 msec
172.16.57.7 92 msec
172.16.37.7 96 msec
I hope you've enjoyed all that has been provided here. If you deal with MPLS, I'm sure you will find it useful. Thanks, and goodnight.



2 comments:
Brilliant!
Hi Joe,
Hope you remember me...
Its really great... very detailed post... not sure where are you at your studies... but please feel free to contact me if you need any thing...
Devang Patel
www.mplsplus.com
Post a Comment