BGP

bgpq4 e IRR: gerar filtros de prefixo BGP automaticamente

Funil de prefixos: objetos do IRR passando pelo bgpq4 e virando prefix-list no roteador

O bgpq4 é uma ferramenta de linha de comando que consulta o IRR e devolve a prefix-list pronta para colar no roteador, no formato do fabricante. Em vez de alguém do NOC abrir um chamado, copiar os blocos que o cliente mandou por e-mail e montar a lista na mão, o filtro passa a sair do que o próprio cliente registrou no IRR.

A diferença aparece no dia em que o cliente de trânsito ganha um cliente novo ou recebe outro bloco. Com lista manual, alguém esquece de atualizar e o prefixo é descartado, ou pior, alguém libera tudo para resolver rápido. Com o filtro gerado pelo IRR, basta o cliente cadastrar o objeto e a próxima execução já traz o prefixo. Este guia mostra os objetos que importam, o cadastro no TC, a instalação do bgpq4, a saída para Cisco, Juniper e Huawei e um script para rodar todo dia.

Resposta rápida: como o bgpq4 gera filtros

  1. O cliente (ou você, para o seu ASN) registra no IRR um objeto route para cada prefixo, com o ASN de origem, e um as-set listando os ASNs que ele atende.
  2. Instale o bgpq4 num Linux com saída para a internet: apt install bgpq4 no Debian e no Ubuntu.
  3. Rode bgpq4 -l NOME OBJETO. Sem flag de formato, a saída é Cisco. -J gera Juniper e -U gera Huawei.
  4. -A agrega prefixos vizinhos, -6 troca para IPv6 e -f ASN gera filtro de AS-path.
  5. Aplique a lista numa política de entrada do vizinho e agende a geração. Antes de aplicar, compare com a versão anterior e trave se a lista vier vazia ou encolher demais.

IRR: TC, RADB e os objetos route, aut-num e as-set

O IRR (Internet Routing Registry) é um conjunto de bases públicas em que cada rede declara quais prefixos origina e quais redes atende. Os dados seguem a linguagem RPSL. Existem várias bases: as dos registros regionais, como a da LACNIC, e bases independentes, como RADB e o TC, o IRR brasileiro mantido por voluntários e gratuito, muito usado pelos ASNs do país.

Para filtro de prefixo, quatro tipos de objeto importam:

ObjetoPara que serveExemplo
mntnerQuem pode alterar os objetos (credencial do mantenedor)MAINT-AS64500
aut-numO seu ASN, com nome, contatos e, opcionalmente, a política de import e exportAS64500
route / route6Um prefixo e o ASN que origina esse prefixo. É o objeto que o bgpq4 lê192.0.2.0/24 com origin: AS64500
as-setLista de ASNs (e de outros as-sets) atendidos por você. Representa o seu cone de clientesAS64500:AS-CLIENTES

Quando você pede ao seu trânsito para liberar seus anúncios, ele normalmente roda algo como o bgpq4 contra o seu as-set. Quando o seu cliente pede a você, o caminho é o inverso: você gera o filtro a partir do as-set ou do ASN dele. O IRR não prova que o prefixo é seu, ele só registra o que cada um declarou. Por isso ele anda junto com o RPKI, que assina a origem com certificado; o passo a passo está no post sobre como criar ROA no Registro.br.

Cadastro do ASN e dos prefixos no TC

O TC (bgp.net.br) aceita objetos por um assistente na web, por e-mail para o robô do IRR e por API compatível com o IRRd. O primeiro passo é ter o mantenedor, no formato MAINT-ASnnnn. Depois vêm o aut-num, um route para cada bloco anunciado (e route6 para IPv6) e o as-set com o seu cone.

Os objetos ficam parecidos com estes. Os valores são de documentação:

aut-num:     AS64500
as-name:     EXEMPLO-NET
import:      from AS64510 accept AS64510
export:      to AS64510 announce ANY
mnt-by:      MAINT-AS64500
source:      TC

route:       192.0.2.0/24
descr:       bloco de exemplo
origin:      AS64500
mnt-by:      MAINT-AS64500
source:      TC

as-set:      AS64500:AS-CLIENTES
members:     AS64500, AS64510, AS64511:AS-CLIENTES
mnt-by:      MAINT-AS64500
source:      TC
  • route com o prefixo exato que vai para o BGP. Se você anuncia o /22 e dois /24 de dentro dele, cadastre os três. O filtro gerado aceita só o que está no IRR.
  • origin é o ASN que origina. Bloco do cliente que você anuncia com o ASN dele leva o ASN dele, não o seu.
  • as-set hierárquico. Desde a migração para o IRRd 4, o TC exige o nome no formato ASnnnn:AS-NOME, que amarra o conjunto ao dono do ASN.
  • Inclua os as-sets dos clientes, não só os ASNs. Colocando AS64511:AS-CLIENTES como membro, o cone do cliente B entra no seu sem você mexer em nada quando ele ganha um cliente novo.

