BTECH Automations

BGP

Filtro BGP com bgpq4 e IRR: prefix-lists automáticas para Cisco, Juniper, Huawei e MikroTik

Gere prefix-lists e filtros de AS-PATH a partir do IRR com o bgpq4, para Cisco, Juniper, Huawei e MikroTik v7, e veja o que é preciso para automatizar a atualização.

Por Rodrigo Borges, BTECH Automations · · 12 min de leitura

Aceitar anúncios BGP de clientes e peers sem filtro é a receita para vazamentos de rota e sequestro de prefixos. O problema é que manter prefix-lists à mão não escala: cada cliente novo, cada bloco novo e cada downstream do cliente exige alteração em todos os roteadores de borda.

Neste tutorial você vai usar o bgpq4 para gerar prefix-lists e filtros de AS-PATH diretamente a partir do IRR (Internet Routing Registry), no formato do seu roteador, e entender o que é preciso para manter essa atualização rodando sozinha.

Por que filtrar pelo IRR

O IRR é um conjunto de bases públicas onde cada rede registra quais prefixos anuncia (objetos route e route6) e quais redes estão abaixo dela (objetos as-set). Quando o filtro é gerado a partir dessas bases:

  • o cliente passa a ser responsável por manter o próprio registro, e você deixa de receber pedidos de "libera esse bloco";
  • prefixos que o cliente não declarou são descartados, o que impede vazamentos acidentais de rotas da internet inteira;
  • você atende ao que é exigido em pontos de troca de tráfego como o IX.br e às recomendações do MANRS.

Instalando o bgpq4

O bgpq4 está nos repositórios das principais distribuições. Ele só precisa de acesso de saída à porta TCP 43 do servidor de IRR, então pode rodar em qualquer servidor de gerência.

bash
# Debian e Ubuntu
sudo apt install bgpq4

# Rocky, Alma e RHEL (pacote do EPEL)
sudo dnf install epel-release
sudo dnf install bgpq4

# Conferindo
bgpq4 -h rr.ntt.net AS-EXEMPLO

Sem nenhuma opção, a saída sai no formato Cisco IOS, para IPv4, consultando o servidor rr.ntt.net, que espelha várias bases de IRR.

AS-SET, route objects e fontes

Antes de gerar qualquer filtro, descubra o que o cliente registrou. Os três conceitos que importam:

  • route / route6: ligam um prefixo ao ASN de origem, por exemplo 198.51.100.0/24 originado pelo AS64500.
  • as-set: lista de ASNs e de outros as-sets. O as-set do cliente deve incluir o próprio ASN e os ASNs dos clientes dele. Se o cliente não tem downstream, você pode usar diretamente o ASN, como AS64500.
  • Fontes: cada base de IRR (RADB, LACNIC, RIPE, ARIN, TC e outras). Com -S você escolhe em quais bases o bgpq4 confia, e com -h escolhe o servidor consultado.
bash
# Consultando direto no servidor de IRR (whois)
whois -h rr.ntt.net AS-EXEMPLO
whois -h rr.ntt.net -- '-i origin AS64500'

# Usando só as bases dos RIRs e o RPKI
bgpq4 -S RPKI,AFRINIC,APNIC,ARIN,LACNIC,RIPE AS-EXEMPLO

# Consultando outro servidor
bgpq4 -h whois.radb.net AS-EXEMPLO

Restringir as fontes com -S deixa o filtro mais confiável, porque bases sem validação de autoria aceitam registros de qualquer um. Mas confirme antes onde cada cliente registrou os objetos: se estiverem só numa base que você excluiu, a lista sai vazia.

Prefix-list e AS-PATH no Cisco IOS

O uso básico é informar o nome da lista com -l e o as-set (ou ASN) do cliente:

saída
$ bgpq4 -l AS64500-IN AS-EXEMPLO
no ip prefix-list AS64500-IN
ip prefix-list AS64500-IN permit 198.51.100.0/24
ip prefix-list AS64500-IN permit 203.0.113.0/24

As opções mais usadas no dia a dia:

OpçãoO que faz
-4 / -6Gera a lista IPv4 (padrão) ou IPv6.
-AAgrega prefixos contíguos, deixando a lista menor.
-R 24Aceita também subdivisões até /24, para o cliente poder anunciar blocos menores (útil para engenharia de tráfego). Um /22 vira permit X.X.X.0/22 le 24.
-m 24Descarta da lista prefixos mais específicos que /24.
-L 3Limita a profundidade de expansão de as-sets aninhados, evitando listas gigantes por erro de cadastro.
-sNumera as entradas (seq) no estilo IOS.

