mirror of
https://github.com/vyos/vyos-documentation.git
synced 2025-10-26 08:41:46 +01:00
114 lines
5.2 KiB
ReStructuredText
114 lines
5.2 KiB
ReStructuredText
.. _rpki:
|
|
|
|
####
|
|
RPKI
|
|
####
|
|
|
|
.. pull-quote::
|
|
|
|
There are two types of Network Admins who deal with BGP, those who have
|
|
created an international incident and/or outage, and those who are lying
|
|
|
|
-- `tweet by EvilMog`_, 2020-02-21
|
|
|
|
:abbr:`RPKI (Resource Public Key Infrastructure)` is a framework :abbr:`PKI
|
|
(Public Key Infrastructure)` designed to secure the Internet routing
|
|
infrastructure. It associates BGP route announcements with the correct
|
|
originating :abbr:`ASN (Autonomus System Number)` which BGP routers can then
|
|
use to check each route against the corresponding :abbr:`ROA (Route Origin
|
|
Authorisation)` for validity. RPKI is described in :rfc:`6480`.
|
|
|
|
A BGP-speaking router like VyOS can retrieve ROA information from RPKI
|
|
"Relying Party software" (often just called an "RPKI server" or "RPKI
|
|
validator") by using :abbr:`RTR (RPKI to Router)` protocol. There are several
|
|
open source implementations to choose from, such as NLNetLabs' Routinator_
|
|
(written in Rust), Cloudflare's GoRTR_ and OctoRPKI_ (written in Go), and
|
|
RIPE NCC's RPKI Validator_ (written in Java). The RTR protocol is described
|
|
in :rfc:`8210`.
|
|
|
|
.. tip::
|
|
If you are new to these routing security technologies then there is an
|
|
`excellent guide to RPKI`_ by NLnet Labs which will get you up to speed
|
|
very quickly. Their documentation explains everything from what RPKI is to
|
|
deploying it in production (albeit with a focus on using NLnet Labs'
|
|
tools). It also has some `help and operational guidance`_ including
|
|
"What can I do about my route having an Invalid state?"
|
|
|
|
First you will need to deploy an RPKI validator for your routers to use. The
|
|
RIPE NCC helpfully provide `some instructions`_ to get you started with
|
|
several different options. Once your server is running you can start
|
|
validating announcements.
|
|
|
|
Imported prefixes during the validation may have values:
|
|
|
|
valid
|
|
The prefix and ASN that originated it match a signed ROA. These are
|
|
probably trustworthy route announcements.
|
|
|
|
invalid
|
|
The prefix or prefix length and ASN that originated it doesn't
|
|
match any existing ROA. This could be the result of a prefix hijack, or
|
|
merely a misconfiguration, but should probably be treated as
|
|
untrustworthy route announcements.
|
|
|
|
notfound
|
|
No ROA exists which covers that prefix. Unfortunately this is the case
|
|
for about 80% of the IPv4 prefixes which were announced to the :abbr:`DFZ
|
|
(default-free zone)` at the start of 2020 (see more detail in
|
|
NLnet Labs' `RPKI analytics`_).
|
|
|
|
.. note::
|
|
If you are responsible for the global addresses assigned to your
|
|
network, please make sure that your prefixes have ROAs associated with them
|
|
to avoid being `notfound` by RPKI. For most ASNs this will involve
|
|
publishing ROAs via your :abbr:`RIR (Regional Internet Registry)` (RIPE
|
|
NCC, APNIC, ARIN, LACNIC or AFRINIC), and is something you are encouraged
|
|
to do whenever you plan to announce addresses into the DFZ.
|
|
|
|
Particularly large networks may wish to run their own RPKI certificate
|
|
authority and publication server instead of publishing ROAs via their RIR.
|
|
This is a subject far beyond the scope of VyOS' documentation. Consider
|
|
reading about Krill_ if this is a rabbit hole you need or especially want
|
|
to dive down.
|
|
|
|
We can build route-maps for import based on these states. Here is a simple
|
|
RPKI configuration, where `routinator` is the RPKI-validating "cache"
|
|
server with ip `192.0.2.1`:
|
|
|
|
.. code-block:: none
|
|
|
|
set protocols rpki cache routinator address '192.0.2.1'
|
|
set protocols rpki cache routinator port '3323'
|
|
|
|
Here is an example route-map to apply to routes learned at import. In this
|
|
filter we reject prefixes with the state `invalid`, and set a higher
|
|
`local-preference` if the prefix is RPKI `valid` rather than merely
|
|
`notfound`.
|
|
|
|
.. code-block:: none
|
|
|
|
set policy route-map ROUTES-IN rule 10 action 'permit'
|
|
set policy route-map ROUTES-IN rule 10 match rpki 'valid'
|
|
set policy route-map ROUTES-IN rule 10 set local-preference '300'
|
|
set policy route-map ROUTES-IN rule 20 action 'permit'
|
|
set policy route-map ROUTES-IN rule 20 match rpki 'notfound'
|
|
set policy route-map ROUTES-IN rule 20 set local-preference '125'
|
|
set policy route-map ROUTES-IN rule 30 action 'deny'
|
|
set policy route-map ROUTES-IN rule 30 match rpki 'invalid'
|
|
|
|
Once your routers are configured to reject RPKI-invalid prefixes, you can
|
|
test whether the configuration is working correctly using the `RIPE Labs RPKI
|
|
Test`_ experimental tool.
|
|
|
|
.. _tweet by EvilMog: https://twitter.com/Evil_Mog/status/1230924170508169216
|
|
.. _Routinator: https://www.nlnetlabs.nl/projects/rpki/routinator/
|
|
.. _GoRTR: https://github.com/cloudflare/gortr
|
|
.. _OctoRPKI: https://github.com/cloudflare/cfrpki#octorpki
|
|
.. _Validator: https://www.ripe.net/manage-ips-and-asns/resource-management/certification/tools-and-resources
|
|
.. _some instructions: https://labs.ripe.net/Members/tashi_phuntsho_3/how-to-install-an-rpki-validator
|
|
.. _Krill: https://www.nlnetlabs.nl/projects/rpki/krill/
|
|
.. _RPKI analytics: https://www.nlnetlabs.nl/projects/rpki/rpki-analytics/
|
|
.. _RIPE Labs RPKI Test: https://sg-pub.ripe.net/jasper/rpki-web-test/
|
|
.. _excellent guide to RPKI: https://rpki.readthedocs.io/
|
|
.. _help and operational guidance: https://rpki.readthedocs.io/en/latest/about/help.html
|