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.
# 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/24originado peloAS64500. - 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
-Svocê escolhe em quais bases o bgpq4 confia, e com-hescolhe o servidor consultado.
# 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:
$ 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ção | O que faz |
|---|---|
-4 / -6 | Gera a lista IPv4 (padrão) ou IPv6. |
-A | Agrega prefixos contíguos, deixando a lista menor. |
-R 24 | Aceita 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 24 | Descarta da lista prefixos mais específicos que /24. |
-L 3 | Limita a profundidade de expansão de as-sets aninhados, evitando listas gigantes por erro de cadastro. |
-s | Numera 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:
$ 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:
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.
| Plataforma | Opção | Exemplo |
|---|---|---|
| Juniper Junos | -J | bgpq4 -J -l AS64500-IN AS-EXEMPLO |
| Huawei VRP | -U | bgpq4 -U -l AS64500-IN AS-EXEMPLO |
| Huawei XPL | -u | bgpq4 -u -l AS64500-IN AS-EXEMPLO |
| Cisco IOS XR | -X | bgpq4 -X -l AS64500-IN AS-EXEMPLO |
| Arista EOS | -e | bgpq4 -e -l AS64500-IN AS-EXEMPLO |
| Nokia SR OS (MD-CLI) | -n | bgpq4 -n -l AS64500-IN AS-EXEMPLO |
| BIRD | -b | bgpq4 -b -l AS64500_IN AS-EXEMPLO |
| MikroTik RouterOS 7 | -K7 | bgpq4 -K7 -l AS64500-IN AS-EXEMPLO |
| JSON (para seus scripts) | -j | bgpq4 -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:
# 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:
$ 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:
/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:
- ler a lista de clientes, com o nome do filtro e o as-set (ou ASN) de cada um;
- gerar o filtro com o
bgpq4no formato do roteador; - comparar com a última versão aplicada e seguir só se houver diferença;
- remover o filtro antigo e carregar o novo no roteador, por SSH ou API;
- 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/0antes da lista do cliente. - Peers grandes. As-sets de operadoras podem expandir para centenas de milhares de prefixos. Prefira
-A,-Le confira o tamanho antes de carregar no roteador. - IPv6 também. Repita tudo com
-6e objetosroute6. É comum o cliente lembrar de registrar só o IPv4. - Seu próprio registro. Mantenha os seus objetos
route,route6e 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