Para o filtro de AS-PATH, use -f com o ASN do cliente. O bgpq4 gera uma as-path access-list que só aceita caminhos começando pelo cliente e terminando em um ASN do as-set:

saída
$ bgpq4 -f 64500 -l 10 AS-EXEMPLO
no ip as-path access-list 10
ip as-path access-list 10 permit ^64500(_64500)*$
ip as-path access-list 10 permit ^64500(_[0-9]+)*_(64501|64502)$

Com as duas listas carregadas, aplique no vizinho junto com um limite de prefixos:

cisco ios
router bgp 64496
 address-family ipv4 unicast
  neighbor 192.0.2.1 prefix-list AS64500-IN in
  neighbor 192.0.2.1 filter-list 10 in
  neighbor 192.0.2.1 maximum-prefix 100 90 restart 15

Juniper, Huawei, IOS XR e BIRD

A mesma consulta gera configuração para outros fabricantes trocando uma opção. As opções de nome (-l), agregação e tamanho continuam valendo.

PlataformaOpçãoExemplo
Juniper Junos-Jbgpq4 -J -l AS64500-IN AS-EXEMPLO
Huawei VRP-Ubgpq4 -U -l AS64500-IN AS-EXEMPLO
Huawei XPL-ubgpq4 -u -l AS64500-IN AS-EXEMPLO
Cisco IOS XR-Xbgpq4 -X -l AS64500-IN AS-EXEMPLO
Arista EOS-ebgpq4 -e -l AS64500-IN AS-EXEMPLO
Nokia SR OS (MD-CLI)-nbgpq4 -n -l AS64500-IN AS-EXEMPLO
BIRD-bbgpq4 -b -l AS64500_IN AS-EXEMPLO
MikroTik RouterOS 7-K7bgpq4 -K7 -l AS64500-IN AS-EXEMPLO
JSON (para seus scripts)-jbgpq4 -j -l prefixos AS-EXEMPLO

No Junos, a saída já vem dentro de policy-options com a marcação replace:, então pode ser carregada com load replace terminal (ou load replace arquivo) e a lista antiga é substituída por inteiro.

Se precisar de um formato que não existe, o -F aceita um modelo livre, em que %n é a rede e %l o tamanho da máscara:

bash
# Um prefixo por linha, bom para alimentar outros scripts
bgpq4 -F "%n/%l\n" AS-EXEMPLO

MikroTik RouterOS 7

No RouterOS 7 os filtros de rota mudaram por completo em relação à versão 6 e passaram a ser regras com sintaxe própria. O bgpq4 gera essas regras com -K7, em uma chain com o nome informado e o sufixo -V4 ou -V6:

saída
$ bgpq4 -K7 -4 -l AS64500-IN AS-EXEMPLO
/routing filter rule add chain="AS64500-IN-V4" rule="if (dst==198.51.100.0/24) {accept}"
/routing filter rule add chain="AS64500-IN-V4" rule="if (dst==203.0.113.0/24) {accept}"

Com -R 24, um bloco /22 vira uma regra com faixa de máscara, no formato if (dst in X.X.X.0/22 && dst-len in 22-24) {accept}, permitindo que o cliente anuncie subdivisões.

No RouterOS 7, rotas que não casam com nenhuma regra da chain são rejeitadas, então a lista gerada já funciona como filtro completo. Basta apontar a conexão BGP do cliente para a chain:

routeros
/routing bgp connection set [find name="CLIENTE-AS64500"] input.filter=AS64500-IN-V4

O bgpq4 não gera o comando de remoção das regras antigas. Se você importar a saída duas vezes, as regras ficam duplicadas. Antes de reimportar, remova a chain inteira.

Automatizando a atualização

Gerar a lista uma vez é fácil; o ganho real está em manter os filtros de todos os clientes atualizados sem intervenção. A ideia é simples: um script roda periodicamente, gera o filtro de cada cliente e aplica nos roteadores o que mudou. Ele precisa, no mínimo:

  1. ler a lista de clientes, com o nome do filtro e o as-set (ou ASN) de cada um;
  2. gerar o filtro com o bgpq4 no formato do roteador;
  3. comparar com a última versão aplicada e seguir só se houver diferença;
  4. remover o filtro antigo e carregar o novo no roteador, por SSH ou API;
  5. registrar o que mudou e avisar quando algo der errado.

