Every additional route in the global BGP table costs memory, CPU, and convergence time — not just for you, but for every router that has to carry it. Route aggregation (summarization) is how you keep your footprint on the internet routing table proportional to what you actually need to announce, rather than flooding the world with every individual subnet you happen to be using internally. This guide covers BGP aggregation mechanics, configuration, suppression of more-specifics, AS-set preservation, and the operational tradeoffs involved.
Why Aggregate in BGP
Consider an organization with four /24 blocks: 198.51.100.0/24, 198.51.101.0/24, 198.51.102.0/24, 198.51.103.0/24. Advertising all four individually means every router on the internet carries four routing table entries for what is, functionally, one organization’s address space. If those four blocks are contiguous and summarizable into 198.51.100.0/22, advertising just the aggregate cuts that to one entry — with no loss of reachability, since routing to any address within the aggregate still lands at the same AS.
Beyond global table size, aggregation also improves route stability: if one of the four /24s flaps (goes up and down repeatedly, perhaps due to a flaky link), advertising only the aggregate means that instability doesn’t need to propagate externally at all, as long as at least one component prefix remains reachable.
The aggregate-address Command
Router(config)# router bgp 65001
Router(config-router)# aggregate-address 198.51.100.0 255.255.252.0
By default, this command does two things:
- Injects the aggregate route (
198.51.100.0/22) into the BGP table, as long as at least one more-specific component route exists in the table. - Continues to also advertise the more-specific component routes alongside the aggregate, unless told otherwise.
This default “advertise both” behavior is often not what people want in practice — usually the goal is to advertise only the aggregate.
Suppressing More-Specific Routes
To advertise only the aggregate and suppress the individual component routes from being sent externally:
Router(config-router)# aggregate-address 198.51.100.0 255.255.252.0 summary-only
With summary-only, the more-specific routes remain in the local BGP table (visible via show ip bgp) but are marked suppressed and not advertised to neighbors — only the aggregate is sent out.
AS-SET: Preserving Path Information
By default, an aggregate created from routes originated by different autonomous systems (common in transit/multi-origin scenarios) loses the individual AS-path information — the aggregate is advertised as if originated solely by your AS. If path information from constituent ASes needs to be preserved (relevant for loop prevention in some multi-AS aggregation scenarios), use as-set:
Router(config-router)# aggregate-address 198.51.100.0 255.255.252.0 as-set summary-only
With as-set, the aggregate’s AS-path attribute becomes an unordered set of all ASes that contributed to the aggregate, which can prevent routing loops in scenarios where routes might otherwise be re-learned back into one of the contributing ASes. Note that as-set also means the aggregate’s stability is affected by changes in any contributing AS-path, somewhat reducing the flap-dampening benefit of aggregation.
Selective Suppression with Route-Maps
Sometimes you want to suppress most, but not all, more-specific routes — for example, keeping one particular /24 advertised individually for traffic engineering purposes (like directing a specific customer’s inbound traffic differently) while suppressing the rest:
Router(config)# route-map SUPPRESS-MAP permit 10
Router(config-route-map)# match ip address prefix-list KEEP-SPECIFIC-VISIBLE
Router(config-route-map)# continue
The suppress-map approach:
Router(config)# ip prefix-list SUPPRESS-THESE seq 10 permit 198.51.100.0/24
Router(config)# ip prefix-list SUPPRESS-THESE seq 20 permit 198.51.102.0/24
Router(config)# route-map SUPPRESS-SPECIFIC permit 10
Router(config-route-map)# match ip address prefix-list SUPPRESS-THESE
Router(config)# router bgp 65001
Router(config-router)# aggregate-address 198.51.100.0 255.255.252.0 suppress-map SUPPRESS-SPECIFIC
Only the prefixes matched by SUPPRESS-THESE are suppressed from individual advertisement; any other component prefixes continue to be advertised alongside the aggregate.
Setting Attributes on the Aggregate
You can attach a community, set an origin, or otherwise tag the aggregate route as it’s created, using an attribute-map:
Router(config)# route-map AGG-ATTRS permit 10
Router(config-route-map)# set community 65001:999
Router(config)# router bgp 65001
Router(config-router)# aggregate-address 198.51.100.0 255.255.252.0 summary-only attribute-map AGG-ATTRS
Full Practical Example
An enterprise owns 198.51.100.0/22 split across four /24s used internally for different sites, each originated via redistributed static routes:
router bgp 65001
neighbor 203.0.113.1 remote-as 64500
neighbor 203.0.113.1 send-community
redistribute static route-map STATICS-TO-BGP
aggregate-address 198.51.100.0 255.255.252.0 summary-only attribute-map AGG-ATTRS
route-map STATICS-TO-BGP permit 10
match ip address prefix-list COMPONENT-BLOCKS
route-map AGG-ATTRS permit 10
set community 65001:100
ip prefix-list COMPONENT-BLOCKS seq 10 permit 198.51.100.0/24
ip prefix-list COMPONENT-BLOCKS seq 20 permit 198.51.101.0/24
ip prefix-list COMPONENT-BLOCKS seq 30 permit 198.51.102.0/24
ip prefix-list COMPONENT-BLOCKS seq 40 permit 198.51.103.0/24
ip route 198.51.100.0 255.255.255.0 Null0
ip route 198.51.101.0 255.255.255.0 Null0
ip route 198.51.102.0 255.255.255.0 Null0
ip route 198.51.103.0 255.255.255.0 Null0
The Null0 statics give BGP something concrete to aggregate from and originate reliably, regardless of the internal state of any specific site link — a well-established pattern for stable aggregate origination. Internal routing (OSPF/EIGRP/static) handles actual reachability to hosts within those blocks; the Null0 route only matters if traffic arrives for an address that has no more specific internal route, acting as a safety net rather than the primary forwarding path.
Verification Commands
Router# show ip bgp
Router# show ip bgp 198.51.100.0/22
Router# show ip bgp neighbors 203.0.113.1 advertised-routes
Router# show bgp summary
Sample output showing suppressed routes:
Router# show ip bgp
Network Next Hop Metric LocPrf Weight Path
*> 198.51.100.0/22 0.0.0.0 0 32768 i
s> 198.51.100.0/24 0.0.0.0 0 32768 i
s> 198.51.101.0/24 0.0.0.0 0 32768 i
s> 198.51.102.0/24 0.0.0.0 0 32768 i
s> 198.51.103.0/24 0.0.0.0 0 32768 i
The s> flag indicates a suppressed route — present in the local table but not advertised, confirming summary-only is working as expected. The *> on the /22 confirms the aggregate is being advertised as best path.
Common Configuration Mistakes
- Using
aggregate-addresswithoutsummary-onlywhen the intent was to reduce advertised route count — without it, you get the aggregate plus every component route, which doesn’t reduce anything externally. - Creating an aggregate with no matching component routes present in the BGP table — the aggregate simply won’t be generated; verify with
show ip bgpthat at least one contributing prefix actually exists in the table. - Forgetting that summarization can mask reachability problems — if one component subnet inside the aggregate genuinely loses reachability, external peers won’t notice via routing (since the aggregate stays up), and traffic may black-hole silently until detected through other monitoring.
- Not using Null0 static routes to anchor aggregate origination, leading to aggregates that flap along with the underlying more-specific routes’ presence/absence in unpredictable ways.
- Overusing
as-setin situations where flap-isolation was the actual goal —as-setreintroduces some of the instability propagation that aggregation is meant to prevent.
Best Practices
- Aggregate to your actual allocated block boundary, matching your RIR (regional internet registry) allocation, so the aggregate is a legitimate, routable summary rather than an arbitrary boundary that confuses downstream filtering (many providers filter based on RIR allocation boundaries).
- Always pair
aggregate-addresswithsummary-onlyunless you have a specific, documented reason to advertise both the aggregate and components. - Anchor aggregates with Null0 static routes for predictable origination behavior independent of internal routing instability.
- Monitor component route health separately from the aggregate’s advertised status, since aggregation intentionally hides component-level instability from external view — you still need internal visibility.
- Coordinate aggregation boundaries with your RIR registration and IRR route objects, since many providers filter based on registered prefix length, and an aggregate that doesn’t match registration may get filtered by strict peers.
Troubleshooting Checklist
show ip bgp X.X.X.X/Y— confirm the aggregate is present and marked as the best path.show ip bgpwith attention tos>flags — confirm expected suppression behavior.show ip bgp neighbors X advertised-routes— confirm only the aggregate (not components) is reaching peers, ifsummary-onlyis intended.- If the aggregate isn’t appearing at all, confirm at least one component prefix is actually present and valid in the BGP table (
show ip bgpwithout filters). - If a peer reports not receiving your aggregate, check whether they’re filtering based on RIR-registered prefix length or IRR route object mismatch.
FAQs
Does aggregation affect internal routing, or only what’s advertised externally? Only what’s advertised in BGP — internal routing (OSPF, EIGRP, static, connected) continues to use the more specific routes for actual packet forwarding within your network regardless of BGP aggregation behavior.
What happens if all component routes disappear — does the aggregate stay up? No — aggregate-address requires at least one matching component route present in the BGP table to generate the aggregate. If all components disappear, the aggregate is withdrawn too.
Is as-set recommended for typical single-AS aggregation scenarios? Generally no — as-set matters mainly when aggregating routes that originated from multiple different autonomous systems and loop prevention across those ASes is a concern. For straightforward single-AS aggregation of your own address blocks, it typically isn’t needed and can reduce aggregation’s stability benefits.
Can I aggregate routes that aren’t contiguous or don’t align to a clean CIDR boundary? No — aggregate-address requires the target network/mask to be a valid CIDR block; you cannot aggregate arbitrary, non-contiguous, or non-power-of-two-aligned address ranges into a single meaningful aggregate.
Summary
BGP aggregation is a straightforward but consequential optimization: fewer routes in the global table, better flap isolation, and cleaner advertisement to peers, achieved with aggregate-address and, in almost all real deployments, the summary-only keyword. The main engineering discipline involved is anchoring aggregates reliably (typically via Null0 statics), aligning aggregate boundaries with your actual RIR allocation, and remembering that aggregation trades some external visibility into component-level health for a smaller, more stable advertised footprint — which means internal monitoring still needs to catch component-level problems that BGP summarization will intentionally hide from the outside world.
References
- Configuring BGP Route Aggregation: https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/iproute_bgp/configuration/xe-16/irg-xe-16-book/irg-bgp-aggregate.html
- BGP Case Studies – Aggregation: https://www.cisco.com/c/en/us/support/docs/ip/border-gateway-protocol-bgp/13753-25.html
- RFC 4271 – A Border Gateway Protocol 4 (BGP-4): https://datatracker.ietf.org/doc/html/rfc4271