Adjusting Local Preference Values
Problem
You want to change the Local Preference values to control which routes you use.
Solution
There are two ways to adjust Local Preference values on a router. The first method changes the Local Preference values for every route distributed into iBGP from this router:
Router1#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
Router1(config)#router bgp 65500
Router1(config-router)#bgp default local-preference 200
Router1(config-router)#exit
Router1(config)#end
Router1#
The second method uses route maps to give finer granularity control over which routes get what Local Preference values:
Router1#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
Router1(config)#ip prefix-list LOW_LP_PREFIXES seq 10 permit 172.22.0.0/16
Router1(config)#route-map LOCALPREF permit 10
Router1(config-route-map)#match ip address prefix-list LOW_LP_PREFIXES
Router1(config-route-map)#set local-preference 50
Router1(config-route-map)#exit
Router1(config)#route-map LOCALPREF permit 20
Router1(config-route-map)#exit
Router1(config)#router bgp 65500
Router1(config-router)#neighbor 192.168.1.5 remote-as 65510
Router1(config-router)#neighbor 192.168.1.5 route-map LOCALPREF in
Router1(config-router)#exit
Router1(config)#end
Router1#
Discussion
When BGP routers within an AS exchange information about a particular route using iBGP, they include the Local Preference value. All of the routers in the AS are then able to use this value to decide how to weight this route versus other BGP routes to the same destination. BGP consults the Local Preference value early in the route selection process, before even the AS Path attribute. So this provides an extremely useful and flexible way of forcing particular routes to use particular paths. Routers do not include Local Preference information when exchanging routes through eBGP connections.
A common example would be if you had two connections to an external network and you wanted to ensure that one was the primary path and the other was a backup. Suppose further that one of the routers in the AS handles the primary path and a second router handles the secondary path. The first example shows how to globally increase the Local Preference values of all routes received by one of these routers:
Router1(config)#router bgp 65500
Router1(config-router)#bgp default local-preference 200
Now all of the external routes that this router handles will have a Local Preference value of 200. If you can reach a particular prefix through more than one path, the other routers in this AS will prefer to use the one with the highest Local Preference value. The default Local Preference is 100.
To see how this works in practice, we will once again use the network shown in Figure 9-2. The following output shows two paths to the network 10.0.0.0/8. This router learned the first route through iBGP from another router. You can see from the LocPrf column that this route has the default Local Preference value of 100:
Router2#show ip bgp
BGP table version is 4, local router ID is 172.18.5.3
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
* i10.0.0.0 172.18.5.2 100 0 65510 65531 i
*> 192.168.2.5 0 65520 65531 i
Router2#
This router learned the second route through eBGP, so it doesn't have a Local Preference value. The router treats any missing Local Preference values as if they had the default value of 100. Note that although BGP has a route selection rule that prefers eBGP routes to iBGP routes, this rule is consulted after the Local Preference is, but for now the Local Preference values are equal. So, all other things being equal, this router prefers to use the more direct route that it learned itself, which is indicated by the ">" character at the beginning of the line.
Now we will change the default Local Preference value on the other router to 200, using the bgp default local-preference command as shown above:
Router2#show ip bgp
BGP table version is 4, local router ID is 172.18.5.3
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*>i10.0.0.0 172.18.5.2 200 0 65510 65531 i
* 192.168.2.5 0 65520 65531 i
Router2#
As you can see, the Local Preference value has changed to 200 for the iBGP route. So this router now prefers the iBGP route. You can see more detail by specifying the prefix with this command:
Router2#show ip bgp 10.0.0.0/8
BGP routing table entry for 10.0.0.0/8, version 4
Paths: (2 available, best #1, table Default-IP-Routing-Table)
Advertised to non peer-group peers:
192.168.2.5
65510 65531
172.18.5.2 from 172.18.5.2 (172.18.5.2)
Origin IGP, localpref 200, valid, internal, best
65520 65531
192.168.2.5 from 192.168.2.5 (172.21.1.1)
Origin IGP, localpref 100, valid, external
Router2#
This clearly shows that the router interprets the missing Local Preference value as 100 on this router. If we now change the default value on this router to 75, you can see that it will use this new value instead when the value is missing:
Router2#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
Router2(config)#router bgp 65500
Router2(config-router)#bgp default local-preference 75
Router2(config-router)#end
Router2#clear ip bgp *
Router2#show ip bgp 10.0.0.0/8
BGP routing table entry for 10.0.0.0/8, version 2
Paths: (2 available, best #2, table Default-IP-Routing-Table)
Advertised to non peer-group peers:
192.168.2.5
65520 65531
192.168.2.5 from 192.168.2.5 (172.21.1.1)
Origin IGP, localpref 75, valid, external
65510 65531
172.18.5.2 from 172.18.5.2 (172.18.5.2)
Origin IGP, localpref 200, valid, internal, best
Router2#
Notice that we had to clear the BGP peers and wait until they reconnected for this change to take effect. Also notice that, by chance, the router displays the routes in the opposite order. There is no particular significance to this ordering. The route that entered the AS via eBGP on this router (Router2) now has a Local Preference value of 75, while the route that entered via Router1 has a Local Preference of 200, which we configured earlier in this recipe.
You can also use route maps to define different Local Preference values for different individual routes. This gives you a finer granularity, even allowing you to manually balance the load between these links by forcing some routes through one path and the rest through the other path.
The second example shows how to use a route map to adjust Local Preference values:
Router1(config)#ip prefix-list LOW_LP_PREFIXES seq 10 permit 172.22.0.0/16
Router1(config)#route-map LOCALPREF permit 10
Router1(config-route-map)#match ip address prefix-list LOW_LP_PREFIXES
Router1(config-route-map)#set local-preference 50
Router1(config-route-map)#exit
Router1(config)#route-map LOCALPREF permit 20
Router1(config-route-map)#exit
Here we have defined a prefix list that just matches the prefix 172.22.0.0/16. Whenever the route map sees a route that matches this prefix list, it sets the Local Preference value for this route to 50.
We have included an empty clause at the end of the route map, which simply passes all other routes unchanged. Every route map ends with an implicit deny all. So if we didn't include this, the router would simply drop any prefixes that didn't match the first clause.
Then we invoke this rule by using the standard route-map option to the neighbor command:
Router1(config)#router bgp 65500
Router1(config-router)#neighbor 192.168.1.5 remote-as 65510
Router1(config-router)#neighbor 192.168.1.5 route-map LOCALPREF in
Notice that we are applying this route map to all incoming routes received from this specific eBGP peer. Now you can see that this particular route has a local preference value of 50:
Router1#show ip bgp 172.22.0.0/16
BGP routing table entry for 172.22.0.0/16, version 5
Paths: (2 available, best #2, table Default-IP-Routing-Table)
Flag: 0x208
Advertised to non peer-group peers:
192.168.1.5
65510 65531
192.168.1.5 from 192.168.1.5 (172.25.26.55)
Origin IGP, localpref 50, valid, external
65520 65531
172.18.5.3 from 172.18.5.3 (172.18.5.3)
Origin IGP, localpref 75, valid, internal, best
Router1#
Note also that the other iBGP router is still using the Local Preference value of 75 that we configured a moment ago.
Because this method used a route map, you can easily construct rules that would change the Local Preference values based on a large variety of different parameters. For example, you could match based on the AS Path, which is a technique that we will discuss in more detail in Recipe 9.10. You could do this to give a higher or lower Local Preference value, based on whether or not the route passes through a particular remote AS:
Router1(config)#ip as-path access-list 17 permit _65531_
Router1(config)#route-map LOCALPREF permit 25
Router1(config-route-map)#match as-path 17
Router1(config-route-map)#set local-preference 75
Router1(config-route-map)#exit