The BGP Control Plane: iBGP Route Reflectors and VPNv4/v6 on One Session

After completing the previous stages, both providers have a working data plane: SP-A label-switches over LDP, SP-B over Segment Routing. However, nothing yet refers to customer prefixes, which RD they belong to, or which far-end PE to tunnel them toward. This part is covered by the control plane, in my case, it will be iBGP with a single Route Reflector per AS, carrying the VPNv4 and VPNv6 address families.

After the completion, every session should be “Established”, however, it will still carry zero prefixes. This is SP-B’s Route Reflector output once the stage is applied:

RP/0/RP0/CPU0:B-RR#show bgp vpnv4 unicast summary
Tue Jun 16 04:37:50.753 UTC
BGP router identifier 10.2.0.7, local AS number 64502
BGP generic scan interval 60 secs
Non-stop routing is enabled
BGP table state: Active
Table ID: 0x0
BGP main routing table version 1
BGP NSR Initial initsync version 1 (Reached)
BGP NSR/ISSU Sync-Group versions 0/0
BGP scan interval 60 secs

BGP is operating in STANDALONE mode.


Process       RcvTblVer   bRIB/RIB   LabelVer  ImportVer  SendTblVer  StandbyVer
Speaker               1          1          1          1           1           0

Neighbor        Spk    AS MsgRcvd MsgSent   TblVer  InQ OutQ  Up/Down  St/PfxRcd
10.2.0.5          0 64502      88      87        1    0    0 01:24:51          0
10.2.0.6          0 64502      88      88        1    0    0 01:24:54          0
10.2.0.8          0 64502      94      85        1    0    0 01:21:29          0

Three clients, B-PE1 (.5), B-PE2 (.6) and B-ASBR (.8). There are no customer VRFs yet, I’ll add them later. That’s why BGP has nothing to advertise.

Topology file: topology.clab.yml · Addressing: ipam.md · Stage configs, all eight BGP nodes on both providers: stage_configs/lab01-s3-bgp/

The Architecture: One RR per AS, a BGP-Free Core

Both providers use the same control-plane design: a single Route Reflector per autonomous system, with PEs and the ASBR configured as clients. The P-routers run no BGP. In AS 64501, A-RR (XRd-CP) reflects for A-PE1, A-PE2, and A-ASBR. In AS 64502, B-RR (XRd-CP) reflects for B-PE1, B-PE2, and B-ASBR.

The RR is control-plane only and never appears in the forwarding path for customer traffic. It reflects NLRI and does not rewrite the BGP next-hop, so the data plane goes PE-to-PE over the LSPs.

A transit LSR swaps the top label of the stack imposed at the ingress PE and doesn’t check the VPN label beneath it or the VPNv4/v6 NLRI.

iBGP peers over Loopback0. The session needs IP reachability between the two loopbacks, that’s why I had configured OSPF and IS-IS in previous stages.

One Session for two Address Families

Each client has one TCP session to its RR between the IPv4 loopbacks, and both VPNv4 and VPNv6 ride on it. There is no separate IPv6 session: the address families are negotiated as MP-BGP capabilities when the session opens. On A-PE1 the two summaries show the same neighbor:

A-PE1#show bgp vpnv4 unicast all summary 
BGP router identifier 10.1.0.5, local AS number 64501
BGP table version is 1, main routing table version 1

Neighbor        V           AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
10.1.0.7        4        64501      94     106        1    0    0 01:31:52        0
A-PE1#show bgp vpnv6 unicast all summary 
BGP router identifier 10.1.0.5, local AS number 64501
BGP table version is 1, main routing table version 1

Neighbor        V           AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
10.1.0.7        4        64501      95     107        1    0    0 01:32:20        0

The Route Reflector Config

Both RRs are XRd-CP. The output below is from A-RR; B-RR will look slightly different:

router bgp 64501
 bgp router-id 10.1.0.7
 address-family vpnv4 unicast
 !
 address-family vpnv6 unicast
 !
 neighbor 10.1.0.5
  remote-as 64501
  update-source Loopback0
  password clear BGP_AUTH
  address-family vpnv4 unicast
   route-reflector-client
  !
  address-family vpnv6 unicast
   route-reflector-client
  !
 !
 ! ... neighbors 10.1.0.6 and 10.1.0.8 identical ...
!

The block above is trimmed to one neighbor, the full file is A-RR.ios.

On XR, route-reflector-client goes under the neighbor’s address-family, so each client carries it twice: once under vpnv4 unicast, once under vpnv6 unicast.

