o co w tym wszystkim chodzi?
w ramach próby ochrony internetu przed atakami z “porywaniem” prefiksów BGP, grupa w IETF postanowiła ustandaryzować certyfikację zasobów. “porywanie” prefiksu BGP to sytuacja, gdy nieautoryzowany AS rozgłasza ten lub dokładniejszy prefiks, i/lub fałszuje jego Origin AS aby przechwycić lub przekierować ruch do prefiksu. infrastruktura certyfikacji, utrzymywana przez RIRy (w Europie jest to RIPE) to właśnie tytułowy RPKI - Resource Public Key Infrastructure. utrzymują oni bazę danych, pozwalającą zweryfikować kryptograficznie “podpisy” dla atrybutów takich jak prefiks oraz Origin AS.
w idealnym świecie, sam dla siebie utrzymujesz kopię serwera przechowującego te informacje i wskazujesz go swoim routerom. czasami jednak okazuje się, że to zbyt duży wysiłek lub wymagałby dodatkowych zasobów. poniżej rozwiązanie dla tego problemu.
serwer RPKI
utrzymuje otwarty dla wszystkich serwer tras, a dokładniej walidator tras, dystrybuujący wyżej wymienione informacje ze wszystkich RIRów do każdego chętnego zestawić sesję.
jeśli chcesz zacząć swoją przygodę z RPKI, sugeruję zacząć od podpisania własnych prefiksów. w internecie, jak zwykle, dostępne jest parę dobrych poradników jak to zrobić.
kolejnym krokiem będzie podjęcie decyzji, co chcesz robić z prefiksami, które nie przechodzą procesu walidacji. router otrzymując prefiks w ramach sesji BGP może porównać go z informacją zawartą w tablicy RPKI (“zwalidować”).
prefiks w tablicy BGP (na przykład 1.1.0.0/16) zawiera sam prefiks oraz jego atrybuty BGP takie jak np. ścieżka AS_PATH (ścieżka, którą prefiks rozgłaszany był do tej pory). RPKI zawiera natomiast rekordy ROA, które określą prefiks razem z dopuszczalną długością (np. 1.1.0.0/16-24) oraz ASN z którego prefiks może być pierwotnie rozgłaszany (np. 1024).
w wyniku walidacji, prefiks znajdzie się w jednym z trzech stanów:
- VALID (prawidłowy) - prefiks znajduje się w obu tabelach i spełnia warunki w tablicy RPKI;
- INVALID (nieprawidłowy) - prefiks znajduje się w obu tabelach, ale nie pasuje do definicji w tablicy RPKI; może to oznaczać, że ktoś wstrzykuje Ci “lewe” prefiksy do tablicy BGP, lub po prostu pomylił się podpisująć swoje prefiksy (niestety nadal się to zdarza)
- NOT FOUND (nie znaleziono) - prefiks znajduje się w tablicy BGP ale nie ma odpowiednika w tablicy RPKI; niestety, nadal ponad 65% prefiksów nie jest podpisane przez swoich właścicieli
jeśli zarządzasz “ślepą” siecią (nie realizujesz tranzytu ruchu dla innych) i jesteś podłączony do jednego nadrzędnego dostawcy, niestety nawet jeśli zdecydujesz odrzucać prefiksy “INVALID”, nadal najprawdopodobniej wyślesz ruch przez trasę domyślną (możesz też bohatersko zdecydować nie wysyłać tego ruchu, ale… efektywność takiego działania będzie zapewne dosyć ograniczona).
jeśli jesteś podłączony do co najmniej dwóch operatorów nadrzędnych - walidacja zaczyna mieć sens. w szczególności, jeśli okazuje się że otrzymujesz prefiksy BGP przechodzące walidację z dwoma różnymi stanami końcowymi. w tym momencie, ignorowanie prefiksów (informacj routingowej) walidowanej do stanu “INVALID” ma zdecydowany sens.
no dobra, pokaż konfigurację
zanim zaczniesz podejmij decyzję - czy chcesz odrzucać informację o routingu na podstawie statusu walidacji czy tylko np. zaniżyć prefiksom niezwalidowanym pomyślnie wartość lokalnej preferencji BGP (local preference). ma to o tyle duże znaczenie, że w części topologii odrzucanie informacji “INVALID” w ogóle, może spowodować pętle routingowe!
- sesje zestawiamy protokołem RTR w oparciu o TCP (nie SSH!)
- adresy do zestawienia sesji - proponuje skonfigurować minimum dwa dowolnego rodzaju (IPv4 i/lub IPv60; pamiętaj, że otrzymasz rekordy zarówno dla IPv4 jak i IPv6 niezależnie od typu adresu sesji transportowej - nie musisz konfigurować wszystkich adresów:
- IPv4 -
85.232.240.141
lub195.136.71.52
- IPv6 -
2001:1a68:2c:2::141
lub2a00:4120:8000:a::10
- IPv4 -
- timery - 3600 dla odświeżenia
przykładowa konfiguracje sesji poniżej.
konfiguracja dla Cisco IOS-XE
dla Cisco IOS XE, od wersji 17, proces BGP domyślnie wykonuje walidacje ścieżek i powinien odrzucać prefiksy zwalidowane do stanu “INVALID” z procesu wyboru najlepszej ścieżki; najprostsza konfiguracja wygląda zatem tak:
router bgp X
bgp rpki server tcp 85.232.240.141 port 3323 refresh 3600
bgp rpki server tcp 195.136.71.52 port 3323 refresh 3600
bgp rpki server tcp 2A00:4120:8000:A::10 port 3323 refresh 3600
bgp rpki server tcp 2001:1A68:2C:2::141 port 3323 refresh 3600
po skonfigurowaniu serwerów, możesz sprawdzić jak wygląda synchronizacja rekordów z poszczególnymi serwerami - poniżej przykład (ilość prefiksów się w końcu wyrówna):
ios-xe-rtr#sh bgp ipv4 unicast rpki servers | i SOVC|Prefixes
BGP SOVC neighbor is 195.136.71.52/3323 connected to port 3323
Prefixes 316421
BGP SOVC neighbor is 2A00:4120:8000:A::10/3323 connected to port 3323
Prefixes 316422
BGP SOVC neighbor is 2001:1A68:2C:2::141/3323 connected to port 3323
Prefixes 316427
BGP SOVC neighbor is 85.232.240.141/3323 connected to port 3323
Prefixes 316410
jeśli chcesz zatrzymać każdy prefiks i manipulować ich atrybutami niezależnie od samego procesu walidacji, musisz włączyć takie zachowanie wprost pod odpowiednią rodziną protokołów:
router bgp X
address family ipv4 unicast
bgp bestpath prefix-validate allow-invalid
address family ipv6 unicast
bgp bestpath prefix-validate allow-invalid
w tym momencie w procesie BGP będziesz miał dostępne prefiksy ze wszystkimi trzema stanami walidacji - aczkolwiek jest to mniej zalecane.
konfiguracja dla Cisco IOS XR
dla Cisco IOS XR, ta sama konfiguracja wyglądać będzie tak:
router bgp X
rpki server 195.136.71.52
transport tcp port 3323
refresh-time 3600
!
rpki server 85.232.240.141
transport tcp port 3323
refresh-time 3600
!
rpki server 2001:1a68:2c:2::141
transport tcp port 3323
refresh-time 3600
!
rpki server 2a00:4120:8000:a::10
transport tcp port 3323
refresh-time 3600
!
address-family ipv4 unicast
bgp origin-as validation enable
bgp bestpath origin-as use validity
!
address-family ipv6 unicast
bgp origin-as validation enable
bgp bestpath origin-as use validity
!
po zestawieniu sesji, powinno być widać wszystkie skonfigurowane serwery:
RP/0/RP0/CPU0:xr-router#sh bgp rpki server summary
Hostname/Address Transport State Time ROAs (IPv4/IPv6)
195.136.71.52 TCP:3323 ESTAB 00:00:14 263152/53269
2001:1a68:2c:2::141 TCP:3323 ESTAB 00:00:14 263156/53271
2a00:4120:8000:a::10 TCP:3323 ESTAB 00:00:14 263152/53269
85.232.240.141 TCP:3323 ESTAB 00:04:14 263197/53285
oraz:
RP/0/RP0/CPU0:xr-router#sh bgp rpki summary
RPKI cache-servers configured: 4
RPKI database
Total IPv4 net/path: 238761/263197
Table Version: 4100272
Scanner Version: 4100272
Total IPv6 net/path: 49812/53286
Table Version: 804305
Scanner Version: 804305
konfiguracja Juniper JunOS
konfiguracja podstawowa (ponownie, nie musisz konfigurować wszystkich czterech serwerów, każdy z nich przekazuje rekordy IPv4 i IPv6):
set routing-options validation group LUKE-RPKI-SERVERS session 85.232.240.141 port 3323
set routing-options validation group LUKE-RPKI-SERVERS session 195.136.71.52 port 3323
set routing-options validation group LUKE-RPKI-SERVERS session 2001:1a68:2c:2::141 port 3323
set routing-options validation group LUKE-RPKI-SERVERS session 2a00:4120:8000:a::10 port 3323
tak powinien wyglądać efekt podniesienia się skonfigurowanych sesji:
root@vmx1> show validation session
Session State Flaps Uptime #IPv4/IPv6 records
85.232.240.141 Up 0 00:00:43 263156/53271
195.136.71.52 Up 0 00:00:43 263156/53271
2001:1a68:2c:2::141 Up 0 00:00:43 263156/53271
2a00:4120:8000:a::10 Up 0 00:00:43 263156/53271
następnie musisz dołączyć politykę walidacji prefiksów do swojej polityki BGP dla importu od sąsiadów (zanim cokolwiek zaakceptujesz):
set policy-options community origin-validation-state-invalid members 0x4300:0.0.0.0:2
set policy-options community origin-validation-state-unknown members 0x4300:0.0.0.0:1
set policy-options community origin-validation-state-valid members 0x4300:0.0.0.0:0
set policy-options policy-statement RPKI-POLICY term valid from protocol bgp
set policy-options policy-statement RPKI-POLICY term valid from validation-database valid
set policy-options policy-statement RPKI-POLICY term valid then validation-state valid
set policy-options policy-statement RPKI-POLICY term valid then community add origin-validation-state-valid
set policy-options policy-statement RPKI-POLICY term valid then next policy
set policy-options policy-statement RPKI-POLICY term unknown from protocol bgp
set policy-options policy-statement RPKI-POLICY term unknown from validation-database unknown
set policy-options policy-statement RPKI-POLICY term unknown then validation-state unknown
set policy-options policy-statement RPKI-POLICY term unknown then community add origin-validation-state-unknown
set policy-options policy-statement RPKI-POLICY term unknown then next policy
set policy-options policy-statement RPKI-POLICY term invalid from protocol bgp
set policy-options policy-statement RPKI-POLICY term invalid from validation-database invalid
set policy-options policy-statement RPKI-POLICY term invalid then validation-state invalid
set policy-options policy-statement RPKI-POLICY term invalid then community add origin-validation-state-invalid
set policy-options policy-statement RPKI-POLICY term invalid then reject
przykładowa, zmodyfikowana polityka dla sąsiadów będzie wyglądać tak:
root@mx> show configuration protocols bgp
group FULL-v4 {
[...]
import [ RPKI-POLICY ACCEPT-ALL ];
export DROP-ALL;
FAQ
czy mogę przekazać status walidacji do innych routerów?
tak, można przekazać status walidacji przez iBGP i rozszerzone wartości community. z uwagi na problematyczne efekty takiej konfiguracji (znaczny wzrost ilości komunikacji BGP w związku ze zmianami stanów, co może prowadzić do dodatkowego obciążenia pamięci i procesora) pozostawiam decyzję o ew. implementacji po Twojej stronie.
możesz udostępnić sesje po SSH zamiast po TCP RTR?
nie obecnie, ale jeśli zainteresowanie będzie odpowiednio wysokie - rozważę to.
co dalej?
miłej walidacji prefiksów!