Para conferir o que está registrado, consulte o whois do TC. A segunda linha lista todos os objetos do seu mantenedor:

whois -h bgp.net.br AS64500
whois -h bgp.net.br -s TC -i mnt-by MAINT-AS64500

Se o seu ASN ainda não aparece no TC, o artigo Cadastrando seu ASN no IRR TC do Brasil Peering Forum mostra o cadastro passo a passo.

Instalar o bgpq4 no Linux

O bgpq4 está nos repositórios do Debian e do Ubuntu. No Debian 12 a versão é a 1.9 e no Debian 13 é a 1.12. O Debian 11 traz a 0.0.6, antiga demais: pode faltar formato de saída, então prefira uma versão recente ou compile a partir do código no GitHub.

sudo apt update
sudo apt install bgpq4
man bgpq4

Por padrão o bgpq4 consulta rr.ntt.net, um servidor IRRd que espelha várias bases, entre elas a da LACNIC, a do Registro.br e o TC. Para consultar outro servidor, use -h host. Para limitar as bases consultadas, use -S com a lista separada por vírgula. A man page recomenda usar só as bases em que você e seus clientes têm objetos, evitando bases sem verificação que guardam route antigo. Para uma rede brasileira, algo como -S RPKI,LACNIC,REGISTROBR,TC faz sentido; deixar o TC de fora descarta o cadastro que este guia ensina a fazer.

FlagO que faz
-4 / -6IPv4 (padrão) ou IPv6
-l nomeNome da lista gerada
-JSaída Juniper (policy-options)
-USaída Huawei (ip ip-prefix)
-K7Saída Mikrotik RouterOS v7
-AAgrega prefixos vizinhos (nem todo formato aceita)
-m lenDescarta prefixos mais específicos que len
-f ASNGera filtro de AS-path de entrada
-S fontesUsa só as bases listadas
-h hostServidor IRRd consultado (padrão rr.ntt.net)

Gerar a prefix-list para Cisco, Juniper e Huawei

O objeto consultado pode ser um ASN, um as-set ou um prefixo. Com ASN, o bgpq4 traz os route com aquele origin. Com as-set, ele expande os membros de forma recursiva e junta os prefixos de todos.

Cisco IOS

Sem flag de formato, a saída é Cisco. A primeira linha apaga a lista antiga para que a nova substitua tudo:

bgpq4 -4 -l AS64510-IN AS64510
no ip prefix-list AS64510-IN
ip prefix-list AS64510-IN permit 198.51.100.0/24

Juniper Junos

Com -J, a lista sai dentro de policy-options com a palavra replace:, pensada para ser carregada com load replace terminal. Assim o conteúdo antigo da lista é trocado pelo novo:

bgpq4 -J -l AS64510-IN AS64510
policy-options {
replace:
 prefix-list AS64510-IN {
    198.51.100.0/24;
 }
}

Huawei VRP

Com -U, o bgpq4 gera ip ip-prefix com endereço e máscara separados por espaço, como o VRP espera. O exemplo usa o as-set do cliente B, que tem um /25 próprio e repassa outro /25 do cliente dele. Com -A, os dois viram uma linha só:

bgpq4 -U -A -l AS64511-IN AS64511:AS-CLIENTES
undo ip ip-prefix AS64511-IN
ip ip-prefix AS64511-IN permit 203.0.113.0 24 greater-equal 25 less-equal 25

Leia a linha assim: aceite qualquer prefixo dentro de 203.0.113.0/24 com máscara de 25 a 25, ou seja, exatamente os dois /25. O /24 inteiro não passa, porque ninguém registrou um route para ele. Repare que a saída não traz index: o VRP numera as entradas sozinho.

Atenção à lista vazia. Se o objeto não tiver nenhum prefixo no IRR, o bgpq4 gera uma linha de deny para tudo. No formato Huawei ela sai com barra, como abaixo. Não cole isso no roteador; trate como erro e mantenha a lista anterior.
undo ip ip-prefix AS64511-IN
ip ip-prefix AS64511-IN deny 0.0.0.0/0

IPv6 e filtro de AS-path

A mesma lógica vale para IPv6 com -6, que lê os objetos route6. O -f gera um filtro de AS-path que aceita rotas vindas do ASN do cliente e originadas por um ASN do as-set dele, útil como segunda camada. Se o seu IPv6 ainda está no começo, veja antes o post sobre o que é IPv6.

bgpq4 -6 -U -l AS64510-IN-V6 AS64510
bgpq4 -U -f 64511 -l AS64511-PATH AS64511:AS-CLIENTES

