RPKI SelfLab
EN ES PT
Código aberto · Docker ou VM · English, Español, Português

Um laboratório prático de ROA, ROV e ASPA, rodando no seu computador

Roteadores BGP de verdade, três validadores RPKI, uma CA e um registro simulado, tudo em contêineres. Uma história guiada mostra o que a validação de origem pega, o que escapa dela e o que o ASPA acrescenta.

O painel web do laboratório: o roteiro à esquerda, a topologia ao vivo no meio, os vereditos dos observadores embaixo, uma aba por observador

O que tem dentro

Tudo é software de verdade, não simulação. Três observadores recebem os mesmos anúncios e objetos RPKI, cada um combinando um roteador e um validador do seu jeito, então dá para comparar três implementações em cada passo.

  • Roteadores BIRD e OpenBGPD: a origem, dois provedores, três observadores que validam, um atacante e um peer.
  • Validadores Routinator e FORT, que alimentam os seus observadores pelo RTR versão 2, a que transporta o ASPA, e o rpki-client, que roda no próprio host do observer2 e entrega ao OpenBGPD um arquivo para incluir, do jeito do OpenBSD.
  • Krill como CA do titular, onde as ROAs e o objeto ASPA são criados.
  • Um registro simulado (RIR/NIR), com âncora de confiança e repositório próprios. A delegação da CA e a publicação usam as mesmas trocas de XML de um registro real (RFC 8183, 6492 e 8181). O laboratório ensina o modelo delegado, o único que o Registro.br oferece: você roda a sua própria CA, e o Registro.br a certifica e também oferece o repositório onde publicar.
  • Um painel web com a topologia ao vivo, o roteiro, os terminais dos roteadores e as interfaces web, em abas.
  • Roda em Linux, macOS e Windows (WSL 2) com Docker, ou como máquina virtual pronta. Não precisa de Internet depois de instalado.
A topologia do laboratório: o registro no alto; o Routinator e o FORT acima do observer1 e do observer3; entre eles, o observer2, que valida no próprio host; os dois provedores e o AS666; e, embaixo, a origem, a sua CA e o peer

A história, em nove passos

O roteiro é uma história só: três ataques, e qual verificação barra cada um. O AS64500 é multihomed e prefere o Provedor B; para o Provedor A, o backup, ele faz prepend duas vezes. Três observadores recebem o prefixo dele pelos dois provedores. As capturas abaixo são o painel em cada passo.

Passo 1

Uma linha de base limpa

Os três observadores recebem 203.0.113.0/24 pelos dois provedores e escolhem o caminho mais curto, pelo Provedor B. Ninguém valida nada ainda: as peças do RPKI existem, mas nenhum roteador conversa com um validador.

Passo 1: topologia e vereditos, sem validação
Passo 2

O sequestro ingênuo vence

O AS666 anuncia o prefixo da origem como se fosse dele. O caminho, 666, tem um salto contra dois e quatro, e nada mais distingue as rotas. Os links do atacante ficam laranja: os observadores estão usando a rota dele.

Sem validação, o BGP não tem como distinguir um sequestro da rota verdadeira.

Passo 2: o sequestro é a melhor rota nos observadores
Passo 3

O ROV entra, marcando o que parece errado

A origem cria as suas ROAs no Krill, e os observadores implantam a validação de origem na sua primeira forma, segura: as rotas inválidas só são marcadas e rebaixadas. O sequestro fica Invalid com local_pref 10, e o caminho do Provedor B volta a ser o selecionado.

Implantar ROV exige três peças em qualquer roteador: uma sessão RTR, um teste em cada rota e uma ação sobre o resultado.

Passo 3: o sequestro é marcado como ROV Invalid
Passo 4

O caminho forjado

O AS666 agora anuncia 666 64500, escrevendo a origem verdadeira no fim do caminho. O ROV só confere o último AS, então diz Valid, e a rota forjada ganha o desempate com a do Provedor B.

A validação de origem não consegue distinguir dois caminhos quando a origem é a mesma.

Passo 4: o caminho forjado é ROV Valid
Passo 5

O ASPA entra, também marcando primeiro

