BGP multihop - maximum-paths |
GNS3 Lab Topology - https://db.tt/7b430RhL
http://www.cisco.com/c/en/us/support/docs/ip/border-gateway-protocol-bgp/13762-40.html
Load balancing is an attempt to process traffic evenly across a network with multiple links.
Load balancing is a more "dynamic" concept in the sense that you want to actively balance the load across two or more active paths. Typically you want to spread it out as evenly as possible. Load balancing typically works via a dynamic protocol, such as OSPF, EIGRP, etc. At the hardware level you do it across port channels, and you can even tweak how you do it, whether it is per packet, per flow, etc.
Load sharing means one can split the traffic from a network to be transported by different routers (paths).
Load sharing is a term used when attempting to share some of the traffic across multiple links.Load sharing is more along what you do with BGP - you can manipulate traffic flows on a static basis, by doing local preference, weight for outbound decisions, and prepending or MED for inbound traffic manipulation(albeit, inbound traffic manipulation is always "best effort" unless your peer agrees to a policy - as they can always override whatever Path Attribute you're sending them).
Load balancing is next to impossible with BGP. BGP is not concerned with traffic load, delay, etc, it only cares about Path Attributes assigned to NLRIs (aka prefixes).
Very important fact to keep in mind is that any load-sharing/load-balancing configurations are UNI-directional, influencing traffic in one direction.
If the return traffic had to be balanced in the same manner, the same configuration would be needed in the opposite direction.
Sample config
Route 8.8.8.8/32 (AS8) is available via 2 equal-bandwidth parallel links (AS7): fa0/0 and fa0/1.
R9 will send packets to 8.8.8.8 via R7, and R7 will try to load-share the packets number.
R7
!R9
interface Loopback1
ip address 7.7.7.7 255.255.255.255
!
interface FastEthernet0/0
ip address 10.0.0.1 255.255.255.252
!
interface FastEthernet0/1
ip address 10.1.0.1 255.255.255.252
!
interface FastEthernet1/0
ip address 192.168.1.7 255.255.255.0
ip ospf 1 area 0
!
router ospf 1
log-adjacency-changes
redistribute bgp 7 subnets
!
router bgp 7
no synchronization
bgp log-neighbor-changes
network 7.7.7.7 mask 255.255.255.255
aggregate-address 10.0.0.0 255.0.0.0
redistribute ospf 1
neighbor 10.0.0.2 remote-as 8
neighbor 10.1.0.2 remote-as 8
no auto-summary
!
!
interface Loopback1
ip address 9.9.9.9 255.255.255.255
ip ospf 1 area 0
!
interface FastEthernet0/0
ip address 192.168.1.9 255.255.255.0
ip ospf 1 area 0
!
router ospf 1
log-adjacency-changes
!
R8
!Initial (default) BGP behavior, BGP select ONLY the best and installs it in RIB:
interface Loopback1
ip address 8.8.8.8 255.255.255.255
!
interface FastEthernet0/0
ip address 10.0.0.2 255.255.255.252
!
interface FastEthernet0/1
ip address 10.1.0.2 255.255.255.252
!
router bgp 8
no synchronization
bgp log-neighbor-changes
network 8.8.8.8 mask 255.255.255.255
aggregate-address 10.0.0.0 255.0.0.0
neighbor 10.0.0.1 remote-as 7
neighbor 10.1.0.1 remote-as 7
no auto-summary
!
R7#bgp
Network Next Hop Metric LocPrf Weight Path
*> 8.8.8.8/32 10.0.0.2 0 0 8 i
* 10.1.0.2 0 0 8 i
*> 9.9.9.9/32 192.168.1.9 2 32768 ?
* 10.0.0.0 10.0.0.2 0 0 8 i
*> 0.0.0.0 32768 i
* 10.1.0.2 0 0 8 i
*> 10.10.10.10/32 10.0.0.2 0 0 8 i
* 10.1.0.2 0 0 8 i
R7#sh ip route
8.0.0.0/32 is subnetted, 1 subnets
B 8.8.8.8 [20/0] via 10.0.0.2, 00:03:03
9.0.0.0/32 is subnetted, 1 subnets
O 9.9.9.9 [110/2] via 192.168.1.9, 02:33:36, FastEthernet1/0
10.0.0.0/8 is variably subnetted, 4 subnets, 3 masks
B 10.10.10.10/32 [20/0] via 10.0.0.2, 00:28:11
...
Maximum-paths
R7(config)#router bgp 7
R7(config-router)# maximum-paths 4
R7#sh ip route
7.0.0.0/32 is subnetted, 1 subnets
C 7.7.7.7 is directly connected, Loopback1
8.0.0.0/32 is subnetted, 1 subnets
S 8.8.8.8 [1/0] via 10.1.0.2
[1/0] via 10.0.0.2
9.0.0.0/32 is subnetted, 1 subnets
O 9.9.9.9 [110/2] via 192.168.1.9, 02:10:21, FastEthernet1/0
10.0.0.0/8 is variably subnetted, 4 subnets, 3 masks
8.0.0.0/32 is subnetted, 1 subnets
B 8.8.8.8 [20/0] via 10.1.0.2, 00:00:06
[20/0] via 10.0.0.2, 00:00:06
10.0.0.0/8 is variably subnetted, 4 subnets, 3 masks
B 10.10.10.10/32 [20/0] via 10.1.0.2, 00:25:45
[20/0] via 10.0.0.2, 00:25:15
R9#sh ip routeTest the load-sharing from R7 - working OK
8.0.0.0/32 is subnetted, 1 subnets
O E2 8.8.8.8 [110/1] via 192.168.1.7, 00:04:58, FastEthernet0/0
10.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
O E2 10.10.10.10/32 [110/1] via 192.168.1.7, 00:30:36, FastEthernet0/0
O E2 10.0.0.0/8 [110/1] via 192.168.1.7, 00:30:36, FastEthernet0/0
...
R9#
R7#ping
Protocol [ip]:
Target IP address: 8.8.8.8
Repeat count [5]: 10
Datagram size [100]:
Timeout in seconds [2]:
Extended commands [n]: y
Source address or interface: loopback1
Type of service [0]:
Set DF bit in IP header? [no]:
Validate reply data? [no]:
Data pattern [0xABCD]:
Loose, Strict, Record, Timestamp, Verbose[none]: r
Number of hops [ 9 ]: 4
Loose, Strict, Record, Timestamp, Verbose[RV]:
Sweep range of sizes [n]:
Type escape sequence to abort.
Sending 10, 100-byte ICMP Echos to 8.8.8.8, timeout is 2 seconds:
Packet sent with a source address of 7.7.7.7
Packet has IP options: Total option bytes= 19, padded length=20
Record route: <*> (0.0.0.0) (0.0.0.0) (0.0.0.0) (0.0.0.0)
Reply to request 0 (32 ms). Received packet has options
Total option bytes= 20, padded length=20
Record route: (10.0.0.1) (8.8.8.8) (10.0.0.2) (7.7.7.7) <*> End of list
Reply to request 1 (16 ms). Received packet has options
Total option bytes= 20, padded length=20
Record route: (10.1.0.1) (8.8.8.8) (10.1.0.2) (7.7.7.7) <*> End of list
Reply to request 2 (16 ms). Received packet has options
Total option bytes= 20, padded length=20
Record route: (10.0.0.1) (8.8.8.8) (10.0.0.2) (7.7.7.7) <*> End of list
Reply to request 3 (16 ms). Received packet has options
Total option bytes= 20, padded length=20
Record route: (10.1.0.1) (8.8.8.8) (10.1.0.2) (7.7.7.7) <*> End of list
Reply to request 4 (16 ms). Received packet has options
Total option bytes= 20, padded length=20
Record route: (10.0.0.1) (8.8.8.8) (10.0.0.2) (7.7.7.7) <*> End of list
....ommitedSuccess rate is 100 percent (10/10), round-trip min/avg/max = 12/17/32 ms
R7#
Test the load-sharing from R9 - working OK
Without using a loopback as the update source, within BGP, an IGP would always see the next hop as better through only 1 interface, especially a directly connected interface, If we use a loopback with an eBGP peer, to give load balancing a chance, that would also involve the eBGP-multihop x statement associated with that neighbor, so in effect the eBGP-multihop is required. (https://learningnetwork.cisco.com/thread/12590)
R9#ping
Protocol [ip]:
Target IP address: 8.8.8.8
Repeat count [5]: 6
Datagram size [100]:
Timeout in seconds [2]:
Extended commands [n]: y
Source address or interface: loopback1
Type of service [0]:
Set DF bit in IP header? [no]:
Validate reply data? [no]:
Data pattern [0xABCD]:
Loose, Strict, Record, Timestamp, Verbose[none]: r
Number of hops [ 9 ]:
Loose, Strict, Record, Timestamp, Verbose[RV]:
Sweep range of sizes [n]:
Type escape sequence to abort.
Sending 6, 100-byte ICMP Echos to 8.8.8.8, timeout is 2 seconds:
Packet sent with a source address of 9.9.9.9
Packet has IP options: Total option bytes= 39, padded length=40
Record route: <*> (0.0.0.0) (0.0.0.0) (0.0.0.0) (0.0.0.0) (0.0.0.0) (0.0.0.0) (0.0.0.0) (0.0.0.0) (0.0.0.0)
Reply to request 0 (28 ms). Received packet has options
Total option bytes= 40, padded length=40
Record route: (192.168.1.9) (10.1.0.1) (8.8.8.8) (10.1.0.2) (192.168.1.7) (9.9.9.9) <*> (0.0.0.0) (0.0.0.0) (0.0.0.0) End of list
Reply to request 1 (36 ms). Received packet has options
Total option bytes= 40, padded length=40
Record route: (192.168.1.9) (10.0.0.1) (8.8.8.8) (10.0.0.2) (192.168.1.7) (9.9.9.9) <*> (0.0.0.0) (0.0.0.0) (0.0.0.0) End of list
Reply to request 2 (32 ms). Received packet has options
Total option bytes= 40, padded length=40
Record route: (192.168.1.9) (10.1.0.1) (8.8.8.8) (10.1.0.2) (192.168.1.7) (9.9.9.9) <*> (0.0.0.0) (0.0.0.0) (0.0.0.0) End of list
Reply to request 3 (32 ms). Received packet has options
Total option bytes= 40, padded length=40
Record route: (192.168.1.9) (10.0.0.1) (8.8.8.8) (10.0.0.2) (192.168.1.7) (9.9.9.9) <*> (0.0.0.0) (0.0.0.0) (0.0.0.0) End of list
Reply to request 4 (28 ms). Received packet has options
Total option bytes= 40, padded length=40
Record route: (192.168.1.9) (10.1.0.1) (8.8.8.8) (10.1.0.2) (192.168.1.7) (9.9.9.9) <*> (0.0.0.0) (0.0.0.0) (0.0.0.0) End of list
Reply to request 5 (52 ms). Received packet has options
Total option bytes= 40, padded length=40
Record route: (192.168.1.9) (10.0.0.1) (8.8.8.8) (10.0.0.2) (192.168.1.7) (9.9.9.9) <*> (0.0.0.0) (0.0.0.0) (0.0.0.0) End of list
Success rate is 100 percent (6/6), round-trip min/avg/max = 28/34/52 ms
R9#
R9#traceroute 8.8.8.8 probe 10 <-with IP CEF enabledIf IP CEF is disabled on R7 (no ip cef)
1 192.168.1.7 8 msec 20 msec 16 msec 20 msec 20 msec 20 msec 20 msec 16 msec 20 msec 20 msec
2 10.1.0.2 32 msec 40 msec 28 msec 44 msec 44 msec 36 msec 40 msec 40 msec 40 msec 44 msec
R9#
R9#traceroute 10.10.10.10 source loopback 1 probe 6
1 192.168.1.7 8 msec 20 msec 20 msec 20 msec 20 msec 24 msec
2 10.1.0.2 20 msec
10.0.0.2 48 msec
10.1.0.2 40 msec
10.0.0.2 36 msec
10.1.0.2 40 msec
10.0.0.2 44 msec
R9#
Multihop
The use of loopback interfaces, update-source, and ebgp-multihop. The example is a workaround in order to achieve load balancing between two eBGP speakers over parallel serial lines. In normal situations, BGP picks one of the lines on which to send packets, and load balancing does not happen. With the introduction of loopback interfaces, the next hop for eBGP is the loopback interface. You use static routes, or an IGP, to introduce two equal-cost paths to reach the destination.
http://www.cisco.com/c/en/us/support/docs/ip/border-gateway-protocol-bgp/26634-bgp-toc.html#ebgpmulithoploadbal
Test with following config addition
router bgp 7BGP session will be in Active state as default BGP packets have in IP TTL=1
neighbor 10.0.0.2 remote-as 8
neighbor 10.0.0.2 update-source Loopback1
iBGP session IP TTL of 255 by default
eBGP session IP TTL of 1 by default
R7(config)#do bgpsSo enable multihop on those neighbors
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
10.0.0.2 4 8 248 247 0 0 0 00:01:25 Active
10.1.0.2 4 8 248 247 0 0 0 00:01:25 Active
R8(config)#
!
ip route 7.7.7.7 255.255.255.255 10.0.0.1
ip route 7.7.7.7 255.255.255.255 10.1.0.1
!
router bgp 8
no neighbor 10.0.0.1 remote-as 7
no neighbor 10.1.0.1 remote-as 7
neighbor 7.7.7.7 remote-as 7
neighbor 7.7.7.7 update-source loopback 1
neighbor 7.7.7.7 ebgp-multihop
R7(config)#
ip route 8.8.8.8 255.255.255.255 10.0.0.2Test load sharing from R7
ip route 8.8.8.8 255.255.255.255 10.1.0.2
!
router bgp 7
no neighbor 10.0.0.2 remote-as 8
no neighbor 10.1.0.2 remote-as 8
no maximum-paths 4
neighbor 8.8.8.8 remote-as 8
neighbor 8.8.8.8 ebgp-multihop 255
neighbor 8.8.8.8 update-source Loopback1
R7(config)#do bgps
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
8.8.8.8 4 8 4 6 9 0 0 00:00:58 1
R7(config)#
R7#traceroute 10.10.10.10 source loopback 1 probe 6Test load sharing from R9
1 10.1.0.2 16 msec
10.0.0.2 20 msec
10.1.0.2 16 msec
10.0.0.2 20 msec
10.1.0.2 20 msec
10.0.0.2 24 msec
R7#
R9#tracerou 10.10.10.10 num probe 6 source loopback 1With Cisco Express Forwarding switching, packets for a given source-destination host pair are guaranteed to take the same path, even if multiple paths are available. Traffic destined for different pairs tend to take different paths. http://www.cisco.com/c/en/us/support/docs/ip/express-forwarding-cef/18285-loadbal-cef.html
1 192.168.1.7 8 msec 20 msec 20 msec 20 msec 20 msec 20 msec
2 10.1.0.2 24 msec 32 msec 48 msec 36 msec 44 msec 44 msec
R9#
Also, traffic originated by router or destined to router is not CEF switched but process switched and process switching does per-packet load-sharing.
With fast switching, per destination switching may result in unequal load sharing because packets to one destination always follow the same path.
If IP CEF is disabled on R7 (no ip cef)
R9#tracerout 10.10.10.10 source loopback 1 probe 6
1 192.168.1.7 16 msec 16 msec 20 msec 20 msec 20 msec 20 msec
2 10.1.0.2 20 msec
10.0.0.2 40 msec
10.1.0.2 40 msec
10.0.0.2 40 msec
10.1.0.2 36 msec
10.0.0.2 44 msec
R9#