Aplicar o filtro no vizinho BGP

A lista sozinha não filtra nada. Ela precisa estar numa política de entrada do vizinho. No Huawei, o caminho é uma route-policy com um nó que aceita o que casa com a ip-prefix e um nó final que nega o resto. Depois do commit, o return volta para a visão de usuário, onde o refresh bgp pede as rotas de novo ao vizinho e aplica a política sem derrubar a sessão:

route-policy CLIENTE-A-IN permit node 10
 if-match ip-prefix AS64510-IN
 quit
route-policy CLIENTE-A-IN deny node 100
 quit
bgp 64500
 ipv4-family unicast
  peer 192.0.2.10 route-policy CLIENTE-A-IN import
  quit
 quit
commit
return
refresh bgp 192.0.2.10 import
display ip ip-prefix AS64510-IN

O nó 100 com deny deixa explícito que o que não está no IRR fica de fora. Se você já marca as rotas de cliente com community, o nó 10 é o lugar de colocar o apply community, como no guia de BGP communities no Huawei, com route-policy de cliente e de trânsito. Para os demais comandos de consulta do VRP, a lista de comandos para roteadores e switches Huawei ajuda.

No Cisco IOS, a prefix-list vai direto no vizinho, dentro da address-family, e o soft reset de entrada aplica o filtro sem derrubar a sessão:

router bgp 64500
 address-family ipv4 unicast
  neighbor 192.0.2.10 prefix-list AS64510-IN in
 exit-address-family
end
clear ip bgp 192.0.2.10 soft in

No Junos, a lista entra numa policy-statement com prefix-list-filter e o tipo de casamento exact, seguida de um termo que rejeita o resto. O commit check valida antes de aplicar:

set policy-options policy-statement CLIENTE-A-IN term IRR from prefix-list-filter AS64510-IN exact
set policy-options policy-statement CLIENTE-A-IN term IRR then accept
set policy-options policy-statement CLIENTE-A-IN term RESTO then reject
set protocols bgp group CLIENTES neighbor 192.0.2.10 import CLIENTE-A-IN
commit check
commit

Script agendado que atualiza os filtros

Gerar a lista uma vez resolve metade do problema. A outra metade é manter atualizada. O script abaixo lê um arquivo com o nome da lista e o objeto do IRR de cada cliente, gera a versão nova e só grava se ela passar em três checagens. Aplicar no roteador fica como etapa separada, revisada por alguém ou feita por uma ferramenta de automação com aprovação.

# /etc/filtros-bgp.conf: nome-da-lista  objeto-no-IRR
AS64510-IN  AS64510
AS64511-IN  AS64511:AS-CLIENTES
#!/bin/bash
# Gera prefix-lists Huawei a partir do IRR. Só grava se o resultado
# passar nas checagens; aplicar no roteador continua sendo outra etapa.
set -euo pipefail
DIR=${DIR:-/var/lib/filtros-bgp}
CONF=${CONF:-/etc/filtros-bgp.conf}
mkdir -p "$DIR"

grep -v '^#' "$CONF" | while read -r NOME OBJ; do
  [ -z "${NOME:-}" ] && continue
  NOVO="$DIR/$NOME.novo"
  ATUAL="$DIR/$NOME.txt"
  if ! bgpq4 -4 -U -A -l "$NOME" "$OBJ" > "$NOVO"; then
    echo "$(date -Is) $NOME: falha na consulta ao IRR"
    continue
  fi
  if grep -q ' deny ' "$NOVO"; then
    echo "$(date -Is) $NOME: lista vazia no IRR, mantida a anterior"
    continue
  fi
  N_NOVO=$(grep -c ' permit ' "$NOVO" || true)
  N_ATUAL=0
  if [ -f "$ATUAL" ]; then
    N_ATUAL=$(grep -c ' permit ' "$ATUAL" || true)
  fi
  if [ "$N_NOVO" -lt $((N_ATUAL / 2)) ]; then
    echo "$(date -Is) $NOME: caiu de $N_ATUAL para $N_NOVO, revisar"
    continue
  fi
  if ! cmp -s "$NOVO" "$ATUAL"; then
    [ -f "$ATUAL" ] && diff -u "$ATUAL" "$NOVO" || true
    mv "$NOVO" "$ATUAL"
    echo "$(date -Is) $NOME: atualizada com $N_NOVO linhas"
  else
    rm -f "$NOVO"
  fi
done

O que cada parte faz:

  • set -euo pipefail: para em erro inesperado e em variável não definida.
  • Falha na consulta (IRR fora do ar, sem rede): registra e pula o cliente, sem apagar a lista boa.
  • Linha com deny: o objeto não tem prefixo no IRR. Mantém a anterior e avisa.
  • Queda para menos da metade das linhas: costuma ser objeto apagado por engano ou as-set quebrado. Para e pede revisão.
  • cmp e diff -u: só regrava quando muda e deixa no log o que entrou e o que saiu.

