Today we are going to do some BGP load balancing between a Cisco router and a Juniper router.
We have a very simple topology:
The Juniper router (JUNOS1) is called NewYork and the Cisco router (R1) is called London.
We have two connections between them 1.1.1.1/24 on the Juniper to 1.1.1.2/24 on the Cisco, and 2.2.2.1 on the Juniper to 2.2.2.2 on the Cisco. We will be using AS 65000 for the BGP AS.
For the Juniper basic configuration please check out these two posts:
Juniper router emulation in GNS3
Basic Juniper Router commands
What is BGP Load Balancing?
Load balancing can use two or more connections to send data to the same destination. Load balancing in BGP requires that we enable multi-pathing, so that the router knows that it can use more than one path at a time.We will start with the basic BGP configuration and from there advertise a loopback network on each side, then we will set up multi-pathing.
Cisco IOS BGP setup
I won't explain all the Cisco steps as they shouldn't be anything new - but there are links to my book here. Shameless plug I know!London(config)#router bgp 65000 London(config-router)#neighbor 1.1.1.1 remote-as 65000 London(config-router)#neighbor 2.2.2.1 remote-as 65000 London(config-router)#exit London(config)#exit London#
Juniper JunOS BGP setup
For the JunOS set up we will create the BGP AS under routing options, and then create a group called Cisco to add the two peerings to the Cisco router to, setting the AS number to match our own, and the type to be internal (iBGP).root@NewYork> configure Entering configuration mode [edit] root@NewYork# set routing-options autonomous-system 65000 root@NewYork# set protocols bgp group Cisco neighbor 1.1.1.2 root@NewYork# set protocols bgp group Cisco neighbor 2.2.2.2 root@NewYork# set protocols bgp group Cisco peer-as 65000 root@NewYork# set protocols bgp group Cisco type internal root@NewYork# commit commit complete [edit] root@NewYork#At this stage our BGP peers should come up:
London# *Apr 21 13:19:18.087: %BGP-5-ADJCHANGE: neighbor 1.1.1.1 Up London# *Apr 21 13:19:22.227: %BGP-5-ADJCHANGE: neighbor 2.2.2.1 Up London#We can confirm this by looking at the bgp neighbors on the NewYork router:
root@NewYork> show bgp neighbor Peer: 1.1.1.2+46617 AS 65000 Local: 1.1.1.1+179 AS 65000 Type: Internal State: Established Flags:Last State: OpenConfirm Last Event: RecvKeepAlive Last Error: None Options: Holdtime: 90 Preference: 170 Number of flaps: 0 Peer ID: 2.2.2.2 Local ID: 1.1.1.1 Active Holdtime: 90 Keepalive Interval: 30 Peer index: 0 BFD: disabled, down NLRI for restart configured on peer: inet-unicast NLRI advertised by peer: inet-unicast NLRI for this session: inet-unicast Peer supports Refresh capability (2) Stale routes from peer are kept for: 300 Peer does not support Restarter functionality Peer does not support Receiver functionality Peer supports 4 byte AS extension (peer-as 65000) Peer does not support Addpath Table inet.0 Bit: 10000 RIB State: BGP restart is complete Send state: in sync Active prefixes: 1 Received prefixes: 1 Accepted prefixes: 1 Suppressed due to damping: 0 Advertised prefixes: 0 Last traffic (seconds): Received 15 Sent 22 Checked 40 Input messages: Total 8 Updates 2 Refreshes 0 Octets 226 Output messages: Total 7 Updates 0 Refreshes 0 Octets 173 Output Queue[0]: 0 Peer: 2.2.2.2+179 AS 65000 Local: 2.2.2.1+51595 AS 65000 Type: Internal State: Established Flags: Last State: OpenConfirm Last Event: RecvKeepAlive Last Error: None Options: Holdtime: 90 Preference: 170 Number of flaps: 0 Peer ID: 2.2.2.2 Local ID: 1.1.1.1 Active Holdtime: 90 Keepalive Interval: 30 Peer index: 1 BFD: disabled, down NLRI for restart configured on peer: inet-unicast NLRI advertised by peer: inet-unicast NLRI for this session: inet-unicast Peer supports Refresh capability (2) Stale routes from peer are kept for: 300 Peer does not support Restarter functionality Peer does not support Receiver functionality Peer supports 4 byte AS extension (peer-as 65000) Peer does not support Addpath Table inet.0 Bit: 10000 RIB State: BGP restart is complete Send state: in sync Active prefixes: 0 Received prefixes: 1 Accepted prefixes: 1 Suppressed due to damping: 0 Advertised prefixes: 0 Last traffic (seconds): Received 13 Sent 21 Checked 35 Input messages: Total 5 Updates 2 Refreshes 0 Octets 135 Output messages: Total 6 Updates 0 Refreshes 0 Octets 154 Output Queue[0]: 0 root@NewYork>
Advertising BGP prefixes in Cisco IOS and Juniper JunOS
Now we can add our loopback interfaces, and advertise them into BGP:London(config)#int lo0 London(config-if)#ip add 172.20.1.1 255.255.255.0 London(config-if)#router bgp 65000 London(config-router)#network 172.20.1.0 mask 255.255.255.0 London(config-router)#NewYork sees the route coming from both peering sessions, it prefers the one with the lower IP address (denoted by a *):
root@NewYork> show route inet.0: 5 destinations, 6 routes (5 active, 0 holddown, 0 hidden) + = Active Route, - = Last Active, * = Both 1.1.1.0/24 *[Direct/0] 01:08:36 > via em0.0 1.1.1.1/32 *[Local/0] 01:08:36 Local via em0.0 2.2.2.0/24 *[Direct/0] 01:08:36 > via em1.0 2.2.2.1/32 *[Local/0] 01:08:36 Local via em1.0 172.20.1.0/24 *[BGP/170] 00:01:20, MED 0, localpref 100 AS path: I > to 1.1.1.2 via em0.0 [BGP/170] 00:01:20, MED 0, localpref 100 AS path: I > to 2.2.2.2 via em1.0 root@NewYork>Now let's add a loopback interface on the NewYork router and advertise it in BGP as well. The process isn't exactly as straight forward in JunOS, all advertisement is done through policy statements, which is then used to export (advertise to BGP neighbors) based on the specified group:
root@NewYork# set int lo0 unit 0 family inet address 192.168.1.1/24 root@NewYork# edit policy-options [edit policy-options] root@NewYork# set policy-statement ADVERTISE_LO0 from interface lo0 root@NewYork# set policy-statement ADVERTISE_LO0 then accept [edit policy-options] root@NewYork# exit [edit] root@NewYork# set protocols bgp group Cisco export ADVERTISE_LO0 [edit] root@NewYork# commit commit complete [edit] root@NewYork#And if all is well then the London router should see the new prefix:
London#sh ip route | beg Gate Gateway of last resort is not set 1.0.0.0/8 is variably subnetted, 2 subnets, 2 masks C 1.1.1.0/24 is directly connected, GigabitEthernet1/0 L 1.1.1.2/32 is directly connected, GigabitEthernet1/0 2.0.0.0/8 is variably subnetted, 2 subnets, 2 masks C 2.2.2.0/24 is directly connected, GigabitEthernet2/0 L 2.2.2.2/32 is directly connected, GigabitEthernet2/0 172.20.0.0/16 is variably subnetted, 2 subnets, 2 masks C 172.20.1.0/24 is directly connected, Loopback0 L 172.20.1.1/32 is directly connected, Loopback0 B 192.168.1.0/24 [200/0] via 1.1.1.1, 00:00:15 London#It does, again choosing the router with the lower IP address. Now let's set up load balancing.
Enabling load balancing for BGP in Cisco IOS
Enabling load balancing in BGP on Cisco IOS is as simple as enabling the maximum-paths option.London(config-router)#maximum-paths ibgp 2 London(config-router)#do sh ip route | beg Gate Gateway of last resort is not set 1.0.0.0/8 is variably subnetted, 2 subnets, 2 masks C 1.1.1.0/24 is directly connected, GigabitEthernet1/0 L 1.1.1.2/32 is directly connected, GigabitEthernet1/0 2.0.0.0/8 is variably subnetted, 2 subnets, 2 masks C 2.2.2.0/24 is directly connected, GigabitEthernet2/0 L 2.2.2.2/32 is directly connected, GigabitEthernet2/0 172.20.0.0/16 is variably subnetted, 2 subnets, 2 masks C 172.20.1.0/24 is directly connected, Loopback0 L 172.20.1.1/32 is directly connected, Loopback0 B 192.168.1.0/24 [200/0] via 2.2.2.1, 00:00:02 [200/0] via 1.1.1.1, 00:00:02 London(config-router)#do sh ip bgp BGP table version is 5, local router ID is 2.2.2.2 Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, r RIB-failure, S Stale, m multipath, b backup-path, x best-external, f RT-Filter Origin codes: i - IGP, e - EGP, ? - incomplete Network Next Hop Metric LocPrf Weight Path *> 172.20.1.0/24 0.0.0.0 0 32768 i *mi192.168.1.0 1.1.1.1 100 0 i *>i 2.2.2.1 100 0 i London(config-router)#So our London router has now installed two paths into the routing table, courtesy of the maximum-paths command. Let's configure the same on the NewYork router.
Enabling load balancing for BGP in Juniper JunOS
Similarly to the Cisco IOS all we need to do with JunOS is to enable multipath under our BGP peer group:root@NewYork# edit protocols bgp group Cisco [edit protocols bgp group Cisco] root@NewYork# set multipath [edit protocols bgp group Cisco] root@NewYork# exit [edit] root@NewYork# commit commit complete [edit] root@NewYork# exit Exiting configuration mode root@NewYork> show route 172.20.1.0 inet.0: 7 destinations, 8 routes (7 active, 0 holddown, 0 hidden) + = Active Route, - = Last Active, * = Both 172.20.1.0/24 *[BGP/170] 00:24:56, MED 0, localpref 100, from 1.1.1.2 AS path: I to 1.1.1.2 via em0.0 > to 2.2.2.2 via em1.0 [BGP/170] 00:11:42, MED 0, localpref 100 AS path: > to 2.2.2.2 via em1.0 root@NewYork> show route 172.20.1.0 detail inet.0: 7 destinations, 8 routes (7 active, 0 holddown, 0 hidden) 172.20.1.0/24 (2 entries, 1 announced) *BGP Preference: 170/-101 Next hop type: Indirect Address: 0x9408078 Next-hop reference count: 2 Source: 1.1.1.2 Next hop type: Router, Next hop index: 520 Next hop: 1.1.1.2 via em0.0 Next hop type: Router, Next hop index: 554 Next hop: 2.2.2.2 via em1.0, selected Protocol next hop: 1.1.1.2 Indirect next hop: 9384000 131071 Protocol next hop: 2.2.2.2 Indirect next hop: 93840e8 131070 State:Here we can see that also with just the setting up of multipathing our Juniper router will also now load-balanced - the "show route 172.20.1.0 detail" shows this with it's two next hop addresses and also the line "Accepted Multipath".Local AS: 65000 Peer AS: 65000 Age: 18:57 Metric: 0 Metric2: 0 Task: BGP_65000.1.1.1.2+19079 Announcement bits (2): 0-KRT 3-Resolve tree 1 AS path: I Accepted Multipath Localpref: 100 Router ID: 172.20.1.1 BGP Preference: 170/-101 Next hop type: Indirect Address: 0x93345f8 Next-hop reference count: 2 Source: 2.2.2.2 Next hop type: Router, Next hop index: 554 Next hop: 2.2.2.2 via em1.0, selected Protocol next hop: 2.2.2.2 Indirect next hop: 93840e8 131070 State: Inactive reason: Not Best in its group - Update source Local AS: 65000 Peer AS: 65000 Age: 2:13 Metric: 0 Metric2: 0 Task: BGP_65000.2.2.2.2+45024 AS path: I Accepted MultipathContrib Localpref: 100 Router ID: 172.20.1.1 root@NewYork>
We can actually do a lot more with load-balancing, we can use unequal bandwidth to load-balance according to the resources at our disposal, or load-balance on a per-packet basis, but as far as simple load-balancing goes, this is pretty much it. It's not hard to set up as I hope this post has shown.