Judge every route a peer announces: import policy, prefix limit, hold-down
A configured peer could announce any prefix with any path, in any number, and all of it was stored and could be chosen as best. Each peer now has an import policy, and every route goes through it before it reaches the routing table. Checks that hold for any peer unless turned off for it: - no prefixes that are not routed on the Internet (private, loopback, link-local, documentation, multicast, reserved; for IPv6, anything outside global unicast); - nothing longer than /24 or /48, no default route, nothing shorter than /8 or /16; - no reserved, private or documentation AS number in the path; - a path that begins with the peer's own AS (turned off for a route server), and of at most 64 AS numbers. Always: a route with our own AS number in its path is refused. RFC 4271 requires this loop check and it was missing. Per peer, if configured: the prefixes it may announce, each with an optional longest more-specific, and the AS numbers its routes may originate from. This is the list generated from the routing registries. max_prefixes limits how many routes a peer may have. One more ends the session with Cease / Maximum Number of Prefixes Reached, and the peer is kept down for hold_down_seconds (ten minutes unless set): its connections are not taken and it is not dialled. Refused routes do not count towards the limit. A refused route is withdrawn rather than ignored, so that it replaces whatever the peer had announced for it before. On a session with two-octet AS numbers the path is judged with its AS4_PATH merged in, so that the real AS numbers are what is checked. Peers that are not configured (accept_unconfigured_peers, for test networks) get a policy that takes everything but loops. Refusals are counted in bgp_routes_rejected_total by reason. The status page and /api/peers show, for each session, how many routes the peer has and how many were refused. The server warns at startup about peers with no limit. The prefix check costs about 4 ns a route with the default policy; the end-to-end benchmark is unchanged. Also: the benchmark's server AS is one that is in none of its generated paths, and a table test that depended on the hasher's seed is fixed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
1 parent
630c175918
commit
e2b1979e38
24 files changed
+1745
-39
No files matched your search
Vendored
+15
@@ -22,6 +22,21 @@ peers {
|
||||
# Take several routes for a prefix from this peer, if it offers to send
|
||||
# them (ADD-PATH). Also ADD_PATH_SEND and ADD_PATH_BOTH. Off by default.
|
||||
add_path: ADD_PATH_RECEIVE
|
||||
# Which of the peer's routes are taken. Without this block the general
|
||||
# checks still apply: no private or reserved prefixes or AS numbers,
|
||||
# nothing longer than /24 or /48, no default route, and a path that
|
||||
# begins with the peer's AS. This example is a test network that uses
|
||||
# exactly such prefixes and AS numbers, so it takes them.
|
||||
import {
|
||||
# More routes than this ends the session and keeps the peer down
|
||||
# for hold_down_seconds (600 unless set).
|
||||
max_prefixes: 1000
|
||||
accept_bogons: true
|
||||
# For a real peer: the prefixes and origin ASes it may announce,
|
||||
# as generated from the routing registries.
|
||||
# prefixes { prefix: "193.0.0.0/21" max_length: 24 }
|
||||
# origin_asns: 3333
|
||||
}
|
||||
}
|
||||
connect_retry_seconds: 5
|
||||
|
||||
|
||||
Reference in new issue
Block a user