# GoBGP global Internet table feed (roadmap E1) This service runs [GoBGP](https://github.com/osrg/gobgp) to pull the **full real Internet routing table** (IPv4 ~1M + IPv6 ~200k routes) from Łukasz Bromirski's lab route server (**AS57355**) and BMP-export every received route to the OpenBMP collector. The table lands in PostgreSQL `ip_rib` as a monitored peer. - Image: `jauderho/gobgp:v4.5.0` — community-maintained, multi-arch, tracks upstream GoBGP releases (rebuilt within an hour of each release). Chosen because the official `osrg/gobgp` image is published less consistently. - Local AS: **65001** (private). Router-id: `10.40.40.250`. - The session is **receive-only** — we announce nothing to the route server. ## Files | File | Purpose | |------------------|----------------------------------------------------------------| | `gobgpd.conf` | GoBGP daemon config (global, neighbors, BMP export). TOML. | | `mrt-refresh.sh` | MRT full-table fallback loader (cron-driven). | | `mrt/` | Created at runtime; cached RouteViews RIB dumps. | ## Bring it up The `gobgp` service is defined in the repo `docker-compose.yml`, on the same default compose network as `collector`, and `depends_on` it. ```sh docker compose config # validate compose is well-formed docker compose up -d gobgp # start (collector must be running) docker logs -f obmp-gobgp ``` > The live BGP cutover is performed by a human — bringing the container up is > all that is needed; GoBGP initiates the eBGP-multihop sessions automatically. ## Confirm the session and route count ```sh # session state — expect both neighbors in "Establ" docker exec obmp-gobgp gobgp neighbor # received route counts — expect ~1M IPv4, ~200k IPv6 docker exec obmp-gobgp gobgp global rib summary -a ipv4 docker exec obmp-gobgp gobgp global rib summary -a ipv6 ``` ## How the data appears in OpenBMP GoBGP opens an outbound **BMP** session to `obmp-collector:5000` with `route-monitoring-policy = "pre-policy"` (Adj-RIB-In, pre import-policy — consistent with the rest of the OpenBMP fleet). In OpenBMP / PostgreSQL the source is identified by the **BMP router**, which GoBGP reports using its `router-id` (`10.40.40.250`) and `local-as` (`65001`): - `routers` table — a row with `ip_address` / name derived from `10.40.40.250`. - `bgp_peers` table — two peer rows for `85.232.240.179` and `2001:1a68:2c:2::179`, both `peer_as = 57355`. - `ip_rib` — every prefix from the global table, attributed to those peers. To find it in Grafana/SQL, filter on `peer_as = 57355` or the router-id above. ## MRT fallback AS57355 is a **single volunteer-run host with no SLA** — it can and does go away. `mrt-refresh.sh` keeps the global table in `ip_rib` warm when the live feed is down: 1. If any AS57355 session is `Established`, the script does nothing — the live feed is authoritative and must not be overwritten with a stale dump. 2. Otherwise it downloads the latest full RIB dump from RouteViews (`https://archive.routeviews.org/route-views/bgpdata/YYYY.MM/RIBS/rib.YYYYMMDD.HHMM.bz2`, published every 2 hours UTC) and runs `gobgp mrt inject global `, which installs every prefix into the running daemon. BMP export to the collector then happens automatically. The script is idempotent (re-uses an already-downloaded dump), guarded by a `flock` against overlapping runs, and prunes to the 4 most recent dumps. ### Schedule it (host crontab, 2-hour cadence) ```cron 0 */2 * * * docker exec obmp-gobgp /config/mrt-refresh.sh >> /var/log/gobgp-mrt.log 2>&1 ``` Run it once manually to verify: ```sh docker exec obmp-gobgp /config/mrt-refresh.sh ``` ## Caveats - **No SLA.** AS57355 is a volunteer lab route server; treat the live feed as best-effort and rely on the MRT fallback for continuity. - eBGP-multihop TTL is set to 64 — the route server is many hops away. - A full table is ~1M+ prefixes; expect a noticeable load spike in the collector and PostgreSQL when the session first establishes or an MRT dump is injected.