RP/0/RP0/CPU0:A-RR#show bgp vpnv4 unicast neighbors 10.1.0.5 | i Route-Reflector Client
Tue Jun 16 03:20:20.857 UTC
  Route-Reflector Client
  Route-Reflector Client

The cluster-ID is not configured. It defaults to the RR’s router-id:

RP/0/RP0/CPU0:B-RR#show bgp vpnv4 unicast process | i Cluster ID
Tue Jun 16 04:40:36.958 UTC
Default Cluster ID: 10.2.0.7
Active Cluster IDs:  10.2.0.7

The Client Config: XE and XR

IOS-XE client (A-PE1, A-PE2, A-ASBR, B-ASBR):

router bgp 64501
 bgp router-id 10.1.0.5
 bgp log-neighbor-changes
 no bgp default ipv4-unicast
 neighbor 10.1.0.7 remote-as 64501
 neighbor 10.1.0.7 update-source Loopback0
 neighbor 10.1.0.7 password BGP_AUTH
 !
 address-family vpnv4
  neighbor 10.1.0.7 activate
  neighbor 10.1.0.7 send-community extended
 exit-address-family
 !
 address-family vpnv6
  neighbor 10.1.0.7 activate
  neighbor 10.1.0.7 send-community extended
 exit-address-family
!

no bgp default ipv4-unicast stops IPv4 unicast from being activated for the neighbor; the only address families on this session are the two VPN ones. send-community extended sends the route-targets, which are one of the extended communities. IOS-XE sends them on the VPN address families once the neighbor is activated there.

IOS-XR client (B-PE1, B-PE2):

router bgp 64502
 bgp router-id 10.2.0.5
 address-family vpnv4 unicast
 !
 address-family vpnv6 unicast
 !
 neighbor 10.2.0.7
  remote-as 64502
  update-source Loopback0
  password encrypted 072D067C71282C313F
  address-family vpnv4 unicast
  !
  address-family vpnv6 unicast
  !
 !
!

No route-reflector-client, and no route-policy. IOS-XR requires an inbound and an outbound policy on eBGP neighbors only. On iBGP, the empty address-family is expected. IOS-XR also sends extended communities to iBGP peers by default, which is why this block has no send-community line.

Platform Difference: The MD5 Password Form

All sessions use the same key, BGP_AUTH. The form in which it is entered differs by platform:

Node class Entry form What running-config shows
SP-A XR (A-RR) password clear BGP_AUTH encrypted <type-7 string> (XR encodes it on commit)
SP-B XR (B-RR, B-PE1, B-PE2) password encrypted 072D067C71282C313F encrypted 072D067C71282C313F
All XE (A-PE*, A-ASBR, B-ASBR) password BGP_AUTH password BGP_AUTH – clear, since the CSRs run no service password-encryption

072D067C71282C313F is the type-7 encoding of BGP_AUTH it decodes back to the same string. Type-7 is reversible and adds no strength over the clear form.

BGP-Free Core: Confirming the Absence

IOS-XE, on A-P1:

A-P1#show ip bgp summary
% BGP not active

IOS-XR, on B-P1, the only XR P-router in either core:

RP/0/RP0/CPU0:B-P1#show bgp vpnv4 unicast summary
Tue Jun 16 04:43:10.209 UTC
% BGP instance 'default' not active

Why “0 Prefixes” ?

The empty sessions prove the config, authentication, AF negotiation and RR-client flagging. However there is nothing to reflect yet, no routes has been advertised.

route-reflector-client is confirmed under both AFs for every client, and the first real VRF in the L3VPN stage will confirm the reflection.

Verification Summary

Four things to check: the six client sessions are Established with 0 prefixes in VPNv4 and VPNv6; route-reflector-client is set under both AFs for every client; both RRs use their router-id as cluster-ID; the P-routers have no BGP process. The commands, on XR and on XE:

RP/0/RP0/CPU0:A-RR#show bgp vpnv4 unicast summary
RP/0/RP0/CPU0:A-RR#show bgp vpnv6 unicast summary
RP/0/RP0/CPU0:A-RR#show bgp vpnv4 unicast neighbors 10.1.0.5 | i Route-Reflector Client
RP/0/RP0/CPU0:B-RR#show bgp vpnv4 unicast process | i Cluster ID
RP/0/RP0/CPU0:B-P1#show bgp vpnv4 unicast summary
A-PE1#show bgp vpnv4 unicast all summary
A-PE1#show bgp vpnv6 unicast all summary
A-P1#show ip bgp summary

What’s Next

The next stage is a convergence: BFD on every IGP adjacency, and LFA extended to IPv6 where the platform supports it.

Leave a comment