O difícil não é o caminho feliz, e sim tudo o que pode dar errado com a sessão BGP do cliente no meio:

  • Lista vazia nunca pode ser aplicada. Uma falha de rede na consulta ao IRR ou um as-set apagado por engano gera uma lista vazia, que bloqueia todos os anúncios do cliente.
  • Redução brusca merece alerta. Se a quantidade de prefixos cair pela metade, o mais provável é erro de cadastro, não decisão do cliente.
  • Janela de troca. Entre remover e recriar o filtro existe um intervalo em que o cliente pode perder rotas. Em redes maiores, alterne entre dois filtros e troque a referência só depois que o novo estiver completo.
  • Vários roteadores e fabricantes. Cada um com sua sintaxe e seu jeito de substituir listas, aplicando em um de cada vez e conferindo a sessão antes de seguir.
  • Peers grandes. As-sets que expandem para centenas de milhares de prefixos podem estourar a memória de roteadores menores.

Boas práticas

  • IRR e RPKI juntos. Gere o filtro pelo IRR e descarte rotas RPKI inválidas. Um não substitui o outro.
  • Limite de prefixos em toda sessão. O maximum-prefix é a última barreira se o filtro falhar.
  • Bogons e rotas padrão. Mantenha um filtro fixo de bogons e de 0.0.0.0/0 antes da lista do cliente.
  • Peers grandes. As-sets de operadoras podem expandir para centenas de milhares de prefixos. Prefira -A, -L e confira o tamanho antes de carregar no roteador.
  • IPv6 também. Repita tudo com -6 e objetos route6. É comum o cliente lembrar de registrar só o IPv4.
  • Seu próprio registro. Mantenha os seus objetos route, route6 e seu as-set corretos, porque é com eles que seus upstreams e o IX.br filtram você.

Do tutorial à produção

Gerar um filtro com o bgpq4 leva minutos. Manter os filtros de centenas de clientes corretos todos os dias, sem nunca derrubar uma sessão, é um projeto. O que fica fora deste tutorial:

  • Automação segura de ponta a ponta. Geração, comparação, aplicação em vários roteadores e fabricantes, proteção contra lista vazia e rollback.
  • RPKI junto com o IRR. Validadores RPKI redundantes e descarte de rotas inválidas sem afetar clientes legítimos.
  • Cadastro dos clientes. As-sets e ASNs vindos do sistema de clientes ou do NetBox, não de um arquivo mantido à mão.
  • Alertas e auditoria. Aviso de mudanças bruscas, histórico de cada alteração e relatório de clientes sem registro no IRR.
  • Seus próprios objetos. Route objects, as-set e ROAs corretos para que upstreams e o IX.br aceitem os seus anúncios.

Perguntas frequentes

O bgpq4 substitui o RPKI?

Não. O IRR diz quais prefixos um AS-SET declara anunciar; o RPKI valida criptograficamente qual ASN pode originar cada prefixo. Os dois se complementam: filtre pelo IRR e descarte rotas RPKI inválidas.

Qual a diferença entre o bgpq3 e o bgpq4?

O bgpq4 é a continuação mantida do bgpq3, com suporte a mais fabricantes (como MikroTik RouterOS 7, Nokia e Huawei XPL), melhor desempenho e correções. Para instalações novas, use o bgpq4.

Com que frequência devo atualizar os filtros?

Uma vez por dia é o mais comum em provedores. Clientes que mudam anúncios com frequência podem pedir atualização a cada poucas horas. Evite intervalos menores que uma hora para não sobrecarregar os servidores de IRR.

O que acontece se o cliente não tiver objetos no IRR?

O bgpq4 gera uma lista vazia, que na prática bloqueia todos os anúncios. Por isso uma automação de filtros nunca deve aplicar uma lista vazia: ela mantém a última versão válida e avisa a equipe.

CONSULTORIA BTECH

Prefere que alguém faça isso por você?

A BTECH Automations é uma consultoria em automação, redes e cloud para provedores, operadoras e empresas de hospedagem. Implementamos automação de redes para provedores de ponta a ponta, documentamos e mantemos funcionando, com um pacote mensal de horas e relatório de cada atividade.

  • ✓ Filtros BGP, IRR, RPKI e DNS automatizados
  • ✓ Zabbix, Grafana, logs e alertas sob medida
  • ✓ Cloud, virtualização, backups e portais do cliente

Outros tutoriais