BGP Route Filtering: Prefix Lists, AS-Path Filters, Bogon Rejection en GTSM
Een praktische referentie voor het beveiligen van BGP-sessies op Linux met gelaagde filters. Behandelt prefix-lists, bogon rejection, AS-path filtering, max-prefix limieten en GTSM in zowel BIRD2 als FRR syntax, met verificatiestappen.
RPKI valideert dat een AS bevoegd is om een prefix te originen. Het beschermt niet tegen route leaks, bogon injection, tabelexplosie door een verkeerd geconfigureerde peer, of gespoofde BGP-pakketten van niet-aangrenzende hosts. Dit artikel behandelt de filters die alles aanpakken wat RPKI niet doet.
Elk filter wordt getoond in zowel BIRD2 als FRR syntax, met IPv4- en IPv6-voorbeelden. Elke sectie legt uit wat het filter voorkomt, geeft de configuratie, en toont hoe je verifieert dat het werkt.
Als je RPKI origin validation nog niet hebt ingesteld, doe dat dan eerst. Zie RPKI ROA Setup voor BGP.
Voor een basis BGP-sessie-setup zie BIRD2 BGP-configuratie op Linux (BIRD2) of FRR BGP-configuratie op Linux (FRR). Dit artikel gaat ervan uit dat je al een werkende BGP-sessie hebt en die wilt beveiligen.
Waarom heeft BGP route filtering nodig voorbij RPKI?
BGP route filtering is de praktijk van het accepteren of afwijzen van BGP-aankondigingen op basis van prefix, AS-path of origin-attributen. Het voorkomt route leaks, prefix hijacks, bogon injection en routing table explosion. RPKI dekt alleen origin validation. Zonder aanvullende filters is je router blootgesteld aan elke andere categorie BGP-incidenten.
Dit is wat elke laag voorkomt:
| Filtertype | Geblokkeerde dreiging | Wat er zonder gebeurt |
|---|---|---|
| Bogon prefix rejection | Private/gereserveerde ruimte in DFZ | Je router stuurt verkeer naar RFC 1918-ruimte. Black hole. |
| Small prefix rejection | More-specific hijacks (/25+, /49+) | Een aanvaller adverteert een /32 over een deel van een /24 die je accepteert. Hun route wint door longest match. |
| AS-path bogon filtering | Private/gereserveerde ASNs in paden | Routes met AS 65535 of AS 4200000000 lekken je tabel in. Je stuurt verkeer door op basis van ongeldige paden. |
| AS-path lengthelimiet | Path inflation attacks, tabelopzwelling | Een peer stuurt routes met 50+ AS-hops. Je geheugen loopt vol met nutteloze entries. |
| Max-prefix limiet | Route leaks, sessie-overbelasting | Een peer lekt een volledige tabel (1M+ prefixen) in je sessie. Je router raakt door het geheugen heen. |
| GTSM (TTL security) | Gespoofde BGP-pakketten van externe hosts | Een aanvaller op meerdere hops afstand injecteert BGP OPEN- of UPDATE-pakketten in je sessie. |
| RPKI origin validation | Origin hijacks | Iemand origineert jouw prefix vanuit hun AS. Al behandeld in RPKI ROA Setup voor BGP. |
Echte incidenten tonen waarom elke laag belangrijk is. In 2008 kondigde Pakistan Telecom more-specific routes aan voor YouTube's prefixen om een binnenlandse censuurmaatregel uit te voeren. Die routes lekten naar internationale transitproviders en legden YouTube wereldwijd voor uren plat. Een bogon- of small-prefix filter bij transitproviders had die aankondigingen laten vallen. In juni 2019 lekte een kleine ISP in Pennsylvania (AS396531) per ongeluk routes voor Cloudflare, Amazon en Linode naar Verizon, die ze wereldwijd verspreidde. Een max-prefix limiet had de sessie afgebroken voordat de leak zich verspreidde.
Hoe filter je bogon prefixen in BIRD2 en FRR?
Bogon prefixen zijn adresbereiken die nooit in de globale routeringstabel mogen verschijnen. Ze omvatten RFC 1918 private ruimte, link-local adressen, documentatiebereiken en gereserveerde blokken. Ze accepteren betekent dat je router verkeer probeert door te sturen naar adressen zonder legitieme globale bestemming, wat black holes creëert.
IPv4 bogon prefixen
| Prefix | Referentie | Doel |
|---|---|---|
| 0.0.0.0/8 | RFC 1122 | "This" network |
| 10.0.0.0/8 | RFC 1918 | Private space |
| 100.64.0.0/10 | RFC 6598 | Carrier-grade NAT |
| 127.0.0.0/8 | RFC 1122 | Loopback |
| 169.254.0.0/16 | RFC 3927 | Link-local |
| 172.16.0.0/12 | RFC 1918 | Private space |
| 192.0.2.0/24 | RFC 5737 | TEST-NET-1 |
| 192.88.99.0/24 | RFC 7526 | Deprecated 6to4 relay |
| 192.168.0.0/16 | RFC 1918 | Private space |
| 198.18.0.0/15 | RFC 2544 | Benchmarking |
| 198.51.100.0/24 | RFC 5737 | TEST-NET-2 |
| 203.0.113.0/24 | RFC 5737 | TEST-NET-3 |
| 224.0.0.0/4 | RFC 5771 | Multicast |
| 240.0.0.0/4 | RFC 1112 | Gereserveerd voor toekomstig gebruik |
IPv6 bogon prefixen
| Prefix | Referentie | Doel |
|---|---|---|
| ::/8 | Various | IPv4-compatible, loopback, mapped |
| 100::/64 | RFC 6666 | Discard-only |
| 2001:2::/48 | RFC 5180 | BMWG benchmarking |
| 2001:10::/28 | RFC 4843 | ORCHID |
| 2001:db8::/32 | RFC 3849 | Documentation |
| 3fff::/20 | RFC 9637 | Documentation |
| 2002::/16 | RFC 7526 | Deprecated 6to4 |
| 3ffe::/16 | RFC 3701 | Former 6bone |
| 5f00::/16 | RFC 9602 | SRv6 SIDs |
| fc00::/7 | RFC 4193 | Unique local unicast |
| fe80::/10 | RFC 4291 | Link-local unicast |
| fec0::/10 | RFC 3879 | Deprecated site-local |
| ff00::/8 | RFC 4291 | Multicast |
Deze lijsten veranderen wanneer IANA nieuwe blokken toewijst of oude deprecateert. De Team Cymru bogon reference biedt een BGP-feed van fullbogons (niet-toegewezen + gereserveerde ruimte) die automatisch bijwerkt. Voor statische lijsten, controleer de NLNOG BGP Filter Guide periodiek.
BIRD2 bogon filter
# /etc/bird/bogons.conf - include this from your main bird.conf
define BOGON_PREFIXES_V4 = [
0.0.0.0/8+,
10.0.0.0/8+,
100.64.0.0/10+,
127.0.0.0/8+,
169.254.0.0/16+,
172.16.0.0/12+,
192.0.2.0/24+,
192.88.99.0/24+,
192.168.0.0/16+,
198.18.0.0/15+,
198.51.100.0/24+,
203.0.113.0/24+,
224.0.0.0/4+,
240.0.0.0/4+
];
define BOGON_PREFIXES_V6 = [
::/8+,
0100::/64+,
2001:2::/48+,
2001:10::/28+,
2001:db8::/32+,
3fff::/20+,
2002::/16+,
3ffe::/16+,
5f00::/16+,
fc00::/7+,
fe80::/10+,
fec0::/10+,
ff00::/8+
];
function reject_bogon_prefixes_v4() {
if (net ~ BOGON_PREFIXES_V4) then {
print "REJECTED bogon prefix: ", net, " path: ", bgp_path;
reject;
}
}
function reject_bogon_prefixes_v6() {
if (net ~ BOGON_PREFIXES_V6) then {
print "REJECTED bogon prefix: ", net, " path: ", bgp_path;
reject;
}
}
De + na elk prefix betekent "dit prefix en alle more-specifics." 10.0.0.0/8+ matcht 10.0.0.0/8, 10.0.0.0/9, 10.1.0.0/16, enzovoort. Dit vangt een aanvaller die een /24 binnen RFC 1918-ruimte adverteert.
Roep deze functies aan in je import filter:
filter import_from_upstream_v4 {
reject_bogon_prefixes_v4();
# ... other filters ...
accept;
}
protocol bgp upstream_v4 {
local as 64500;
neighbor 198.51.100.1 as 64501;
ipv4 {
import filter import_from_upstream_v4;
export none;
};
}
FRR bogon filter
! IPv4 bogon prefix-list
ip prefix-list BOGONS_v4 seq 10 deny 0.0.0.0/8 le 32
ip prefix-list BOGONS_v4 seq 20 deny 10.0.0.0/8 le 32
ip prefix-list BOGONS_v4 seq 30 deny 100.64.0.0/10 le 32
ip prefix-list BOGONS_v4 seq 40 deny 127.0.0.0/8 le 32
ip prefix-list BOGONS_v4 seq 50 deny 169.254.0.0/16 le 32
ip prefix-list BOGONS_v4 seq 60 deny 172.16.0.0/12 le 32
ip prefix-list BOGONS_v4 seq 70 deny 192.0.2.0/24 le 32
ip prefix-list BOGONS_v4 seq 80 deny 192.88.99.0/24 le 32
ip prefix-list BOGONS_v4 seq 90 deny 192.168.0.0/16 le 32
ip prefix-list BOGONS_v4 seq 100 deny 198.18.0.0/15 le 32
ip prefix-list BOGONS_v4 seq 110 deny 198.51.100.0/24 le 32
ip prefix-list BOGONS_v4 seq 120 deny 203.0.113.0/24 le 32
ip prefix-list BOGONS_v4 seq 130 deny 224.0.0.0/4 le 32
ip prefix-list BOGONS_v4 seq 140 deny 240.0.0.0/4 le 32
ip prefix-list BOGONS_v4 seq 999 permit 0.0.0.0/0 le 32
! IPv6 bogon prefix-list
ipv6 prefix-list BOGONS_v6 seq 10 deny ::/8 le 128
ipv6 prefix-list BOGONS_v6 seq 20 deny 100::/64 le 128
ipv6 prefix-list BOGONS_v6 seq 30 deny 2001:2::/48 le 128
ipv6 prefix-list BOGONS_v6 seq 40 deny 2001:10::/28 le 128
ipv6 prefix-list BOGONS_v6 seq 50 deny 2001:db8::/32 le 128
ipv6 prefix-list BOGONS_v6 seq 60 deny 3fff::/20 le 128
ipv6 prefix-list BOGONS_v6 seq 70 deny 2002::/16 le 128
ipv6 prefix-list BOGONS_v6 seq 80 deny 3ffe::/16 le 128
ipv6 prefix-list BOGONS_v6 seq 90 deny 5f00::/16 le 128
ipv6 prefix-list BOGONS_v6 seq 100 deny fc00::/7 le 128
ipv6 prefix-list BOGONS_v6 seq 110 deny fe80::/10 le 128
ipv6 prefix-list BOGONS_v6 seq 120 deny fec0::/10 le 128
ipv6 prefix-list BOGONS_v6 seq 130 deny ff00::/8 le 128
ipv6 prefix-list BOGONS_v6 seq 999 permit ::/0 le 128
De le 32 (IPv4) en le 128 (IPv6) clausules matchen het prefix en alle more-specifics, hetzelfde als de +-operator in BIRD2. De laatste permit-regel op seq 999 staat alles toe wat niet hierboven is geweigerd.
Pas de prefix-list toe op je neighbor:
router bgp 64500
neighbor 198.51.100.1 remote-as 64501
address-family ipv4 unicast
neighbor 198.51.100.1 prefix-list BOGONS_v4 in
address-family ipv6 unicast
neighbor 2001:db8::1 prefix-list BOGONS_v6 in
Let op. Die 2001:db8::/32 entry staat in de bogon lijst. Gebruik geen documentatieadressen in productie. Vervang de neighbor-adressen hierboven door je werkelijke peer-IPs.
Te kleine prefixen afwijzen
Routes kleiner dan /24 (IPv4) of /48 (IPv6) zullen niet betrouwbaar propageren in de globale DFZ. Belangrijker nog: ze accepteren opent je voor more-specific hijack attacks. Filter ze bij inbound.
BIRD2:
function reject_small_prefixes_v4() {
if (net.len > 24) then {
print "REJECTED too-small prefix: ", net, " path: ", bgp_path;
reject;
}
}
function reject_small_prefixes_v6() {
if (net.len > 48) then {
print "REJECTED too-small prefix: ", net, " path: ", bgp_path;
reject;
}
}
FRR:
! Add to the same prefix-lists, before the final permit
ip prefix-list BOGONS_v4 seq 150 deny 0.0.0.0/0 ge 25 le 32
ipv6 prefix-list BOGONS_v6 seq 140 deny ::/0 ge 49 le 128
Dit vangt elk prefix dat specifieker is dan /24 (IPv4) of /48 (IPv6). Plaats deze regels vóór de seq 999 permit-entries.
Hoe voorkomen AS-path filters route leaks?
AS-path filters inspecteren de reeks van autonome systemen die een route heeft doorlopen. Ze vangen drie problemen: bogon ASNs die nooit in een pad mogen voorkomen, buitensporig lange paden die wijzen op leaks of manipulatie, en private ASNs die niet zijn verwijderd vóór advertentie.
Bogon ASNs filteren
Bogon ASNs zijn gereserveerde nummers die nooit in een BGP-pad op het publieke internet mogen verschijnen:
| ASN-bereik | Referentie | Doel |
|---|---|---|
| 0 | RFC 7607 | Gereserveerd |
| 23456 | RFC 4893 | AS_TRANS (4-byte AS transitie) |
| 64496-64511 | RFC 5398 | Documentatie/voorbeelden |
| 64512-65534 | RFC 6996 | Privégebruik (16-bit) |
| 65535 | RFC 7300 | Laatste 16-bit ASN |
| 65536-65551 | RFC 5398 | Documentatie/voorbeelden (32-bit) |
| 65552-131071 | IANA | Gereserveerd |
| 4200000000-4294967294 | RFC 6996 | Privégebruik (32-bit) |
| 4294967295 | RFC 7300 | Laatste 32-bit ASN |
BIRD2:
define BOGON_ASNS = [
0,
23456,
64496..64511,
64512..65534,
65535,
65536..65551,
65552..131071,
4200000000..4294967294,
4294967295
];
function reject_bogon_asns()
int set bogon_asns;
{
bogon_asns = BOGON_ASNS;
if (bgp_path ~ bogon_asns) then {
print "REJECTED bogon ASN in path: ", net, " path: ", bgp_path;
reject;
}
}
De bgp_path ~ bogon_asns-operator controleert of een ASN in het pad lid is van de set. Een enkele bogon ASN ergens in het pad triggert een weigering.
FRR:
bgp as-path access-list BOGON_ASNS deny _0_
bgp as-path access-list BOGON_ASNS deny _23456_
bgp as-path access-list BOGON_ASNS deny _6449[6-9]_
bgp as-path access-list BOGON_ASNS deny _6450[0-9]_
bgp as-path access-list BOGON_ASNS deny _6451[01]_
bgp as-path access-list BOGON_ASNS deny _64[5-9][1-9][2-9]_
bgp as-path access-list BOGON_ASNS deny _6[5-9][0-9][0-9][0-9]_
bgp as-path access-list BOGON_ASNS deny _[1-9][0-9][0-9][0-9][0-9]_
bgp as-path access-list BOGON_ASNS deny _[1-3][0-9][0-9][0-9][0-9][0-9]_
bgp as-path access-list BOGON_ASNS permit .*
FRR gebruikt regex-matching op de AS-path string. De underscores _ matchen AS-path-scheidingstekens (spatie, begin, einde). Deze regex-aanpak is minder precies dan de integer set matching van BIRD2. Voor een eenvoudigere maar minder granulaire aanpak gebruik je een route-map met de as-path access-list:
route-map IMPORT_FILTER deny 10
match as-path BOGON_ASNS
route-map IMPORT_FILTER permit 100
router bgp 64500
address-family ipv4 unicast
neighbor 198.51.100.1 route-map IMPORT_FILTER in
Opmerking: de bovenstaande regex-patronen zijn vereenvoudigd. Het volledig bereik van 32-bit private ASNs (4200000000-4294967294) matchen met regex is foutgevoelig. Gebruik voor productie-deployments bgpq4 om prefix-lists en AS-path filters te genereren uit IRR-data, wat zowel nauwkeuriger als automatiseerbaar is.
AS-path lengte beperken
Een legitiem BGP-pad overschrijdt zelden 10-15 ASNs. Paden langer dan dat wijzen doorgaans op een route leak, padmanipulatie of prepending die fout is gegaan. Stel een harde limiet in.
BIRD2:
function reject_long_paths() {
if (bgp_path.len > 25) then {
print "REJECTED long AS-path (", bgp_path.len, "): ", net, " path: ", bgp_path;
reject;
}
}
FRR:
bgp as-path access-list LONG_PATHS deny ^([0-9]+_){25,}
bgp as-path access-list LONG_PATHS permit .*
route-map IMPORT_FILTER deny 20
match as-path LONG_PATHS
Een limiet van 25 is conservatief. De meeste legitieme routes hebben paden onder de 10. Als je een volledige tabel ontvangt, inspecteer dan de langste paden in je RIB voordat je een drempel kiest:
# BIRD2
birdc 'show route where bgp_path.len > 15' | head -20
# FRR
vtysh -c "show ip bgp regexp ^([0-9]+_){15,}"
Private ASNs verwijderen bij outbound
Als je iBGP gebruikt met private ASNs intern, zorg dan dat ze niet naar je upstreams lekken.
BIRD2:
filter export_to_upstream_v4 {
# Strip private ASNs before advertising
bgp_path.delete([64512..65534, 4200000000..4294967294]);
# ... your export policy ...
accept;
}
FRR:
router bgp 64500
address-family ipv4 unicast
neighbor 198.51.100.1 remove-private-AS all
Het all-sleutelwoord verwijdert elke private ASN, ook wanneer publieke ASNs aanwezig zijn in het pad. Zonder all verwijdert FRR alleen private ASNs als het volledige pad uitsluitend private ASNs bevat.
Wat is de juiste max-prefix limiet voor een BGP-sessie?
Een max-prefix limiet is een veiligheidsventiel dat een BGP-sessie afbreekt als een peer meer prefixen adverteert dan de ingestelde drempel. Het voorkomt routing table explosion wanneer een peer per ongeluk een volledige tabel lekt of gehijacked wordt. Zonder dit kan een enkele verkeerd geconfigureerde peer je router door het geheugen laten gaan.
Stel de limiet in op basis van wat je van elke peer verwacht:
| Peer-type | Verwachte prefixen (IPv4) | Aanbevolen limiet | Aanbevolen limiet (IPv6) |
|---|---|---|---|
| Full table upstream | ~1.200.000 (maart 2026) | 1.500.000 | 300.000 |
| Partial table / IXP peer | Varieert | 1,5x huidige telling | 1,5x huidige telling |
| Customer single-homed | 1-10 | 50 | 50 |
| Customer multi-homed | 10-100 | 200 | 200 |
Controleer de huidige volledige tabelgrootte op bgp.potaroo.net voordat je upstream-limieten instelt. Stel de limiet in op ongeveer 1,2x de verwachte telling om normale groei op te vangen zonder valse triggers.
BIRD2:
protocol bgp upstream_v4 {
local as 64500;
neighbor 198.51.100.1 as 64501;
ipv4 {
import limit 1500000 action restart;
import filter import_from_upstream_v4;
export none;
};
}
protocol bgp customer_v4 {
local as 64500;
neighbor 203.0.113.10 as 64502;
ipv4 {
import limit 50 action disable;
import filter import_from_customer_v4;
export filter export_to_customer_v4;
};
}
BIRD2 biedt drie acties wanneer de limiet wordt bereikt:
action restart- breekt de sessie af en herstart na een vertraging. Het beste voor upstreams.action disable- breekt af en schakelt het protocol uit. Vereist handmatigbirdc enableom te herstellen. Het beste voor customers waarbij een limietoverschrijding aangeeft dat er iets serieus mis is.action block- stopt met het importeren van nieuwe routes maar houdt de sessie actief. Nuttig als je bestaande routes wilt behouden terwijl je onderzoek doet.
FRR:
router bgp 64500
neighbor 198.51.100.1 remote-as 64501
address-family ipv4 unicast
neighbor 198.51.100.1 maximum-prefix 1500000 90 restart 5
neighbor 203.0.113.10 remote-as 64502
address-family ipv4 unicast
neighbor 203.0.113.10 maximum-prefix 50 80
In FRR betekent maximum-prefix 1500000 90 restart 5: waarschuw bij 90% (1.350.000 prefixen), breek af bij 1.500.000, en herstart de sessie na 5 minuten. Zonder het restart-sleutelwoord breekt FRR de sessie af en is een handmatige clear bgp neighbor nodig om te herstellen.
Max-prefix configuratie verifiëren
# BIRD2 - check current prefix count and limit
birdc show protocols all upstream_v4 | grep -E "Routes|Limit"
# FRR - check prefix count per neighbor
vtysh -c "show ip bgp summary"
De uitvoer toont het huidige prefix-aantal naast de geconfigureerde limiet. Als de telling dicht bij de limiet komt, verhoog de drempel dan voordat die triggert.
Hoe beschermt GTSM BGP-sessies tegen gespoofde pakketten?
GTSM (Generalized TTL Security Mechanism, RFC 5082) beperkt geaccepteerde BGP-pakketten tot direct verbonden peers door het TTL/Hop Limit-veld te controleren. Wanneer ingeschakeld, worden BGP-pakketten verzonden met TTL 255. De ontvanger verwijdert elk BGP-pakket met een TTL lager dan 254 (voor een direct verbonden peer). Omdat routers de TTL bij elke hop decrementeren, kan een aanvaller op meer dan één hop afstand geen pakketten sturen die aankomen met TTL 255.
Dit blokkeert remote TCP RST injection, SYN floods gericht op BGP-poort 179, en gecraftte BGP OPEN/UPDATE-pakketten van niet-aangrenzende aanvallers. GTSM is wederzijds uitsluitend met eBGP multihop op dezelfde sessie. Beide peers moeten het inschakelen.
BIRD2:
protocol bgp upstream_v4 {
local as 64500;
neighbor 198.51.100.1 as 64501;
ttl security yes;
ipv4 {
import limit 1500000 action restart;
import filter import_from_upstream_v4;
export none;
};
}
FRR:
router bgp 64500
neighbor 198.51.100.1 remote-as 64501
neighbor 198.51.100.1 ttl-security hops 1
De hops 1 betekent dat de peer precies 1 hop verwijderd moet zijn (direct verbonden). Stel dit in op het werkelijke aantal hops. Voor eBGP-peers via een IXP switching fabric is hops 1 correct. Voor multihop-sessies (bijv. BGP over een GRE-tunnel) kun je GTSM niet gebruiken. Gebruik in dat geval MD5-authenticatie:
BIRD2 MD5-alternatief:
protocol bgp multihop_peer {
local as 64500;
neighbor 198.51.100.5 as 64503;
multihop 2;
password "your-md5-secret";
# ...
}
FRR MD5-alternatief:
router bgp 64500
neighbor 198.51.100.5 remote-as 64503
neighbor 198.51.100.5 ebgp-multihop 2
neighbor 198.51.100.5 password your-md5-secret
Sla het MD5-wachtwoord op in een beperkt bestand (chmod 600) in plaats van in de hoofdconfiguratie. Voor FRR, verwijs ernaar vanuit /etc/frr/frr.conf, dat al 640 moet zijn met eigenaar frr:frr. Voor BIRD2, houd /etc/bird/bird.conf op 640 met eigenaar bird:bird.
Welke BGP-filters vereist MANRS?
MANRS (Mutually Agreed Norms for Routing Security) definieert basisacties voor netwerkoperators. Acties 1, 3 en 4 zijn vereist om MANRS-deelnemer te worden. Hier is hoe de filters in dit artikel overeenkomen met MANRS-acties.
Actie 1: Voorkom verspreiding van onjuiste routeringsinformatie.
Dit is de kernfilteractie. Het vereist expliciete prefix-level filters op klantverbindingen en raadt AS-path filters aan om route leaks te voorkomen.
| Filter uit dit artikel | MANRS Actie 1 dekking |
|---|---|
| Prefix-list filtering (bogons) | Voorkomt adverteren/accepteren van gereserveerde ruimte |
| Small prefix rejection | Blokkeert more-specific routes die wijzen op hijacks |
| AS-path bogon filtering | Weigert routes met private/gereserveerde ASNs |
| Max-prefix limieten | Stopt verspreiding van gelekte volledige tabellen |
| Customer prefix filters | Niet in dit artikel. Bouw deze per-customer op uit IRR met bgpq4. |
Actie 2 (aanbevolen): Voorkom verkeer met gespoofde bronadressen.
Geen BGP-filter. Dit is BCP 38/84 source address validation (uRPF). Buiten de scope van dit artikel maar even belangrijk.
Actie 3: Faciliteer globale operationele communicatie.
Houd je contactgegevens actueel in PeeringDB en je RIR-database. Geen filter, maar operators die goede filters draaien houden ook doorgaans hun contactgegevens bij.
Actie 4: Faciliteer routeringsinformatie op globale schaal.
Publiceer je routeringsbeleid in IRR (RIPE, RADB) met RPSL-objecten. Maak ROAs aan voor RPKI. Dit maakt het mogelijk voor je peers om nauwkeurige prefix-filters te bouwen voor jouw aankondigingen.
De combinatie van bogon filtering (prefixen + ASNs) + small prefix rejection + max-prefix limieten + customer prefix-lists dekt MANRS Actie 1. Voeg RPKI toe (RPKI ROA Setup voor BGP) en IRR-registratie voor Actie 4.
Alles samenvoegen: een compleet import filter
Hier is een gecombineerd import filter met alle bovenstaande technieken.
BIRD2 compleet import filter
# /etc/bird/filters.conf
include "/etc/bird/bogons.conf"; # BOGON_PREFIXES_V4, BOGON_PREFIXES_V6, BOGON_ASNS
function import_checks_v4() {
# 1. Reject bogon prefixes
if (net ~ BOGON_PREFIXES_V4) then {
print "REJECT bogon prefix: ", net, " ", bgp_path;
reject;
}
# 2. Reject too-small prefixes
if (net.len > 24) then {
print "REJECT small prefix: ", net, " ", bgp_path;
reject;
}
# 3. Reject bogon ASNs in path
if (bgp_path ~ [0, 23456, 64496..64511, 64512..65534, 65535,
65536..65551, 65552..131071,
4200000000..4294967294, 4294967295]) then {
print "REJECT bogon ASN: ", net, " ", bgp_path;
reject;
}
# 4. Reject excessively long paths
if (bgp_path.len > 25) then {
print "REJECT long path: ", net, " ", bgp_path;
reject;
}
# 5. Reject RPKI invalid (if RPKI is configured)
if (roa_check(rpki4, net, bgp_path.last) = ROA_INVALID) then {
print "REJECT RPKI invalid: ", net, " ", bgp_path;
reject;
}
}
filter import_upstream_v4 {
import_checks_v4();
accept;
}
protocol bgp upstream_v4 {
local as 64500;
neighbor 198.51.100.1 as 64501;
ttl security yes;
ipv4 {
import limit 1500000 action restart;
import filter import_upstream_v4;
export none;
};
}
FRR compleet import filter
! /etc/frr/frr.conf
! --- Prefix lists (bogons + small prefix rejection) ---
ip prefix-list IMPORT_V4 seq 10 deny 0.0.0.0/8 le 32
ip prefix-list IMPORT_V4 seq 20 deny 10.0.0.0/8 le 32
ip prefix-list IMPORT_V4 seq 30 deny 100.64.0.0/10 le 32
ip prefix-list IMPORT_V4 seq 40 deny 127.0.0.0/8 le 32
ip prefix-list IMPORT_V4 seq 50 deny 169.254.0.0/16 le 32
ip prefix-list IMPORT_V4 seq 60 deny 172.16.0.0/12 le 32
ip prefix-list IMPORT_V4 seq 70 deny 192.0.2.0/24 le 32
ip prefix-list IMPORT_V4 seq 80 deny 192.88.99.0/24 le 32
ip prefix-list IMPORT_V4 seq 90 deny 192.168.0.0/16 le 32
ip prefix-list IMPORT_V4 seq 100 deny 198.18.0.0/15 le 32
ip prefix-list IMPORT_V4 seq 110 deny 198.51.100.0/24 le 32
ip prefix-list IMPORT_V4 seq 120 deny 203.0.113.0/24 le 32
ip prefix-list IMPORT_V4 seq 130 deny 224.0.0.0/4 le 32
ip prefix-list IMPORT_V4 seq 140 deny 240.0.0.0/4 le 32
ip prefix-list IMPORT_V4 seq 150 deny 0.0.0.0/0 ge 25 le 32
ip prefix-list IMPORT_V4 seq 999 permit 0.0.0.0/0 le 32
! --- AS-path filters (bogon ASNs + path length) ---
bgp as-path access-list BOGON_ASNS deny _0_
bgp as-path access-list BOGON_ASNS deny _23456_
bgp as-path access-list BOGON_ASNS deny _6449[6-9]_
bgp as-path access-list BOGON_ASNS deny _6450[0-9]_
bgp as-path access-list BOGON_ASNS deny _6451[01]_
bgp as-path access-list BOGON_ASNS permit .*
bgp as-path access-list LONG_PATHS deny ^([0-9]+_){25,}
bgp as-path access-list LONG_PATHS permit .*
! --- Route-map combining all checks ---
route-map IMPORT_UPSTREAM deny 10
match as-path BOGON_ASNS
route-map IMPORT_UPSTREAM deny 20
match as-path LONG_PATHS
route-map IMPORT_UPSTREAM permit 100
! --- BGP neighbor configuration ---
router bgp 64500
neighbor 198.51.100.1 remote-as 64501
neighbor 198.51.100.1 ttl-security hops 1
address-family ipv4 unicast
neighbor 198.51.100.1 prefix-list IMPORT_V4 in
neighbor 198.51.100.1 route-map IMPORT_UPSTREAM in
neighbor 198.51.100.1 maximum-prefix 1500000 90 restart 5
In FRR worden zowel de prefix-list als de route-map geëvalueerd. De prefix-list draait eerst en verwijdert bogon-prefixen en te kleine prefixen. Routes die de prefix-list passeren, komen vervolgens bij de route-map terecht, die AS-path filters controleert. Beide moeten de route toestaan om geaccepteerd te worden.
Hoe verifieer je dat BGP route filters werken?
Filters zijn alleen nuttig als ze daadwerkelijk weigeren wat ze moeten weigeren. Verifieer na elke wijziging.
BIRD2 verificatie
# Check what routes were rejected (requires print statements in filters)
grep "REJECT" /var/log/bird.log | tail -20
# Show the routing table with filter details
birdc show route filtered
# Show routes from a specific protocol
birdc show route protocol upstream_v4
# Count accepted routes per protocol
birdc show protocols all upstream_v4 | grep "Routes:"
# Test a specific prefix against your import filter
birdc show route for 10.0.0.0/8 all
Het commando show route filtered toont routes die ontvangen maar afgewezen zijn door het import filter. Als je bogon filter werkt, zie je nul bogon-prefixen in de geaccepteerde tabel, en ontvangen bogons in de gefilterde tabel.
FRR verificatie
# Show accepted routes from a neighbor
vtysh -c "show ip bgp neighbors 198.51.100.1 received-routes"
# Show routes filtered by inbound policy
vtysh -c "show ip bgp neighbors 198.51.100.1 filtered-routes"
# Check the prefix count per neighbor
vtysh -c "show ip bgp summary"
# Test if a specific prefix is accepted
vtysh -c "show ip bgp 10.0.0.0/8"
# Check max-prefix status
vtysh -c "show ip bgp neighbors 198.51.100.1" | grep -A2 "Maximum prefix"
Voor received-routes en filtered-routes moet je soft-reconfiguration inbound inschakelen op de neighbor:
router bgp 64500
address-family ipv4 unicast
neighbor 198.51.100.1 soft-reconfiguration inbound
Dit gebruikt extra geheugen (slaat alle ontvangen routes op vóór filtering). Op een full-table sessie is dat ruwweg 2x het geheugen voor de RIB. Gebruik het op productie-routers met beperkt RAM selectief.
Externe verificatie
Je filters beschermen je eigen RIB. Om te verifiëren wat je naar anderen adverteert, gebruik externe looking glasses:
- bgp.tools - zoek je ASN om te zien welke prefixen je wereldwijd adverteert
- RIPE RIS - BGP routeringsinformatieservice, toont routezichtbaarheid over collectors
- Hurricane Electric BGP Toolkit - prefix en ASN lookup
Controleer deze na filterwijzigingen om te bevestigen dat je niet per ongeluk legitieme routes filtert of routes lekt die je niet zou moeten adverteren.
Voor geautomatiseerde monitoring, zie .
BIRD2 vs FRR syntax vergelijking
Snelle referentie voor het vertalen tussen de twee daemons:
| Filtertype | BIRD2 | FRR |
|---|---|---|
| Bogon prefix | if (net ~ BOGON_PREFIXES) then reject |
ip prefix-list BOGONS deny 10.0.0.0/8 le 32 |
| Small prefix | if (net.len > 24) then reject |
ip prefix-list X deny 0.0.0.0/0 ge 25 le 32 |
| Bogon ASN | if (bgp_path ~ [64512..65534]) then reject |
bgp as-path access-list X deny _64[5-9][1-9][2-9]_ |
| Path length | if (bgp_path.len > 25) then reject |
bgp as-path access-list X deny ^([0-9]+_){25,} |
| Max-prefix | import limit 50 action disable |
neighbor X maximum-prefix 50 |
| GTSM | ttl security yes |
neighbor X ttl-security hops 1 |
| MD5 auth | password "secret" |
neighbor X password secret |
| Strip private AS | bgp_path.delete([64512..65534]) |
neighbor X remove-private-AS all |
| Filter toepassen | import filter name |
neighbor X prefix-list/route-map name in |
BIRD2 gebruikt een enkele filterfunctie die alle controles combineert. FRR splitst controles over prefix-lists (prefix matching), as-path access-lists (path matching) en route-maps (meerdere matchcondities combineren). Beide aanpakken werken. De aanpak van BIRD2 is leesbaarder voor complex beleid. De aanpak van FRR is vertrouwder voor Cisco-operators.
Iets gaat fout?
Sessie afgebroken door max-prefix: Controleer journalctl -u bird of journalctl -u frr op het bericht over de limietoverschrijding. Verhoog de limiet als de peer legitiem gegroeid is, of onderzoek als het een leak is. In BIRD2 opnieuw inschakelen met birdc enable upstream_v4. In FRR wissen met vtysh -c "clear bgp 198.51.100.1".
Legitieme routes worden gefilterd: Controleer birdc show route filtered of vtysh -c "show ip bgp neighbors X filtered-routes" om te zien wat er is afgewezen. Veelvoorkomende oorzaak: je bogon-lijst is te agressief, of je small-prefix drempel weigert legitieme /25s van een customer. Pas het filter aan en herlaad: birdc configure of vtysh -c "write memory" dan systemctl reload frr.
GTSM weigert een geldige peer: Beide kanten moeten GTSM inschakelen. Als de ene kant het aan heeft en de andere niet, komen pakketten aan met TTL 1 en worden ze verwijderd door de GTSM-ingeschakelde kant. Controleer met tcpdump -i eth0 port 179 -v en kijk naar de TTL-waarde.
Filters worden niet van kracht na wijziging: In BIRD2 voer birdc configure uit om te herladen. In FRR, als je een prefix-list of route-map wijzigt, trigger een soft reset: vtysh -c "clear bgp 198.51.100.1 in". Zonder dit worden bestaande routes in de RIB niet opnieuw geëvalueerd tegen het nieuwe filter.
Logs: Beide daemons loggen standaard via het systemd journal.
# BIRD2
journalctl -u bird -f
# FRR
journalctl -u frr -f
De print-statements in BIRD2-filterfuncties schrijven naar het bird-log. In FRR schakel debug-logging in met debug bgp updates in vtysh voor tijdelijke probleemoplossing. Schakel het uit wanneer je klaar bent, want het genereert grote hoeveelheden loguitvoer.
Dit artikel maakt deel uit van de BGP Bring Your Own IP op een VPS-serie.
Copyright 2026 Virtua.Cloud. Alle rechten voorbehouden. Deze inhoud is een origineel werk van het Virtua.Cloud-team. Reproductie, herpublicatie of herdistributie zonder schriftelijke toestemming is verboden.
Klaar om het zelf te proberen?
Deploy uw eigen server in seconden. Linux, Windows of FreeBSD.
Bekijk VPS-aanbod