BGP Route Filtering: Prefix Lists, AS-Path Filters, Bogon Rejection en GTSM

15 min leestijd·Matthieu·bgpbird2frrroute-filteringnetwork-securityrpkimanrs|

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 handmatig birdc enable om 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
BGP Route Filtering: Prefix Lists, AS-Path, GTSM