A origem publica um objeto ASPA que lista só o Provedor A, e os observadores implantam a verificação ASPA. O caminho forjado fica Invalid: o salto 64500→666 nunca foi autorizado. Mas o caminho legítimo do Provedor B também fica, e os observadores recorrem ao backup.

Um objeto ASPA precisa listar todos os provedores. Esquecer um desvia o tráfego da própria origem.

Passo 5: o caminho forjado e o do Provedor B são ASPA Invalid
Passo 6

Você esqueceu um provedor

Acrescentar o Provedor B ao objeto resolve: os dois caminhos legítimos voltam a ser Valid e o Provedor B é selecionado, enquanto o forjado continua rebaixado. A correção chega aos roteadores só por republicação e revalidação.

Passo 6: os dois caminhos legítimos voltam a ser ASPA Valid
Passo 7

O peer vaza

Um peer legítimo repassa ao Provedor A as rotas da origem que aprendeu no peering privado. Nada é forjado: 64501 64499 64500 é Valid para o ROV e Invalid para o ASPA, porque o 64499 não é um dos provedores da origem.

Num vazamento ninguém mente sobre a origem; o que está errado é por onde a rota passou. O ROV não enxerga, o ASPA sim.

Passo 7: o caminho vazado é ROV Valid e ASPA Invalid
Passo 8

Implantando de verdade: descartar

As duas verificações passam de marcar para descartar, do jeito que um roteador de produção é configurado. As rotas forjada e vazada somem. Mas o caminho próprio do Provedor A continua ausente: o Provedor A segue anunciando o vazamento no lugar dele, e nenhuma política nos observadores muda isso.

Marcar só ajuda enquanto existe uma alternativa válida. É o descarte que protege a rede.

Passo 8: rotas inválidas descartadas
Passo 9

Arrumando a casa

O peer corrige a sua política de exportação e o caminho próprio do Provedor A volta. Os observadores continuam totalmente implantados, com ROV e ASPA descartando.

Passo 9: o vazamento acabou e os dois caminhos legítimos voltaram

O que pegou o quê

AtaqueAS_PATHROVASPA
Sequestro ingênuo666peganada a conferir
Caminho forjado666 64500enganadopega
Vazamento de rota64501 64499 64500não enxergapega

Feito para aprender, e para ensinar

Pensado para cursos práticos de RPKI, e útil para quem quer estudar por conta própria.

Roteiro em três idiomas

Português, espanhol e inglês. Cada bloco de comandos diz onde roda e abre o terminal certo.

Desafios

Alguns passos escondem a solução atrás de dicas e de um cronômetro; "Conferir meu laboratório" olha o estado real do lab.

Pontos de controle

Eles se marcam sozinhos quando o lab chega a cada passo, e qualquer comando de passo põe o lab de volta nos trilhos.

A preparação também

Crie a CA no Krill e faça os dois lados da delegação com o registro simulado.

Suas próprias configurações

Uma pasta work/ para escrever a sua configuração de ROV e ASPA e carregá-la nos roteadores.

Exercícios extras

Upstream × downstream (e onde BIRD e OpenBGPD discordam), maxLength, um olhar por dentro do RTR e o rpki-client servido pelo RTR.

Um desafio do roteiro, com dicas, cronômetro e Conferir meu laboratório
O painel do registro simulado

Como começar

  1. Instale o Docker com o Compose v2 (Docker Desktop, OrbStack ou Docker Engine no Linux). No Windows, use o WSL 2 e trabalhe dentro do terminal do Ubuntu.
  2. Baixe o laboratório:
    git clone https://github.com/moreiras/rpki-selflab.git
    cd rpki-selflab
    ou baixe o código-fonte na versão mais recente.
  3. Suba o laboratório e abra http://localhost:8080:
    ./scripts/lab.sh up

Prefere não instalar o Docker?

Cada versão também traz uma máquina virtual com tudo dentro (amd64 e arm64), com área de trabalho, navegador e terminal próprios. Detalhes em vm/README.pt.md.

O roteiro completo também pode ser lido no GitHub: guide/GUIDE.pt.md.