Skip to content
Thomas Mangin edited this page Oct 1, 2026 · 60 revisions

ExaBGP Wiki

Welcome to the comprehensive ExaBGP documentation. This wiki covers everything from beginner setup to advanced features and production deployments.

🚨 Common Problem - Pipe Filling

Many ExaBGP program examples found online never read the answers ExaBGP sends back. ExaBGP answers each command a program writes with one line on the program's standard input, done or error, and the program has to read it. In 5.x and 4.x, once the 64 KiB pipe is full, ExaBGP blocks and stops doing anything else, its BGP sessions included. In 6.0 the unread answers accumulate in ExaBGP's memory without limit.

A program should read the answer after each command, which also tells it whether the command worked. When it has no use for the answers, it can turn them off for itself (disable-ack in 5.x, session ack disable in 6.0), or they can be turned off for every program with export exabgp_api_ack=false, which is the only way in 4.x.

The built-in health checker reads its answers. See Reading the answers for programs which do it correctly.

Important Notice

ExaBGP does NOT manipulate the RIB (Routing Information Base) or FIB (Forwarding Information Base).

ExaBGP is a pure BGP protocol implementation that:

  • Implements the BGP-4 protocol and modern extensions
  • Provides JSON/text API for external process communication
  • Maintains internal routing information
  • Does NOT install routes into the kernel routing table
  • Does NOT modify forwarding tables

If you need FIB manipulation, consider alternatives like BIRD or FRRouting.

Version Compatibility

  • 5.0 (stable): The released version (5.0.13), installed by pip, pipx and most OS packages. SRv6, BGP-MUP, security fixes. Python 3.8+.
  • main (development): Will become 6.0, but it is not 6.0 yet and nothing is tagged. Work in progress towards the asyncio engine, interactive CLI, shell completion and health monitoring API. The message code can also be compiled with mypyc for 1.4 to 2.1 times the speed, experimentally: see Compiled Build. The full unit and functional test suites run on every commit. Python 3.12+ required. See 5.x to 6.0.0 Migration.
  • 4.x (End of Life): Critical fixes only. Python 3.6+. See 4.x to 5.0.0 Migration Guide.

Both 5.0 and main are supported. If you have no preference, use 5.0 (git checkout 5.0, or pip install exabgp). Use main if you want the features being built for 6.0 and run Python 3.12 or later.

Note that git clone and docker pull ghcr.io/exa-networks/exabgp:latest both give you main, as it is the repository default branch.

Existing 5.x users: 6.0.0 has breaking changes (Python 3.12+, BGP-LS JSON, and the removal of role { otc disable; } and the per-route otc none, which stops a configuration using either from loading at all). It also changes some of the bytes ExaBGP puts on the wire against an unchanged peer, and makes incoming-ttl enforce the IPv4 inbound TTL check it never actually installed before. A route from an EBGP neighbour whose AS_PATH does not start with its AS is now treated as withdrawn, so the neighbour of a route server needs enforce-first-as false;, and API programs reading the capabilities of an OPEN by their code, or the text of a received NOTIFICATION from data, need a small change. See 5.x to 6.0.0 Migration Guide.

Quick Navigation

New to ExaBGP?

⭐ Most Popular Feature: Health Checks

Zero-Code Health Checks Built-In! ExaBGP includes a production-ready exabgp healthcheck module - no custom scripting required:

# Automatically announce/withdraw routes based on service health
exabgp healthcheck --cmd "curl -sf http://localhost/health" --ip 10.0.0.1/32

Why health checks matter: ExaBGP's killer feature is automatic route announcement/withdrawal based on service health. Your application controls its own BGP routing - announce when healthy, withdraw when failing. No manual intervention, no external monitoring required.

Configuration

API Documentation

Address Families

Basic Address Families

FlowSpec

L3VPN

EVPN

BGP-LS

Other Address Families

Use Cases

Features

Capabilities

Communities

  • Communities - Standard, Extended, and Large Communities (RFC 1997, 4360, 8092)

Attributes & Other

Tools

Operations

Integration

Reference

Migration

Community

External Resources

Configuration Examples

Browse configuration examples organized by:

  • User experience level (Beginner/Intermediate/Advanced)
  • Use case (DDoS/Anycast/VPN/etc)
  • Feature (FlowSpec/EVPN/BGP-LS/etc)
  • Protocol family (IPv4/IPv6/VPN/etc)

About This Documentation

This documentation is organized to help users at all levels:

  • Beginners: Start with Getting Started
  • Operators: Focus on Use Cases and Operations
  • Developers: Explore API and Development sections
  • Reference: Use the A-Z indices for quick lookups

Every document includes:

  • Clear table of contents
  • Practical examples from the configuration files
  • Cross-references to related docs
  • Common errors and solutions
  • Version compatibility notes

RFC Compliance

ExaBGP has code for 55+ RFCs including:

  • Core BGP-4 (RFC 4271) - Protocol only, no RIB/FIB manipulation
  • Multiprotocol BGP (RFC 4760) - Multiple address families
  • FlowSpec (RFC 8955 and RFC 8956) - Traffic filtering
  • EVPN (RFC 7432) - Ethernet VPN
  • BGP-LS (RFC 9552) - Link State distribution
  • SRv6 (RFC 9514) - Segment Routing over IPv6
  • And many more...

main also carries a requirement ledger: for 32 documents (31 RFCs and one draft), every normative sentence is recorded verbatim, checked against the published text on every test run, and joined to the tests which prove it. All 288 binding requirements are proven. Read doc/RFC_COMPLIANCE.md for a per-sentence answer to "does ExaBGP do X", and RFC Information for the full list of documents and where each one lives in the source. The ledger is a concept taken from Ze, the successor of ExaBGP, and backported here in a simpler form.


Need Help? Join our Slack community or file an issue.


Clone this wiki locally