bgpq4 e IRR: gerar filtros de prefixo BGP automaticamente

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
- O cliente (ou você, para o seu ASN) registra no IRR um objeto
routepara cada prefixo, com o ASN de origem, e umas-setlistando os ASNs que ele atende. - Instale o bgpq4 num Linux com saída para a internet:
apt install bgpq4no Debian e no Ubuntu. - Rode
bgpq4 -l NOME OBJETO. Sem flag de formato, a saída é Cisco.-Jgera Juniper e-Ugera Huawei. -Aagrega prefixos vizinhos,-6troca para IPv6 e-f ASNgera filtro de AS-path.- 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:
| Objeto | Para que serve | Exemplo |
|---|---|---|
mntner | Quem pode alterar os objetos (credencial do mantenedor) | MAINT-AS64500 |
aut-num | O seu ASN, com nome, contatos e, opcionalmente, a política de import e export | AS64500 |
route / route6 | Um prefixo e o ASN que origina esse prefixo. É o objeto que o bgpq4 lê | 192.0.2.0/24 com origin: AS64500 |
as-set | Lista de ASNs (e de outros as-sets) atendidos por você. Representa o seu cone de clientes | AS64500: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-CLIENTEScomo 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.
| Flag | O que faz |
|---|---|
-4 / -6 | IPv4 (padrão) ou IPv6 |
-l nome | Nome da lista gerada |
-J | Saída Juniper (policy-options) |
-U | Saída Huawei (ip ip-prefix) |
-K7 | Saída Mikrotik RouterOS v7 |
-A | Agrega prefixos vizinhos (nem todo formato aceita) |
-m len | Descarta prefixos mais específicos que len |
-f ASN | Gera filtro de AS-path de entrada |
-S fontes | Usa só as bases listadas |
-h host | Servidor 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.
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
doneO 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.
cmpediff -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.

Erros comuns com bgpq4 e IRR
| Sintoma | Causa provável | O que fazer |
|---|---|---|
| Prefixo do cliente descartado | Falta o objeto route, ou o origin está com outro ASN | Consultar o whois e pedir o cadastro ao cliente |
| Lista gigante e inesperada | as-set do cliente inclui um trânsito ou um as-set enorme | Revisar os membros; limitar a recursão com -L |
| Objetos antigos voltando | Base sem verificação mantém route de quem já devolveu o bloco | Restringir as fontes com -S, mantendo o TC e as bases dos seus clientes |
| Lista sai com deny 0.0.0.0/0 | Nenhum route para o objeto consultado | Tratar como erro; não aplicar |
| Filtro novo não tem efeito | Política alterada sem refresh da sessão | Rodar o refresh ou soft reset de entrada |
| Formato não reconhecido no Huawei | Versão antiga do bgpq4 sem -U | Atualizar 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).
