Here is a step by step configuration example to configure a specific path using MPLS-TE tunnels.
This was originally going to be a post about MPLS Fast Reroute. However two things happened, one the post became excessively long and two, I realised none of my simulated routers support MPLS FRR. Also, the Cisco Feature Navigator is lying to me again (FRR is supported on a 6500, FN claims this isn’t so.)
So, without further ado, here is how to configure a specific path using MPLS Traffic Engineering Tunnels.
Basic info. I have created this in GNS3 using 2961s. We have 3 routers, shown below.
Routers have loopback addresses and point to point addresses on their FastEthernet interfaces. IP addresses are shown above.
The routers will be configured to run OSPF as their IGP, OSPF is process 10, all interfaces are in area 0. This should be pretty straightforward for most of you. You could also use IS-IS as your IGP. These are the only two IGPs that support MPLS-TE.
Here is the config on Odin:
Odin(config)# *Mar 1 00:08:43.851: %SYS-5-CONFIG_I: Configured from console by console Odin(config)#router ospf 10 Odin(config-router)#net 0.0.0.0 255.255.255.255 area 0 Odin(config-router)# *Mar 1 00:09:00.291: %OSPF-5-ADJCHG: Process 10, Nbr 192.0.2.3 on FastEthernet1/0 from LOADING to FULL, Loading Done Odin(config-router)# *Mar 1 00:09:04.287: %OSPF-5-ADJCHG: Process 10, Nbr 192.0.2.2 on FastEthernet0/0 from LOADING to FULL, Loading Done
Note, I don’t actually recommend using a 0.0.0.0/0 for your OSPF network statement. I’m just doing it in the lab here. In production networks I generally prefer to either use /32 subnet masks, or masks that reflect the interface subnet. Not that it really matters.
Confirming OSPF is running properly:
Odin#sho ip ospf neigh Neighbor ID Pri State Dead Time Address Interface 192.0.2.3 1 FULL/DR 00:00:31 198.51.100.6 FastEthernet1/0 192.0.2.2 1 FULL/DR 00:00:35 198.51.100.2 FastEthernet0/0
Again, going to rush through the basic MPLS config. Enable MPLS globally and on the relevant interfaces. Here it is on Odin.
Odin#conf t Enter configuration commands, one per line. End with CNTL/Z. Odin(config)#mpls ip Odin(config)#int f0/0 Odin(config-if)#mpls ip Odin(config-if)#int f1/0 Odin(config-if)#mpls ip *Mar 1 00:07:43.547: %LDP-5-NBRCHG: LDP Neighbor 192.0.2.2:0 (1) is UP *Mar 1 00:07:49.623: %LDP-5-NBRCHG: LDP Neighbor 192.0.2.3:0 (2) is UP
LDP comes up, so all looks pretty happy. You can verify with show mpls ldp neighbor if you wish.
On top of the very basic MPLS configuration, you need to enable MPLS Traffic Engineering. There is two parts to this. One part is enabling it on your MPLS interfaces. The second part is enabling MPLS Traffic Engineering in your IGP.
Configuration on Njord is:
Njord(config)# Njord(config)#mpls traffic-eng tunnels Njord(config)# Njord(config)#interface FastEthernet0/0 Njord(config-if)#mpls traffic-eng tunnels Njord(config-if)#interface FastEthernet1/0 Njord(config-if)#mpls traffic-eng tunnels Njord(config-if)#router ospf 10 Njord(config-router)# mpls traffic-eng router-id Loopback0 Njord(config-router)# mpls traffic-eng area 0
The configuration is exactly the same on all three routers.
Quick check to see that traffic engineering is enabled on the interfaces and working nicely. I recommend checking out the below command, it has a lot of interesting details.
Njord#show mpls traffic-eng link-management summary System Information:: Links Count: 2 Flooding System: enabled IGP Area ID:: ospf area 0 Flooding Protocol: OSPF Flooding Status: data flooded Periodic Flooding: enabled (every 180 seconds) Flooded Links: 2 IGP System ID: 192.0.2.3 MPLS TE Router ID: 192.0.2.3 IGP Neighbors: 2 Link ID:: Fa0/0 (198.51.100.6) Link Status: Physical Bandwidth: 100000 kbits/sec Max Res Global BW: 0 kbits/sec (reserved: 100% in, 100% out) Max Res Sub BW: 0 kbits/sec (reserved: 100% in, 100% out) MPLS TE Link State: MPLS TE on, RSVP on, admin-up, flooded Inbound Admission: reject-huge Outbound Admission: allow-if-room Admin. Weight: 1 (IGP) IGP Neighbor Count: 1 Link ID:: Fa1/0 (198.51.100.10) Link Status: Physical Bandwidth: 100000 kbits/sec Max Res Global BW: 0 kbits/sec (reserved: 100% in, 100% out) Max Res Sub BW: 0 kbits/sec (reserved: 100% in, 100% out) MPLS TE Link State: MPLS TE on, RSVP on, admin-up, flooded Inbound Admission: reject-huge Outbound Admission: allow-if-room Admin. Weight: 1 (IGP) IGP Neighbor Count: 1
For our purposes, we are just glad there are two interfaces there. If you were reserving bandwidth for a specific purpose then this command is the bombdiggity.
Now I am only going to create a tunnel. The tunnel will go from Thor directly to Njord, once it’s up and running we’ll play around with it a bit to force the traffic to go through Odin. Remember, tunnels are unidirectional. So this LSP will have no bearing on traffic coming back to Thor.
Configuration for the tunnel on Thor:
Thor(config)#interface Tunnel10 Thor(config-if)# ip unnumbered Loopback0 Thor(config-if)# mpls ip Thor(config-if)# tunnel destination 192.0.2.3 Thor(config-if)# tunnel mode mpls traffic-eng Thor(config-if)# tunnel mpls traffic-eng autoroute announce Thor(config-if)# tunnel mpls traffic-eng path-option 1 dynamic
I will explain those commands shortly. But for now, if everything is working nicely, this tunnel should be visible on all MPLS routers is traverses. There are three kinds of routers, head-end routers, midpoint routers and tail-end routers. In this case it’s only Thor and Njord, head and tail, but if it was a multi-hop tunnel you can use this command on any router in LSP – the midpoints. Here it is on Njord (the tail end).
Njord#show mpls traffic-eng tunnels brief Signalling Summary: LSP Tunnels Process: running RSVP Process: running Forwarding: enabled Periodic reoptimization: every 3600 seconds, next in 1989 seconds Periodic auto-bw collection: disabled TUNNEL NAME DESTINATION UP IF DOWN IF STATE/PROT Thor_t10 192.0.2.3 Fa1/0 - up/up Displayed 0 (of 0) heads, 0 (of 0) midpoints, 1 (of 1) tails
Straight away, you will see traffic being routed out this tunnel.
Thor#show ip route 192.0.2.3 Routing entry for 192.0.2.3/32 Known via "ospf 10", distance 110, metric 2, type intra area Last update from 192.0.2.3 on Tunnel10, 00:13:18 ago Routing Descriptor Blocks: * 192.0.2.3, from 192.0.2.3, 00:13:18 ago, via Tunnel10 Route metric is 2, traffic share count is 1
So what did those commands do? We’ll go through them one by one.
mpls ip: Not strictly necessary for what we are doing. If the tunnel were to end on a P router (as opposed to the PE in our scenario) this would be needed.
tunnel destination: Sets the tunnel destination. Cisco were unusually cryptic with this command.
tunnel mpls traffic-eng autoroute announce: Announces this tunnel into the IGP. If you wanted to only route traffic into the tunnel via a static route or PBR then you wouldn’t need to do this. In our case it tells OSPF that the interface is present (and 126.96.36.199 is directly connected on the other end).
mpls traffic-eng path-option 1 dynamic: You can have multiple paths, hence the number 1. The CSPF goes through these sequentially until it finds a usable path. I will do a post on having multiple paths later. Dynamic creates the path dynamically, the other option is explicit. Which we’ll have a play with now.
Creating an explicit path:
Thor(config)#int tun 10 Thor(config-if)#$ traffic-eng path-option 1 explicit name ROUNDABOUT Thor(config-if)#ip explicit-path name ROUNDABOUT Thor(cfg-ip-expl-path)#next-address 198.51.100.1 Thor(cfg-ip-expl-path)#next-address 198.51.100.6
These commands are fairly intuitive. Note the next addresses are the far end of the point-to-point links – like if you were doing a static route out a point to point. The cool thing is you can now see the tunnel is signalled through the mid-point (Odin).
Odin#show mpls traffic-eng tunnels LSP Tunnel Thor_t10 is signalled, connection is up InLabel : FastEthernet0/0, 19 OutLabel : FastEthernet1/0, implicit-null RSVP Signalling Info: Src 192.0.2.2, Dst 192.0.2.3, Tun_Id 10, Tun_Instance 12 RSVP Path Info: My Address: 198.51.100.5 Explicit Route: 198.51.100.6 192.0.2.3 Record Route: NONE Tspec: ave rate=0 kbits, burst=1000 bytes, peak rate=0 kbits RSVP Resv Info: Record Route: NONE Fspec: ave rate=0 kbits, burst=1000 bytes, peak rate=0 kbits
How cool is that. That command tells you the ingoing and outgoing labels, interfaces, originating router and end point.
So now traffic from Thor to Njord is routed through Odin. Note the traffic is now asymmetric. The return path is still direct. The other option for your explicit path is instead of defining hop-by-hop ip addresses, you define exclusions. For example:
Thor(config-if)#$ traffic-eng path-option 1 explicit name ROUNDABOUT Thor(cfg-ip-expl-path)#exclude-address 198.51.100.10
In our example, gives the exact same results. But in a much larger network might be more useful for a backup path, as the path is still dynamically configured and can use all other available paths.
I think this post is more than long enough so we’ll stop here. There is a lot more to MPLS-TE than this obviously and I hope to make more posts on it in the near future.