Validate route origins against the RPKI and refuse invalid routes
With rpki { caches { ... } } in the configuration the server keeps the
validated ROA payloads of a validator and validates every route from a
peer outside its own AS (RFC 6811). An invalid route is refused, unless
its peer has accept_rpki_invalid. Valid and not-found routes are taken;
validity does not otherwise enter route selection.
Validity is not settled when a route arrives: the data changes every few
minutes. The routes follow, without the peer sending anything again.
- A route refused as invalid is held by its session, out of the table.
When the data changes the session looks at what it holds, and what is
no longer invalid goes into the table. A held route is the peer's to
withdraw or replace like any other.
- A route in the table that becomes invalid is found by a task that
looks through the table when the data changes, at the prefixes the
changed VRPs cover, and is taken out and held by its session.
- If the data expires because no cache confirms it, nothing is invalid
any more and everything held is taken.
- A session holds at most 200,000 routes; past that it asks the peer for
a route refresh when the data changes.
So that the table can be looked through without parsing attributes, an
attribute set's key now has the route's origin AS. Memory per route is
unchanged at 52 bytes on the real table.
Shown: /api/rpki and a section of the status page with the cache, its
state and the age of the data; each route's validity; each peer's count
of held routes. Refusals are recorded under "RPKI invalid". Metrics:
bgp_rpki_vrps and bgp_rpki_updates_total.
Also: Negotiated says whether the peer supports route refresh, and
docs/RFCs.md is brought up to date.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
1 parent
1f89fb4b13
commit
bdaf226a16
30 files changed
+1486
-109
No files matched your search
+47
-2
@@ -158,7 +158,6 @@ functional behaviour implemented beyond that.
|
||||
| RFC | Capability | Status |
|
||||
|-----|-----------|--------|
|
||||
| RFC 5291 | Outbound Route Filtering (ORF) | 🟡 |
|
||||
| RFC 7911 | ADD-PATH | 🟡 |
|
||||
| RFC 8205 | BGPsec | 🟡 |
|
||||
|
||||
---
|
||||
@@ -171,4 +170,50 @@ https://datatracker.ietf.org/doc/html/rfc9687
|
||||
| Feature | Status |
|
||||
|---------|--------|
|
||||
| `SendHoldTimer` error code (8) defined | ✅ |
|
||||
| Send hold timer enforcement | ❌ |
|
||||
| Send hold timer enforcement (a write that makes no progress ends the session) | ✅ |
|
||||
|
||||
---
|
||||
|
||||
## Route Security
|
||||
|
||||
### RFC 6811 — BGP Prefix Origin Validation
|
||||
https://datatracker.ietf.org/doc/html/rfc6811
|
||||
|
||||
| Feature | Status |
|
||||
|---------|--------|
|
||||
| Validation states (valid, invalid, not found) for routes from external peers | ✅ |
|
||||
| Invalid routes refused, per peer (`accept_rpki_invalid` to take them) | ✅ |
|
||||
| Routes revalidated when the VRPs change, in both directions | ✅ |
|
||||
| Validation of routes from internal peers and of originated routes | ❌ |
|
||||
| Validity as a step of route selection (RFC 8097 communities) | ❌ |
|
||||
|
||||
### RFC 8210 — The RPKI to Router Protocol, Version 1 (and RFC 6810, version 0)
|
||||
https://datatracker.ietf.org/doc/html/rfc8210
|
||||
|
||||
| Feature | Status |
|
||||
|---------|--------|
|
||||
| Reset and serial queries, notifies, cache reset, incremental updates | ✅ |
|
||||
| Refresh, retry and expire intervals; data dropped when it expires | ✅ |
|
||||
| Fallback to version 0; several caches with failover | ✅ |
|
||||
| Transport over plain TCP | ✅ |
|
||||
| Transport over SSH, TLS, TCP-MD5 or TCP-AO | ❌ |
|
||||
| Router keys (BGPsec) | 🟡 read and ignored |
|
||||
|
||||
### RFC 7911 — Advertisement of Multiple Paths in BGP (ADD-PATH)
|
||||
https://datatracker.ietf.org/doc/html/rfc7911
|
||||
|
||||
| Feature | Status |
|
||||
|---------|--------|
|
||||
| Capability negotiation per family and direction | ✅ |
|
||||
| Receiving several routes for a prefix | ✅ |
|
||||
| Sending several routes for a prefix | ❌ (path identifiers are sent; one route each) |
|
||||
|
||||
### RFC 4271 §9.1.2 / RFC 4486 / operational practice — import policy
|
||||
|
||||
| Feature | Status |
|
||||
|---------|--------|
|
||||
| Own AS in path refused (loop detection) | ✅ |
|
||||
| Bogon prefixes and AS numbers, prefix length bounds, first-AS check | ✅ |
|
||||
| Per-peer prefix and origin AS allow-lists | ✅ |
|
||||
| Maximum prefixes with Cease / Maximum Number of Prefixes Reached and hold-down | ✅ |
|
||||
|
||||
Reference in new issue
Block a user