2018-08-06 16:46:24 -07:00
|
|
|
# GoRTR
|
|
|
|
|
2020-03-30 13:22:41 -07:00
|
|
|
[](https://travis-ci.org/cloudflare/gortr)
|
|
|
|
[](https://pkg.go.dev/github.com/cloudflare/gortr)
|
2020-03-30 13:28:57 -07:00
|
|
|

|
2020-03-30 13:22:41 -07:00
|
|
|
|
2018-09-13 13:10:54 -07:00
|
|
|
GoRTR is an open-source implementation of RPKI to Router protocol (RFC 6810) using the [the Go Programming Language](http://golang.org/).
|
2018-08-06 16:46:24 -07:00
|
|
|
|
|
|
|
* `/lib` contains a library to create your own server and client.
|
2018-11-12 21:04:50 -08:00
|
|
|
* `/prefixfile` contains the structure of a JSON export file and signing capabilities.
|
2018-09-13 13:53:45 -07:00
|
|
|
* `/cmd/gortr/gortr.go` is a simple implementation that fetches a list and offers it to a router.
|
2019-04-11 13:57:30 -07:00
|
|
|
* `/cmd/rtrdump/rtrdump.go` allows copying the PDUs sent by a RTR server as a JSON file.
|
2018-08-06 16:46:24 -07:00
|
|
|
|
2018-08-15 13:33:19 -07:00
|
|
|
## Disclaimer
|
|
|
|
|
2018-09-13 13:53:45 -07:00
|
|
|
_This software comes with no warranty._
|
2018-08-15 13:33:19 -07:00
|
|
|
|
2020-02-27 13:24:02 -08:00
|
|
|
## In the field
|
|
|
|
|
2020-07-02 10:26:03 +10:00
|
|
|
<img align="left" src="docs/images/cloudflare.png" alt="Cloudflare" width="200px">
|
2020-02-27 13:24:02 -08:00
|
|
|
|
2020-02-27 13:33:23 -08:00
|
|
|
_Cloudflare operates 200+ GoRTR globally. They provide redundancy in at the PoP level.
|
|
|
|
This provides increased reliability by computing a unique prefix list and providing
|
|
|
|
a secure distribution of the file over its CDN before being sent to the routers._
|
2020-02-27 13:24:02 -08:00
|
|
|
|
|
|
|
_GoRTR also powers the public RTR server available on rtr.rpki.cloudflare.com on port 8282 and 8283 for SSH (rpki/rpki)_
|
|
|
|
|
2020-07-02 12:20:19 +10:00
|
|
|
<br>
|
2020-03-26 12:32:48 +01:00
|
|
|
|
2020-07-02 10:26:03 +10:00
|
|
|
<img align="left" src="docs/images/telia.png" alt="Telia" width="200px">
|
2020-02-27 13:33:23 -08:00
|
|
|
|
|
|
|
_Telia has deployed RPKI and uses GoRTR connected with OctoRPKI and rpki-client to distribute the ROAs to its routers.
|
|
|
|
Instances of the RTR servers handle around 250 sessions each._
|
|
|
|
|
2020-07-02 12:20:19 +10:00
|
|
|
<br>
|
2020-03-26 12:32:48 +01:00
|
|
|
|
2020-07-02 10:26:03 +10:00
|
|
|
<img align="left" src="docs/images/ntt.png" alt="NTT" width="150px">
|
2020-03-26 12:32:48 +01:00
|
|
|
|
|
|
|
_NTT has deployed OpenBSD's rpki-client together with GoRTR to facilitate rejecting RPKI Invalid BGP route announcements
|
|
|
|
towards it's Global IP Network (AS 2914). More information is available [here](https://www.us.ntt.net/support/policy/rr.cfm#RPKI)._
|
|
|
|
|
2020-07-02 10:26:03 +10:00
|
|
|
<br>
|
2020-04-09 13:48:18 -07:00
|
|
|
|
2020-07-02 10:26:03 +10:00
|
|
|
<img align="left" src="docs/images/gtt.png" alt="GTT" width="100px">
|
2020-04-09 13:48:18 -07:00
|
|
|
|
|
|
|
_GTT deployed GoRTR along with OctoRPKI. The setup currently provides 400+ RTR sessions to their routers for filtering
|
|
|
|
RPKI invalids._
|
|
|
|
|
2020-07-02 10:26:03 +10:00
|
|
|
<br>
|
2020-06-09 14:57:44 -07:00
|
|
|
|
2020-07-02 10:26:03 +10:00
|
|
|
<img align="left" src="docs/images/cogent.png" alt="Cogent" width="150px">
|
2020-06-09 14:57:44 -07:00
|
|
|
|
|
|
|
_Cogent deployed GoRTR and OctoRPKI at the end of May 2020. 8 validators feed approximately 2500 routers._
|
|
|
|
|
2020-07-02 10:26:03 +10:00
|
|
|
<br>
|
2020-02-27 13:24:02 -08:00
|
|
|
|
2020-06-09 14:57:44 -07:00
|
|
|
Router vendors also used this software to develop their implementations.
|
|
|
|
|
2020-02-27 13:24:02 -08:00
|
|
|
_Do you use this tool at scale? Let us know!_
|
|
|
|
|
2018-08-06 16:46:24 -07:00
|
|
|
## Features of the server
|
|
|
|
|
|
|
|
* Refreshes a JSON list of prefixes (from either Cloudflare or a RIPE Validator)
|
|
|
|
* Prometheus metrics
|
|
|
|
* Lightweight
|
|
|
|
* TLS
|
2019-07-30 21:08:01 -07:00
|
|
|
* SSH
|
2018-09-13 13:53:45 -07:00
|
|
|
* Signature verification and expiration control
|
2018-08-06 16:46:24 -07:00
|
|
|
|
2018-11-12 19:13:56 -08:00
|
|
|
## Features of the extractor
|
|
|
|
|
|
|
|
* Generate a list of prefixes sent via RTR (similar to Cloudflare JSON input, or RIPE RPKI Validator)
|
|
|
|
* Lightweight
|
|
|
|
* TLS
|
2019-07-30 21:08:01 -07:00
|
|
|
* SSH
|
2018-11-12 19:13:56 -08:00
|
|
|
|
2018-08-06 16:46:24 -07:00
|
|
|
## Features of the API
|
|
|
|
|
|
|
|
* Protocol v0 of [RFC6810](https://tools.ietf.org/html/rfc6810)
|
2018-09-13 13:53:45 -07:00
|
|
|
* Protocol v1 of [RFC8210](https://tools.ietf.org/html/rfc8210)
|
2018-08-06 16:46:24 -07:00
|
|
|
* Event-driven API
|
|
|
|
* TLS
|
2019-07-30 21:08:01 -07:00
|
|
|
* SSH
|
2018-08-06 16:46:24 -07:00
|
|
|
|
2018-09-13 13:10:54 -07:00
|
|
|
## To start developing
|
2019-03-20 21:29:42 -07:00
|
|
|
|
2018-09-13 13:10:54 -07:00
|
|
|
You need a working [Go environment](https://golang.org/doc/install) (1.10 or newer).
|
2019-03-20 21:29:42 -07:00
|
|
|
This project also uses [Go Modules](https://github.com/golang/go/wiki/Modules).
|
2018-09-13 13:10:54 -07:00
|
|
|
|
|
|
|
```bash
|
|
|
|
$ git clone git@github.com:cloudflare/gortr.git && cd gortr
|
2018-09-14 12:52:02 -07:00
|
|
|
$ go build cmd/gortr/gortr.go
|
2018-09-13 13:10:54 -07:00
|
|
|
```
|
|
|
|
|
2019-04-11 14:25:14 -07:00
|
|
|
## With Docker
|
|
|
|
|
|
|
|
If you do not want to use Docker, please go to the next section.
|
|
|
|
|
|
|
|
If you have **Docker**, you can start GoRTR with `docker run -ti -p 8082:8082 cloudflare/gortr`.
|
2020-07-02 13:24:13 +10:00
|
|
|
The containers contain Cloudflare's public signing key and an testing ECDSA private
|
2019-04-11 14:25:14 -07:00
|
|
|
key for the SSH server.
|
|
|
|
|
|
|
|
It will automatically download Cloudflare's prefix list and use the public key
|
|
|
|
to validate it.
|
|
|
|
|
|
|
|
You can now use any CLI attributes as long as they are after the image name:
|
2020-07-02 12:20:19 +10:00
|
|
|
|
2019-04-11 14:25:14 -07:00
|
|
|
```bash
|
|
|
|
$ docker run -ti -p 8083:8083 cloudflare/gortr -bind :8083
|
|
|
|
```
|
|
|
|
|
|
|
|
If you want to build your own image of GoRTR:
|
2020-07-02 12:20:19 +10:00
|
|
|
|
2019-04-11 14:25:14 -07:00
|
|
|
```bash
|
|
|
|
$ docker build -t mygortr -f Dockerfile.gortr.prod .
|
|
|
|
$ docker run -ti mygortr -h
|
|
|
|
```
|
2020-07-02 12:20:19 +10:00
|
|
|
|
2019-04-11 14:25:14 -07:00
|
|
|
It will download the code from GitHub and compile it with Go and also generate an ECDSA key for SSH.
|
|
|
|
|
|
|
|
Please note: if you plan to use SSH with Cloudflare's default container (`cloudflare/gortr`),
|
|
|
|
replace the key `private.pem` since it is a testing key that has been published.
|
|
|
|
An example is given below:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
$ docker run -ti -v $PWD/mynewkey.pem:/private.pem cloudflare/gortr -ssh.bind :8083
|
|
|
|
```
|
|
|
|
|
2018-09-13 13:53:45 -07:00
|
|
|
## Install it
|
|
|
|
|
2019-07-30 22:53:10 -07:00
|
|
|
There are a few solutions to install it.
|
|
|
|
|
|
|
|
Go can directly fetch it from the source
|
|
|
|
|
2018-09-13 13:53:45 -07:00
|
|
|
```bash
|
|
|
|
$ go get github.com/cloudflare/gortr/cmd/gortr
|
|
|
|
```
|
|
|
|
|
|
|
|
Copy `cf.pub` to your local directory if you want to use Cloudflare's signed JSON file.
|
2018-08-06 16:46:24 -07:00
|
|
|
|
2019-07-30 22:53:10 -07:00
|
|
|
You can use the Makefile (by default it will be compiled for Linux, add `GOOS=darwin` for Mac)
|
|
|
|
|
|
|
|
```bash
|
|
|
|
$ make dist-key build-gortr
|
|
|
|
```
|
|
|
|
|
|
|
|
The compiled file will be in `/dist`.
|
|
|
|
|
|
|
|
Or you can use a package (or binary) file from the [Releases page](https://github.com/cloudflare/gortr/releases):
|
2020-07-02 12:20:19 +10:00
|
|
|
|
2019-07-30 22:53:10 -07:00
|
|
|
```bash
|
|
|
|
$ sudo dpkg -i gortr[...].deb
|
|
|
|
$ sudo systemctl start gortr
|
|
|
|
```
|
|
|
|
|
2019-03-22 12:53:05 -07:00
|
|
|
If you want to sign your list of prefixes, generate an ECDSA key.
|
|
|
|
Then generate the public key to be used in GoRTR.
|
|
|
|
You will have to setup your validator to use this key or have another
|
|
|
|
tool to sign the JSON file before passing it to GoRTR.
|
2020-07-02 12:20:19 +10:00
|
|
|
|
2018-09-13 13:53:45 -07:00
|
|
|
```bash
|
|
|
|
$ openssl ecparam -genkey -name prime256v1 -noout -outform pem > private.pem
|
|
|
|
$ openssl ec -in private.pem -pubout -outform pem > public.pem
|
|
|
|
```
|
|
|
|
|
|
|
|
## Run it
|
|
|
|
|
2019-07-30 22:53:10 -07:00
|
|
|
Once you have a binary:
|
2019-03-20 21:29:42 -07:00
|
|
|
|
2018-09-13 13:53:45 -07:00
|
|
|
```bash
|
2019-03-22 12:53:05 -07:00
|
|
|
$ ./gortr -tls.bind 127.0.0.1:8282
|
2018-08-06 16:46:24 -07:00
|
|
|
```
|
|
|
|
|
2018-09-13 16:57:22 -07:00
|
|
|
Make sure cf.pub is in the current directory. Or pass `-verify.key=path/to/cf.pub`
|
|
|
|
|
2019-07-30 22:53:10 -07:00
|
|
|
## Package it
|
|
|
|
|
|
|
|
If you want to package it (deb/rpm), you can use the pre-built docker-compose file.
|
|
|
|
|
|
|
|
```bash
|
|
|
|
$ docker-compose -f docker-compose-pkg.yml up
|
|
|
|
```
|
|
|
|
|
|
|
|
You can find both files in the `dist/` directory.
|
|
|
|
|
2019-07-31 14:40:42 -07:00
|
|
|
### Usage with a proxy
|
|
|
|
|
|
|
|
This was tested with a basic Squid proxy. The `User-Agent` header is passed
|
|
|
|
in the CONNECT.
|
|
|
|
|
|
|
|
You have to export the following two variables in order for GoRTR to use the proxy.
|
2020-07-02 12:20:19 +10:00
|
|
|
|
2019-07-31 14:40:42 -07:00
|
|
|
```
|
|
|
|
export HTTP_PROXY=schema://host:port
|
|
|
|
export HTTPS_PROXY=schema://host:port
|
|
|
|
```
|
|
|
|
|
2019-03-22 12:53:05 -07:00
|
|
|
### With SSL
|
|
|
|
|
|
|
|
You can run GoRTR and listen for TLS connections only (just pass `-bind ""`).
|
|
|
|
|
|
|
|
First, you will have to create a SSL certificate.
|
|
|
|
|
|
|
|
```bash
|
|
|
|
$ openssl ecparam -genkey -name prime256v1 -noout -outform pem > private.pem
|
|
|
|
$ openssl req -new -x509 -key private.pem -out server.pem
|
|
|
|
```
|
|
|
|
|
|
|
|
Then, you have to run
|
|
|
|
|
|
|
|
```bash
|
|
|
|
$ ./gortr -ssh.bind :8282 -tls.key private.pem -tls.cert server.pem
|
|
|
|
```
|
|
|
|
|
|
|
|
### With SSH
|
|
|
|
|
|
|
|
You can run GoRTR and listen for SSH connections only (just pass `-bind ""`).
|
|
|
|
|
|
|
|
You will have to create an ECDSA key. You can use the following command:
|
2020-07-02 12:20:19 +10:00
|
|
|
|
2019-03-22 12:53:05 -07:00
|
|
|
```bash
|
|
|
|
$ openssl ecparam -genkey -name prime256v1 -noout -outform pem > private.pem
|
|
|
|
```
|
|
|
|
|
|
|
|
Then you can start:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
$ ./gortr -ssh.bind :8282 -ssh.key private.pem -bind ""
|
|
|
|
```
|
|
|
|
|
|
|
|
By default, there is no authentication.
|
|
|
|
|
2019-04-11 16:37:41 -07:00
|
|
|
You can use password and key authentication:
|
2019-03-22 12:53:05 -07:00
|
|
|
|
|
|
|
For example, to configure user **rpki** and password **rpki**:
|
2020-07-02 12:20:19 +10:00
|
|
|
|
2019-03-22 12:53:05 -07:00
|
|
|
```bash
|
2019-04-11 16:53:12 -07:00
|
|
|
$ ./gortr -ssh.bind :8282 -ssh.key private.pem -ssh.method.password=true -ssh.auth.user rpki -ssh.auth.password rpki -bind ""
|
|
|
|
```
|
|
|
|
|
|
|
|
And to configure a bypass for every SSH key:
|
2020-07-02 12:20:19 +10:00
|
|
|
|
2019-04-11 16:53:12 -07:00
|
|
|
```bash
|
|
|
|
$ ./gortr -ssh.bind :8282 -ssh.key private.pem -ssh.method.key=true -ssh.auth.key.bypass=true -bind ""
|
2019-03-22 12:53:05 -07:00
|
|
|
```
|
|
|
|
|
2019-10-27 21:27:59 -07:00
|
|
|
## Configure filters and overrides (SLURM)
|
|
|
|
|
|
|
|
GoRTR supports SLURM configuration files ([RFC8416](https://tools.ietf.org/html/rfc8416)).
|
|
|
|
|
|
|
|
Create a json file (`slurm.json`):
|
|
|
|
|
|
|
|
```
|
|
|
|
{
|
|
|
|
"slurmVersion": 1,
|
|
|
|
"validationOutputFilters": {
|
|
|
|
"prefixFilters": [
|
|
|
|
{
|
|
|
|
"prefix": "10.0.0.0/8",
|
|
|
|
"comment": "Everything inside will be removed"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"asn": 65001,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"asn": 65002,
|
|
|
|
"prefix": "192.168.0.0/24",
|
|
|
|
},
|
|
|
|
],
|
|
|
|
"bgpsecFilters": []
|
|
|
|
},
|
|
|
|
"locallyAddedAssertions": {
|
|
|
|
"prefixAssertions": [
|
|
|
|
{
|
|
|
|
"asn": 65001,
|
|
|
|
"prefix": "2001:db8::/32",
|
|
|
|
"maxPrefixLength": 48,
|
|
|
|
"comment": "Manual add"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"bgpsecAssertions": [
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
When starting GoRTR, add the `-slurm ./slurm.json` argument.
|
|
|
|
|
|
|
|
The log should display something similar to the following:
|
|
|
|
|
|
|
|
```
|
|
|
|
INFO[0001] Slurm filtering: 112214 kept, 159 removed, 1 asserted
|
|
|
|
INFO[0002] New update (112215 uniques, 112215 total prefixes).
|
|
|
|
```
|
|
|
|
|
|
|
|
For instance, if the original JSON fetched contains the ROA: `10.0.0.0/24-24 AS65001`,
|
|
|
|
it will be removed.
|
|
|
|
|
|
|
|
The JSON exported by GoRTR will contain the overrides and the file can be signed again.
|
|
|
|
Others GoRTR can be configured to fetch the ROAs from the filtering GoRTR:
|
|
|
|
the operator manages one SLURM file on a leader GoRTR.
|
|
|
|
|
2018-11-12 19:13:56 -08:00
|
|
|
## Debug the content
|
|
|
|
|
2019-10-27 21:27:59 -07:00
|
|
|
You can check the content provided over RTR with rtrdump tool
|
|
|
|
|
2018-11-12 19:13:56 -08:00
|
|
|
```bash
|
|
|
|
$ ./rtrdump -connect 127.0.0.1:8282 -file debug.json
|
|
|
|
```
|
|
|
|
|
2019-10-27 21:27:59 -07:00
|
|
|
You can also fetch the re-generated JSON from the `-export.path` endpoint (default: `http://localhost:8080/rpki.json`)
|
|
|
|
|
2018-08-06 16:49:29 -07:00
|
|
|
### Data sources
|
2018-08-06 16:46:24 -07:00
|
|
|
|
|
|
|
Use your own validator, as long as the JSON source follows the following schema:
|
2020-07-02 12:20:19 +10:00
|
|
|
|
2018-08-06 16:46:24 -07:00
|
|
|
```
|
|
|
|
{
|
|
|
|
"roas": [
|
|
|
|
{
|
|
|
|
"prefix": "10.0.0.0/24",
|
|
|
|
"maxLength": 24,
|
|
|
|
"asn": "AS65001"
|
|
|
|
},
|
|
|
|
...
|
|
|
|
]
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2019-03-20 21:29:42 -07:00
|
|
|
* [**Cloudflare**](https://rpki.cloudflare.com/rpki.json) *(list curated, signed, compressed and cached in +160 PoPs)*
|
2020-02-26 20:05:14 +01:00
|
|
|
* **Third-party JSON formatted VRP exports:**
|
|
|
|
* [NTT](https://rpki.gin.ntt.net/api/export.json) (based on OpenBSD's `rpki-client`)
|
|
|
|
* [RIPE](https://rpki-validator.ripe.net/api/export.json) (based on RIPE NCC's RPKI Cache Validator)
|
2020-07-02 12:20:19 +10:00
|
|
|
|
2020-07-02 13:24:13 +10:00
|
|
|
To use a data source that do not contain signatures or validity information, pass:
|
2018-09-13 16:57:22 -07:00
|
|
|
`-verify=false -checktime=false`
|
2018-08-06 16:46:24 -07:00
|
|
|
|
2019-09-17 11:45:18 -07:00
|
|
|
**[Note: for boolean flags, it requires the equal sign](https://golang.org/pkg/flag/#hdr-Command_line_flag_syntax)**
|
|
|
|
|
2019-03-20 21:29:42 -07:00
|
|
|
Cloudflare's prefix list removes duplicates and entries that are not routed on the Internet (>/24 IPv4 and >/48 IPv6).
|
|
|
|
|
2020-03-27 19:33:45 -07:00
|
|
|
By default, the session ID will be randomly generated. The serial will start at zero.
|
|
|
|
|
|
|
|
You can define a serial to start with the following way:
|
2020-07-02 12:20:19 +10:00
|
|
|
|
2020-03-27 19:33:45 -07:00
|
|
|
* the JSON must contain a `serial` field in `metadata`; and
|
|
|
|
* the flag `-useserial` must be set to 1 or 2
|
|
|
|
|
|
|
|
When flag is set to 1, every change of file will increment the serial regardless of the current `serial` field.
|
|
|
|
Make sure the refresh rate of GoRTR is more frequent than the refresh rate of the JSON.
|
|
|
|
|
|
|
|
When flag is set to 2, GoRTR will set the value of the serial in the JSON. If an ID is missed or not updated,
|
|
|
|
it will cause discrepancies on the client.
|
|
|
|
|
2019-03-22 12:53:05 -07:00
|
|
|
## Configurations
|
|
|
|
|
|
|
|
### Compatibility matrix
|
|
|
|
|
|
|
|
A simple comparison between software and devices.
|
|
|
|
Implementations on versions may vary.
|
|
|
|
|
2019-04-11 16:09:30 -07:00
|
|
|
| Device/software | Plaintext | TLS | SSH | Notes |
|
|
|
|
| --------------- | --------- | --- | --- | ----------------- |
|
|
|
|
| RTRdump | Yes | Yes | Yes | |
|
2019-10-15 10:16:17 -07:00
|
|
|
| RTRlib | Yes | No | Yes | Only SSH key |
|
2019-04-11 16:09:30 -07:00
|
|
|
| Juniper | Yes | No | No | |
|
|
|
|
| Cisco | Yes | No | Yes | Only SSH password |
|
|
|
|
| Alcatel | Yes | No | No | |
|
2020-11-03 11:27:49 +01:00
|
|
|
| Arista | Yes | No | No | |
|
2019-10-15 14:06:59 +02:00
|
|
|
| FRRouting | Yes | No | Yes | Only SSH key |
|
2019-12-27 15:05:00 +01:00
|
|
|
| Bird2 | Yes | No | Yes | Only SSH key |
|
2019-04-11 16:09:30 -07:00
|
|
|
| Quagga | Yes | No | No | |
|
2019-03-22 12:53:05 -07:00
|
|
|
|
2018-08-06 16:46:24 -07:00
|
|
|
### Configure on Juniper
|
|
|
|
|
2019-03-22 12:53:05 -07:00
|
|
|
Configure a session to the RTR server (assuming it runs on `192.168.1.100:8282`)
|
|
|
|
|
2018-08-06 16:46:24 -07:00
|
|
|
```
|
|
|
|
louis@router> show configuration routing-options validation
|
|
|
|
group TEST-RPKI {
|
|
|
|
session 192.168.1.100 {
|
|
|
|
port 8282;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
2019-03-22 12:53:05 -07:00
|
|
|
|
2018-08-06 16:46:24 -07:00
|
|
|
Add policies to validate or invalidate prefixes
|
2019-03-22 12:53:05 -07:00
|
|
|
|
2018-08-06 16:46:24 -07:00
|
|
|
```
|
|
|
|
louis@router> show configuration policy-options policy-statement STATEMENT-EXAMPLE
|
|
|
|
term RPKI-TEST-VAL {
|
|
|
|
from {
|
|
|
|
protocol bgp;
|
|
|
|
validation-database valid;
|
|
|
|
}
|
|
|
|
then {
|
|
|
|
validation-state valid;
|
|
|
|
next term;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
term RPKI-TEST-INV {
|
|
|
|
from {
|
|
|
|
protocol bgp;
|
|
|
|
validation-database invalid;
|
|
|
|
}
|
|
|
|
then {
|
|
|
|
validation-state invalid;
|
|
|
|
reject;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
2019-03-22 12:53:05 -07:00
|
|
|
|
2018-08-06 16:46:24 -07:00
|
|
|
Display status of the session to the RTR server.
|
2019-03-22 12:53:05 -07:00
|
|
|
|
2018-08-06 16:46:24 -07:00
|
|
|
```
|
|
|
|
louis@router> show validation session 192.168.1.100 detail
|
|
|
|
Session 192.168.1.100, State: up, Session index: 1
|
|
|
|
Group: TEST-RPKI, Preference: 100
|
|
|
|
Port: 8282
|
|
|
|
Refresh time: 300s
|
|
|
|
Hold time: 600s
|
|
|
|
Record Life time: 3600s
|
|
|
|
Serial (Full Update): 1
|
|
|
|
Serial (Incremental Update): 1
|
|
|
|
Session flaps: 2
|
|
|
|
Session uptime: 00:25:07
|
|
|
|
Last PDU received: 00:04:50
|
|
|
|
IPv4 prefix count: 46478
|
|
|
|
IPv6 prefix count: 8216
|
|
|
|
```
|
2019-03-22 12:53:05 -07:00
|
|
|
|
|
|
|
Show content of the database (list the PDUs)
|
|
|
|
|
2018-08-06 16:46:24 -07:00
|
|
|
```
|
|
|
|
louis@router> show validation database brief
|
|
|
|
RV database for instance master
|
|
|
|
|
|
|
|
Prefix Origin-AS Session State Mismatch
|
|
|
|
1.0.0.0/24-24 13335 192.168.1.100 valid
|
|
|
|
1.1.1.0/24-24 13335 192.168.1.100 valid
|
|
|
|
```
|
|
|
|
|
2019-03-22 12:53:05 -07:00
|
|
|
### Configure on Cisco
|
|
|
|
|
|
|
|
You may want to use the option to do SSH-based connection.
|
|
|
|
|
|
|
|
On Cisco, you can have only one RTR server per IP.
|
|
|
|
|
|
|
|
To configure a session for `192.168.1.100:8282`:
|
2020-07-02 12:20:19 +10:00
|
|
|
Replace `65001` by the configured ASN:
|
2019-03-22 12:53:05 -07:00
|
|
|
|
|
|
|
```
|
|
|
|
router bgp 65001
|
2020-07-02 12:20:19 +10:00
|
|
|
rpki server 192.168.1.100
|
2019-03-22 12:53:05 -07:00
|
|
|
transport tcp port 8282
|
|
|
|
!
|
|
|
|
!
|
|
|
|
```
|
|
|
|
|
|
|
|
For an SSH session, you will also have to configure
|
|
|
|
`router bgp 65001 rpki server 192.168.1.100 password xxx`
|
|
|
|
where `xxx` is the password.
|
|
|
|
Some experimentations showed you have to configure
|
|
|
|
the username/password first, otherwise it will not accept the port.
|
|
|
|
|
|
|
|
```
|
|
|
|
router bgp 65001
|
2020-07-02 12:20:19 +10:00
|
|
|
rpki server 192.168.1.100
|
2019-03-22 12:53:05 -07:00
|
|
|
username rpki
|
|
|
|
transport ssh port 8282
|
|
|
|
!
|
|
|
|
!
|
|
|
|
ssh client tcp-window-scale 14
|
|
|
|
ssh timeout 120
|
|
|
|
```
|
|
|
|
|
2020-07-02 12:20:19 +10:00
|
|
|
The last two SSH statements solved an issue causing the
|
2019-03-22 12:53:05 -07:00
|
|
|
connection to break before receiving all the PDUs (TCP window full problem).
|
|
|
|
|
|
|
|
To visualize the state of the session:
|
|
|
|
|
|
|
|
```
|
|
|
|
RP/0/RP0/CPU0:ios#sh bgp rpki server 192.168.1.100
|
|
|
|
|
|
|
|
RPKI Cache-Server 192.168.1.100
|
|
|
|
Transport: SSH port 8282
|
|
|
|
Connect state: ESTAB
|
|
|
|
Conn attempts: 1
|
|
|
|
Total byte RX: 1726892
|
|
|
|
Total byte TX: 452
|
|
|
|
Last reset
|
|
|
|
Timest: Apr 05 01:19:32 (04:26:58 ago)
|
|
|
|
Reason: protocol error
|
|
|
|
SSH information
|
|
|
|
Username: rpki
|
|
|
|
Password: *****
|
|
|
|
SSH PID: 18576
|
|
|
|
RPKI-RTR protocol information
|
|
|
|
Serial number: 15
|
|
|
|
Cache nonce: 0x0
|
|
|
|
Protocol state: DATA_END
|
|
|
|
Refresh time: 600 seconds
|
|
|
|
Response time: 30 seconds
|
|
|
|
Purge time: 60 seconds
|
|
|
|
Protocol exchange
|
|
|
|
ROAs announced: 67358 IPv4 11754 IPv6
|
|
|
|
ROAs withdrawn: 80 IPv4 34 IPv6
|
|
|
|
Error Reports : 0 sent 0 rcvd
|
|
|
|
Last protocol error
|
|
|
|
Reason: response timeout
|
|
|
|
Detail: response timeout while in DATA_START state
|
|
|
|
```
|
|
|
|
|
|
|
|
To visualize the accepted PDUs:
|
|
|
|
|
|
|
|
```
|
|
|
|
RP/0/RP0/CPU0:ios#sh bgp rpki table
|
|
|
|
|
|
|
|
Network Maxlen Origin-AS Server
|
|
|
|
1.0.0.0/24 24 13335 192.168.1.100
|
|
|
|
1.1.1.0/24 24 13335 192.168.1.100
|
|
|
|
```
|
|
|
|
|
2020-11-03 11:27:49 +01:00
|
|
|
### Configure on Arista
|
|
|
|
```
|
|
|
|
router bgp <asn>
|
|
|
|
rpki cache <name>
|
|
|
|
host <ipv4|ipv6|hostname> [vrf <vrfname>] [port <1-65535>] # default port is 323
|
|
|
|
local-interface <interface>
|
|
|
|
preference <1-10> # the lower the value, the more preferred
|
|
|
|
# default is 5
|
|
|
|
refresh-interval <1-86400 seconds> # default is 3600
|
|
|
|
expire-interval <600-172800 seconds> # default is 7200
|
|
|
|
retry-interval <1-7200 seconds> # default is 600
|
|
|
|
```
|
2020-11-05 18:53:09 +01:00
|
|
|
If multiple caches are configured, the preference controls the priority.
|
|
|
|
Caches which are more preferred will be connected to first, if they are not reachable then connections will be attempted to less preferred caches.
|
|
|
|
If caches have the same preference value, they will all be connected to and the ROAs that are synced from them will be merged together.
|
2020-11-03 11:27:49 +01:00
|
|
|
|
|
|
|
To visualize the state of the session:
|
|
|
|
|
|
|
|
```
|
|
|
|
show bgp rpki cache [<name>]
|
|
|
|
show bgp rpki cache counters [errors]
|
|
|
|
show bgp rpki roa summary
|
|
|
|
```
|
|
|
|
|
|
|
|
To visualize the accepted PDUs:
|
|
|
|
|
|
|
|
```
|
|
|
|
show bgp rpki roa (ipv4|ipv6) [prefix]
|
|
|
|
```
|
|
|
|
|
|
|
|
|
2018-08-06 16:46:24 -07:00
|
|
|
## License
|
|
|
|
|
|
|
|
Licensed under the BSD 3 License.
|