Para rodar todo dia de madrugada, instale o script e coloque no cron. As mensagens vão para o /var/log/filtros.log; para o aviso chegar ao NOC, ligue esse arquivo ao seu monitoramento ou troque o echo por um envio de e-mail.

sudo install -m 755 filtros.sh /usr/local/bin/filtros.sh
# crontab -e (todo dia às 04:15)
15 4 * * * /usr/local/bin/filtros.sh >> /var/log/filtros.log 2>&1

Com o -A, prefixos vizinhos viram uma linha com greater-equal e less-equal. Se você quer descartar tudo que for mais específico que /24 (um /25 ou menor), acrescente -m 24 na linha do bgpq4. Só confira antes se algum cliente anuncia /25 legítimo por contrato.

Fluxo de filtros BGP gerados pelo bgpq4: IRR, bgpq4, prefix-list e roteador de borda
O cliente cadastra no IRR, o bgpq4 gera a lista, o script confere e a lista vai para a route-policy do vizinho.

Erros comuns com bgpq4 e IRR

SintomaCausa provávelO que fazer
Prefixo do cliente descartadoFalta o objeto route, ou o origin está com outro ASNConsultar o whois e pedir o cadastro ao cliente
Lista gigante e inesperadaas-set do cliente inclui um trânsito ou um as-set enormeRevisar os membros; limitar a recursão com -L
Objetos antigos voltandoBase sem verificação mantém route de quem já devolveu o blocoRestringir as fontes com -S, mantendo o TC e as bases dos seus clientes
Lista sai com deny 0.0.0.0/0Nenhum route para o objeto consultadoTratar como erro; não aplicar
Filtro novo não tem efeitoPolítica alterada sem refresh da sessãoRodar o refresh ou soft reset de entrada
Formato não reconhecido no HuaweiVersão antiga do bgpq4 sem -UAtualizar o pacote ou compilar a versão atual

Um cuidado a mais: o bgpq4 confia no que está no IRR. Se um cliente cadastra um bloco que não é dele, o filtro aceita. Para trânsito, combine o filtro de IRR com validação RPKI e com um limite de prefixos por vizinho. Assim um erro de cadastro não vira vazamento.

Perguntas frequentes

O que é o bgpq4?

É uma ferramenta de código aberto que consulta bases IRR e gera prefix-lists e filtros de AS-path no formato de vários fabricantes, como Cisco, Juniper, Huawei, Mikrotik e BIRD. Ela nasceu como um fork do bgpq3.

Qual a diferença entre IRR e RPKI?

O IRR é um registro declarativo: cada rede diz o que origina e quem atende, sem prova criptográfica. O RPKI assina a relação entre prefixo e ASN com certificado emitido pelo registro. Os dois se complementam no filtro de entrada.

O bgpq4 funciona com Huawei?

Sim. A flag -U gera ip ip-prefix no formato do VRP e -u gera o formato XPL. Use uma versão recente do pacote, porque versões antigas não têm todos os formatos.

Preciso cadastrar meu ASN no IRR?

Na prática, sim. Operadoras de trânsito e route servers de IX geram filtros a partir do IRR, e prefixo sem objeto route tende a ser descartado. No Brasil, o TC é gratuito e é o caminho mais usado pelos provedores regionais.

Com que frequência devo atualizar os filtros?

Uma vez por dia atende a maioria dos casos, com a opção de rodar na hora quando o cliente avisa que cadastrou um bloco novo. O que mais importa é ter as checagens de lista vazia e de queda brusca antes de aplicar.

Conclusão

O bgpq4 tira a prefix-list da mão do NOC e coloca a responsabilidade onde ela deveria estar: no cadastro que cada rede faz no IRR. O ganho é menos chamado para liberar prefixo e menos chance de alguém abrir o filtro às pressas. O trabalho que sobra é manter o seu próprio cadastro em dia, cobrar o dos clientes e deixar o script com travas antes de qualquer mudança chegar à borda.

Leitura recomendada: Cadastrando seu ASN no IRR TC, do Brasil Peering Forum (conteúdo sob licença CC BY-NC 4.0).

Compartilhar:

Sobre o autor

Ivan Alves

Especialista em redes de provedores (ISP)

Ivan Alves trabalha há mais de 15 anos com redes de provedores de internet, do NOC ao backbone e à borda BGP. Coordena infraestrutura e tecnologia em um provedor regional e escreve aqui os tutoriais que gostaria de ter encontrado quando começou: comandos testados, cenário explicado e o porquê de cada linha.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *