Clearing BGP Connections
Quando estamos trabalhando com BGP, principalmente com políticas como route-maps, filtros de prefixo, listas de comunidade e etc. essas mudanças não são aplicadas imediatamente às sessões BGP já estabelecidas. O roteador continua usando a política antiga até que a sessão seja reinicializada ou a tabela de rotas seja recalculada. É aí que entra o clearing da sessão BGP, uma forma de forçar a aplicação das novas configurações.
Tipos de clearing BGP:
Hard Clear (limpeza total)
É o método mais agressivo. Derruba a sessão BGP completamente e depois sobe de novo. O roteador encerra a conexão TCP, limpa todas as rotas recebidas e enviadas, e refaz tudo do zero. Isso pode causar interrupção de tráfego, então só use quando realmente necessário.
clear ip bgp <neighbor-ip>
Ou:
# todos os vizinhos:
clear ip bgp *Soft Clear Inbound (recalcula o que recebo)
Aqui vamos solicitar que o vizinho reenvie as rotas novamente, sem derrubar a sessão, assim podemos aplicar a nova política de entrada (como um novo
route-map
). Isso não impacta o tráfego, então é ideal quando se altera filtros de entrada.clear bgp ipv4 unicast <neighbor-ip> soft in
Soft Clear Outbound (reenvio o que envio)
Esse força o meu roteador a reaplicar as políticas de saída e reenviar as rotas para o vizinho. Serve quando se muda algo que afeta o que estamos anunciando (como
set community
,set as-path prepend
, etc). Nem todos os roteadores vizinhos aceitam isso de forma limpa, mas em geral funciona bem.clear bgp ipv4 unicast <neighbor-ip> soft out
Using
soft-reconfiguration inbound
Se o vizinho não suporta soft clear por padrão, eu posso usar essa configuração no meu lado:
neighbor <IP> soft-reconfiguration inbound
Isso faz o meu roteador guardar uma cópia das rotas recebidas para poder reaplicar filtros mesmo sem pedir para o vizinho reenviar. Consome mais memória, mas funciona.
Quando eu uso cada um?
- Mudei algo na entrada (por exemplo, apliquei um novo
route-map in
): usosoft in
. - Mudei algo na saída (como comunidades BGP, prepend, etc): uso
soft out
. - A sessão está bugada, rotas estranhas, ou quero reiniciar tudo: uso
hard clear
.
Filtragem e Manipulação de Rotas
A Filtragem e manipulação de rotas no BGP são práticas essenciais para controlar o que entra e o que sai da sua tabela de roteamento. Elas servem tanto para proteger sua rede quanto para influenciar o tráfego. Quem opera BGP com responsabilidade nunca anuncia ou aceita rotas cegamente, tudo deve passar por políticas bem definidas.
Quando falamos em filtrar rotas, estamos falando de:
- Bloquear prefixos indesejados (por tamanho, origem, ASN, etc.)
- Aceitar apenas rotas válidas ou autorizadas
- Evitar propagação acidental de prefixos internos
Por exemplo, você pode rejeitar qualquer rota com máscara maior que /24
(prática comum entre provedores), ou bloquear prefixos que pertencem a terceiros que você não deveria anunciar.
Já a manipulação de rotas envolve modificar atributos para influenciar decisões de roteamento, como:
- Local Preference (define preferência de saída dentro do seu AS)
- MED (Multi Exit Discriminator) (sugestão de entrada para vizinhos)
- AS_PATH prepending (tornar o caminho menos atraente para o exterior)
- Communities (marcar rotas para aplicar políticas em larga escala)
Essas alterações não mudam o destino da rota, mas alteram a preferência de tráfego. Por exemplo, se você tem dois links com operadoras diferentes, pode usar local-preference
para preferir um caminho específico para saída, ou usar AS-PATH prepending para "afastar" tráfego de entrada por um dos links.
Tudo isso é aplicado com route-maps, prefix-lists e filtros baseados em communities. Na prática, isso garante que:
- Você não anuncie nada que não deva (evita "leaks" de rotas internas)
- Você não aceite rotas inválidas ou suspeitas
- Você controle como o tráfego entra e sai da sua rede
Essas técnicas são padrão em qualquer política de roteamento profissional, e são reforçadas por boas práticas como o uso de IRR (Internet Routing Registry) e RPKI para validação de origem dos prefixos.
Podemos aplicar filtros de roteamento tanto para os prefixos que recebemos quanto para os que divulgamos. Isso é fundamental para manter controle sobre o que entra na nossa tabela de roteamento e o que sai da nossa rede, evitando, por exemplo, o anúncio acidental de rotas internas ou a aceitação de prefixos inválidos.
Os roteadores da Cisco, de forma geral, oferece quatro mecanismos principais de filtragem de rotas:
distribute-list
: permite filtrar rotas com base em ACLs padrão ou numeradas (para IPv4), aplicada na entrada ou saída.prefix-list
: filtro baseado em prefixos IP e suas máscaras, com mais precisão que ACLs.as-path access-list
: permite filtrar rotas com base no conteúdo do AS_PATH, usando expressões regulares.route-map
: o método mais completo e flexível, podendo combinar condições (prefixos, comunidades, as-path, etc.) e aplicar ações (como alterar atributos BGP).
No entanto, não podemos aplicar ao mesmo tempo uma prefix-list
e uma distribute-list
no mesmo vizinho BGP. O IOS permite apenas um tipo de filtro por direção e por sessão. Se tentar aplicar os dois, um vai sobrescrever o outro.
A prática comum é usar prefix-list
para controlar quais prefixos são aceitos ou enviados e route-map
para manipular atributos como local-preference
, MED
ou AS-PATH
. Já as-path access-list
costuma ser usada dentro de route-maps
para filtrar rotas vindas de ASs específicos.
ACL
No BGP, podemos aplicar filtros de rota com base em ACLs, prefix-lists, ou AS_PATHs, para controlar tanto o que aceitamos (in) quanto o que anunciamos (out). Isso é essencial para garantir que só aceitamos rotas válidas e só propagamos aquilo que realmente nos pertence.
O IOS permite usar ACL padrão e estendida:
- ACL padrão (números 1 a 99): filtra com base apenas no endereço de origem.
- ACL estendida (números 100 a 199): permite combinar IP de origem e destino, protocolos, portas etc. No contexto de BGP, ACLs padrão podem ser usadas para filtrar prefixos, embora atualmente se prefira usar
prefix-list
por ser mais precisa.
No contexto de BGP, ACLs padrão ainda podem ser utilizadas, mas hoje é mais comum e recomendado usar prefix-list
, pois são mais precisas e suportam filtragem por tamanho de prefixo (como /24
, /25
, etc.), coisa que ACLs padrão não conseguem fazer diretamente.
Por exemplo:
access-list 10 permit 192.168.0.0 0.0.255.255
access-list 10 deny any
O wildcard 0.0.255.255
permite qualquer IP entre 192.168.0.0
e 192.168.255.255
, ou seja, um /24
.
O número 10 é simplesmente o identificador da ACL. No IOS clássico (antes do modo nomeado), esse número define qual lista você está criando ou referenciando. Ele pode estar entre 1
e 99
no caso das ACLs padrão. Você pode escolher qualquer número dentro dessa faixa. Exemplo: access-list 1
, access-list 2
, ..., access-list 99
.
Por padrão, todas as ACLs terminam com um deny any
implícito. Isso significa que, se algo não for explicitamente permitido, será negado automaticamente. Mas na prática, é boa prática escrever o deny any
de forma explícita, por dois motivos:
- Fica mais claro para quem está lendo que existe uma intenção de bloquear tudo que não for permitido.
- Facilita o uso de comandos como
show access-lists
, pois os contadores de match mostram claramente quantas vezes rotas foram negadas.
ACLs padrão podem ser aplicadas no BGP com distribute-list
, por exemplo:
router bgp 65000
address-family ipv4
neighbor 198.51.100.1 distribute-list 10 in
Aqui, você está dizendo: "aceite apenas os prefixos definidos na ACL 10 que o vizinho tentar me enviar".
Prefix Matching
Para controlar o tamanho das rotas aceitas, usamos prefix-lists
, que suportam operadores como le
(less than or equal) e ge
(greater than or equal). Abaixo podemos ver uma prefix list clássica:
ip prefix-list ROTA padrao seq 5 permit 0.0.0.0/0 le 32
Isso permite qualquer prefixo válido, do /0
até o /32
. Perigoso se usado sem critério, já que permite qualquer coisa. Para bloquear endereços IP privados, podemos fazer:
ip prefix-list BLOQUEIA_PRIVADOS seq 10 deny 10.0.0.0/8 le 32
ip prefix-list BLOQUEIA_PRIVADOS seq 20 deny 172.16.0.0/12 le 32
ip prefix-list BLOQUEIA_PRIVADOS seq 30 deny 192.168.0.0/16 le 32
ip prefix-list BLOQUEIA_PRIVADOS seq 100 permit 0.0.0.0/0 le 32
Ou, para permitir apenas rotas entre /20
e /24
:
ip prefix-list BLOQUEIA_MAIOR_QUE_24 seq 5 deny 0.0.0.0/0 ge 25
ip prefix-list BLOQUEIA_MAIOR_QUE_24 seq 10 deny 0.0.0.0/0 le 19
ip prefix-list BLOQUEIA_MAIOR_QUE_24 seq 100 permit 0.0.0.0/0 ge 20 le 24
REGEX e AS_PATH ACL
No BGP, você também pode filtrar com base em AS_PATH, usando expressões regulares. Um exemplo clássico:
ip as-path access-list 1 permit ^$
Esse filtro permite somente rotas originadas por você mesmo, ou seja, cujo AS_PATH está vazio (^$
), o que evita que você reexporte rotas aprendidas de terceiros, algo importante para não se tornar trânsito para outras operadoras.
Exemplo de aplicação no BGP:
router bgp 65000
address-family ipv4
neighbor X.X.X.X filter-list 1 out
Aqui, estamos dizendo: "para esse peer, só anuncio prefixos originados pelo meu próprio AS."
Vamos criar um AS-PATH ACL para negar qualquer rota que tenha o AS 65010 em qualquer parte do AS_PATH, negar rotas que terminem com o AS 65020 e permitir apenas rotas originadas no nosso próprio AS (AS_PATH vazio), ou seja, rotas que nós mesmos estamos publicando.
ip as-path access-list 10 deny _65010_
ip as-path access-list 10 deny _65020$
ip as-path access-list 10 permit ^$
router bgp 65000
address-family ipv4
neighbor X.X.X.X filter-list 10 out
Se nenhuma das regras der match, a ação padrão é negar (como nas ACLs tradicionais). Então, se você esquecer de colocar uma linha permit
, todas as rotas serão bloqueadas.
Aplicando no BGP (in ou out)
No BGP, os filtros podem ser aplicados tanto na entrada (in
) quanto na saída (out
) da sessão com o vizinho (peer). Isso define em qual direção o filtro atua:
in
significa que o filtro será aplicado às rotas que o vizinho está tentando nos enviar. Ou seja, você está controlando o que entra na sua tabela BGP.out
significa que o filtro será aplicado às rotas que você está enviando para o vizinho. Ou seja, você está controlando o que a sua rede divulga para ele.
Exemplo:
router bgp 65000
address-family ipv4
neighbor 192.0.2.1 prefix-list BLOQUEIA_PRIVADOS in
neighbor 192.0.2.1 prefix-list PERMITE_20_ATE_24 out
Neste caso:
- Com
in
, você rejeita prefixos privados que o vizinho possa estar tentando te mandar. - Com
out
, você limita os anúncios da sua rede para que o vizinho só receba prefixos entre/20
e/24
.
Essas direções (in
e out
) são sempre relativas ao seu roteador. Isso te dá total controle sobre o que entra na sua rede e o que sai dela, o que é essencial para segurança, política de roteamento e evitar anúncios indevidos.
Route Maps
As Route Maps são como scripts condicionais que podemos usar em roteadores para tomar decisões mais avançadas sobre o que fazer com rotas. Eles funcionam como uma série de instruções: "se isso for verdade, então faça aquilo". Eu uso Route Maps principalmente quando preciso aplicar políticas específicas na hora de redistribuir rotas, fazer filtros mais refinados ou manipular atributos BGP, por exemplo.
Cada Route Map é composto por sequências numeradas chamadas de cláusulas. Em cada cláusula, eu defino uma condição com o comando match
e uma ação com o comando set
. O match
determina se a cláusula se aplica à rota que está sendo analisada (pode ser um prefixo específico, um next-hop, ou até uma lista de AS) e o set
é o que será feito se a condição for atendida, como mudar a métrica, o local-preference ou até mesmo o próximo salto. As cláusulas são lidas na ordem, e assim que uma delas der match
, a ação é executada e o processamento pode parar ou continuar, dependendo da configuração.
O interessante é que eu posso usar Route Maps em várias situações diferentes, como: controlar o que entra ou sai em um roteador, para aplicar políticas em redistribuições de rotas entre protocolos diferentes, ou para manipular atributos em sessões BGP.
Eles me dão uma flexibilidade que simples ACLs ou filtros de prefixo não têm. E como eu posso empilhar várias cláusulas com números diferentes, consigo criar uma lógica bem precisa para tratar rotas de jeitos diferentes, tudo dentro da mesma estrutura.
Regas
Ao criar um Route Map, tem umas regras que é bom lembrar porque o comportamento padrão pode influenciar bastante no resultado. Se não for colocado uma ação de permissão ou negação (permit
ou deny
), ele assume permit
por padrão, então qualquer rota que bater nessa cláusula vai ser aceita, a não ser que eu diga o contrário.
Outra coisa, se não for colocado um número de sequência, o roteador automaticamente incrementa em 10 a partir do anterior. Isso é útil porque me espaço para inserir novas cláusulas depois, sem ter que renumerar tudo, igual nas ACLs.
Se não for definido um critério de correspondência com o match
, ele vai aplicar aquela cláusula para qualquer rota, ou seja, todos os prefixos são considerados correspondentes implicitamente. É como se o match
fosse "match all".
O processamento do Route Map funciona meio como um filtro sequencial. Assim que uma cláusula dá match
, ele executa tudo o que tiver nos set
daquela cláusula, e aí para o processamento ali mesmo. Ele não continua para as próximas cláusulas, então a ordem das sequências faz diferença e precisa ser bem pensada.
A ideia principal é que ele vai avaliando as cláusulas em ordem de número. Se uma cláusula não der match, ele tenta a próxima. Mas se der match, ele executa o que tiver nos set
daquela cláusula e para por ali, ignorando as outras.
Primeiro, vamos criar as ACLs:
ip access-list standard REDE10
permit 10.0.0.0 0.0.0.255
ip access-list standard REDE20
permit 10.0.1.0 0.0.0.255
ip access-list standard REDE30
permit 10.0.2.0 0.0.0.255
Agora vamos criar os Route Maps:
route-map ROTA_POLICY permit 10
match ip address REDE10
route-map ROTA_POLICY permit 20
match ip address REDE20
set metric 100
route-map ROTA_POLICY permit 30
match ip address REDE30
set metric 150
route-map ROTA_POLICY permit 40
set metric 200
route-map ROTA_POLICY deny 50
- Se uma rota vier de
10.0.0.0/24
, vai dar match na cláusula 10 (REDE10) e a rota será aceita do jeito que veio ao mundo. Não faremos nada com essa Rota. - Se for uma rota de
10.0.1.0/24
(REDE20), bate na cláusula 20 e a métrica é configurada para 100 nessa rota. - Se for uma rota de
10.0.2.0/24
, vai cair na cláusula 30. - Agora, se vier uma rota que não bate em nenhuma ACL, ele vai cair na cláusula 40, que não tem match, ou seja, aceita tudo (match implícito). A métrica vira 200.
- A cláusula 50 com
deny
é só para garantir que qualquer rota que não for tratada antes seja negada, mas nesse exemplo ela nem vai ser usada, porque a cláusula 40 já aceita qualquer coisa.
Opções de Matching
Quando se configura uma Route Map, as opções de matching são as condições que são usadas para decidir se aquela cláusula vai se aplicar ou não à rota que está sendo analisada. Se a rota der match com a condição, então o roteador executa as ações definidas com set
naquela cláusula e para o processamento ali.
As opções de match
são bem variadas, a escolha é de acordo com que se deseja filtrar. Por exemplo, se estiver lidando com rotas IP, podemos usar match ip address
junto com uma ACL ou prefix-list. Se for BGP, existem várias opções específicas, como match as-path
, match community
ou match route-type
.
Aqui vão alguns exemplos das opções mais comuns:
match ip address
: compara o prefixo com uma ACL ou prefix-list.match interface <interface-id>
: verifica se a rota está associada a uma determinada interface.match metric
: compara com a métrica da rota.match next-hop
: compara o endereço IP do próximo salto da rota.match tag
: compara o valor de marcação (tag) da rota.match route-type
: compara com o tipo da rota (como internal, external, local, etc).match as-path
: muito usado em BGP, compara com uma as-path access-list.match community <community-list>
: filtra com base em comunidades BGP.match source-protocol {bgp asn | connected | eigrp asn | ospf pid | static}
: muito comum para comparar prefixos com base no protocolo de roteamento de origem e/ou processo de roteamento.match local-preference
,match origin
,match weight
: outros filtros específicos para atributos BGP.
Também podemos combinar mais de um match
na mesma cláusula. Se fizer isso, o comportamento padrão é "AND", ou seja, todos os critérios precisam ser verdade para dar match. Mas se eu quiser que seja um "OR", aí podemos usar o modificador match any
. Se quiser que todos os critérios sejam obrigatórios, uso match all
(que é o padrão).
Essas opções dão um controle bem refinado.
Por padrão, quando se usa mais de um match
na mesma cláusula, o roteador assume que é AND, ou seja, todas as condições precisam ser verdadeiras para dar match. Se eu quiser mudar isso e dizer que qualquer uma das condições serve, aí eu coloco explicitamente match any
.
Exemplo usando AND (padrão):
route-map FILTRO_AND permit 10
match ip address prefixo10
match interface FastEthernet0/1
Aqui ele só vai dar match se a rota bater com a prefix-list
prefixo10
E a interface de saída for aFastEthernet0/1
. Se só uma das duas for verdadeira, não vai dar match, e o roteador pula para próxima cláusula.
Exemplo usando OR com match any
:
route-map FILTRO_OR permit 10
match any
match ip address prefixo10
match ip address prefixo20
Nesse caso, se a rota bater em qualquer um dos dois prefixos, já dá match. Ele vai aceitar rotas que estão em
prefixo10
ou emprefixo20
.
Exemplo explícito com match all
:
route-map FILTRO_ALL permit 10
match all
match ip address prefixo10
match interface FastEthernet0/1
Esse aqui faz exatamente o mesmo que o exemplo do
AND
anterior, mas agora eu deixei claro que queromatch all
. É útil quando quero evitar ambiguidade e deixar explícito que todas as condições têm que bater.
Se nós colocarmos múltiplas condições na mesma linha, teremos uma confição OR. Abaixo podemos ver um exemplo:
ip prefix-list REDE10 seq 5 permit 10.0.0.0/24
ip prefix-list REDE20 seq 5 permit 10.0.1.0/24
route-map EXEMPLO_OR permit 10
match ip address prefix-list REDE10 REDE20
set metric 150
Nesse caso, a cláusula vai dar match se a rota estiver em REDE10
ou REDE20
. O match ip address prefix-list
com várias listas funciona como match any
implícito, não preciso nem escrever match any
nesse cenário, porque o comportamento já é "OR" entre as listas informadas na mesma linha.
Se quiser deixar ainda mais claro, podemos fazer assim:
route-map EXEMPLO_OR permit 10
match any
match ip address prefix-list REDE10 REDE20
set metric 150
Mas nesse exemplo acima, como as listas já estão na mesma linha, o match any
seria redundante, é útil apens quando há vários comandos match
separados, não quando todas as condições estão na mesma linha.
Opções de SET
As opções de set
em um route-map
são as ações que queremos aplicar quando uma cláusula dá match. Ou seja, depois que a rota bate nas condições que foram definidas com match
, o roteador executa o que está nos comandos set
daquela cláusula, pode ser alterar a métrica, o next-hop, marcar uma rota, mudar atributos BGP, entre outros.
A escolha das opções de set
dependendo do contexto, como: redistribuição, manipulação de rotas estáticas, OSPF, BGP, etc. Aqui vão os tipos mais comuns:
Para manipular rotas em geral:
set metric <valor>
Define a métrica da rota. Muito útil na redistribuição entre protocolos.set interface <nome da interface>
Define a interface de saída da rota.set ip next-hop <IP>
Altera o endereço IP do próximo salto da rota.set ip default next-hop <IP>
Seta o next-hop só se a rota não tiver outro válido.set tag <valor>
Marca a rota com um número (tag). Isso é útil para identificar rotas e fazer filtros depois commatch tag
.
Para ambientes com BGP (que é onde o set
brilha):
set local-preference <valor>
Define a preferência local. Usado internamente no AS, quanto maior, mais preferida.set weight <valor>
Peso da rota no BGP (Cisco). Também interno ao roteador, maior = mais preferida.set origin <igp|egp|incomplete>
Altera a origem da rota no BGP, o que influencia no path selection.set as-path prepend <ASN>
Adiciona um ou mais ASNs no início do AS-PATH. É muito útil para tornar a rota menos atrativa para o vizinho BGP.set community <comunidade>
Atribui uma ou mais comunidades BGP à rota.set comm-list <lista> delete
Remove comunidades BGP específicas da rota.set extcommunity
Seta comunidades estendidas (em BGP com VPNs, por exemplo).set aggregator
Define informações de agregador BGP (AS e IP).set atomic-aggregate
Indica que uma agregação foi feita.set originator-id <router-id>
Define o Originator ID em ambientes BGP com route reflectors.set cluster-id <ID>
Define o Cluster ID no BGP route reflector.
Outras opções que às vezes aparecem:
set level <level-1|level-2|level-1-2>
Para IS-IS, define o nível da rota.set ipv6 next-hop <IP>
Define o próximo salto para rotas IPv6.set vrf <nome>
Associa a rota a uma VRF específica.
Continue
O continue
em um route-map
é um recurso que permite não interromper o processamento da rota após um match
. Por padrão, quando uma cláusula dá match, o roteador executa os comandos set
daquela cláusula e para ali mesmo. Mas se eu usar o continue
, eu consigo dizer: "mesmo que essa cláusula tenha dado match, continue processando a cláusula de sequência X".
Isso é útil quando eu quero aplicar ações em etapas, ou quando quero acumular múltiplos set
com base em vários critérios diferentes, tudo dentro do mesmo route-map.
A sintaxe é continue <número>
no final da cláusula que deu match. O número indica qual sequência do route-map deve ser avaliada em seguida. Mesmo que a cláusula atual dê match, o roteador não para, ele pula para cláusula que eu indiquei com o continue
e segue o processamento.
route-map TESTE permit 10
match ip address prefix-list REDE10
set metric 50
continue 30
route-map TESTE permit 20
match ip address prefix-list REDE20
set metric 100
route-map TESTE permit 30
match ip address prefix-list REDE30
set tag 300
Se uma rota bater na prefix-list REDE10
, o roteador executa set metric 50
, mas por causa do continue 30
, ele não para. Vai direto para cláusula 30, e se a rota também bater em REDE30
, ele ainda aplica set tag 300
.
Importante lembrar:
- O
continue
só existe em algumas plataformas Cisco (como IOS 15.3+ e NX-OS). Não é suportado em todas. - Ele só funciona entre cláusulas do mesmo
route-map
, ou seja, ali temos a route map chamada TESTE, mas ele não pode continuar para outra que não seja a TESTE. - Se o número de sequência indicado no
continue
não existir, o processamento termina ali mesmo.
Community
Atributo Community no BGP é um tipo de marca que pode ser associada a rotas para facilitar o controle e a aplicação de políticas. Ela funciona como uma etiqueta (tag) de 32 bits que pode ser usada para agrupar rotas e definir comportamentos específicos durante o processo de roteamento, como o que anunciar, para quem e com que atributos.
Em vez de criar filtros complexos baseados em prefixos ou AS-PATHs, é possível simplesmente aplicar ou verificar comunidades. Elas são amplamente utilizadas em ambientes de ISPs, grandes empresas ou interconexões onde é necessário aplicar políticas de forma escalável.
O valor de uma community é geralmente exibido no formato AA:NN, onde:
AA
representa o ASN (ou um número reservado).NN
representa o valor definido pelo operador.
Exemplo:
65000:100
pode significar "rota recebida de cliente preferencial".
Existem valores especiais que possuem comportamento padronizado:
no-export
Impede que a rota seja exportada para vizinhos eBGP.no-advertise
Impede que a rota seja anunciada a qualquer vizinho, mesmo iBGP.no-export-subconfed
Impede que a rota seja anunciada fora do confederation.internet
Indica que a rota pode ser anunciada para qualquer lugar (comportamento padrão).
Essas communities não precisam ser definidas com AA:NN
, pois são palavras reservadas.
As communities são usadas para:
- Marcar rotas ao recebê-las, facilitando o tratamento posterior com route-maps.
- Aplicar políticas de exportação com base em quem anunciou a rota.
- Controlar o anúncio seletivo de rotas para parceiros, clientes e provedores.
- Fazer prepend automático ou alterar atributos como
local-preference
.
Abaixo podemos ver um exemplo de configuração onde marcamos uma rota com uma community:
route-map MARCAR_CLIENTE permit 10
match ip address prefix-list CLIENTE
set community 65000:100 additive
Filtrar rota baseada na community:
route-map FILTRAR_ROTA deny 10
match community BLOQUEADAS
ip community-list standard BLOQUEADAS permit 65000:200
Remover community:
set comm-list BLOQUEADAS delete
Exemplos com Community
Abaixo está um exemplo completo e bem detalhado de como utilizar BGP communities para liberar, bloquear e alterar o local-preference entre dois sistemas autônomos (ASNs): 65010 e 65020. Esse cenário é comum em ambientes onde há interconexão entre empresas, ISPs ou datacenters.
- ASN 65010 é um provedor.
- ASN 65020 é um cliente que recebe rotas do provedor.
- O roteador do AS 65010 marca as rotas com communities para aplicar políticas.
- O roteador do AS 65020 usa essas marcações para filtrar ou priorizar rotas.
Communities definidas:
Community | Significado |
---|---|
65010:100 | Rota permitida para clientes. |
65010:200 | Rota bloqueada (não deve ser anunciada). |
65010:300 | Rota com prioridade alta (Local-Pref). |
no-export | Rota não será exportada via eBGP. |
Na configuração no AS 65010 (Provedor), vamos criar as Prefix-list para identificar rotas:
ip prefix-list REDE-LIBERADA seq 5 permit 10.0.0.0/24
ip prefix-list REDE-BLOQUEADA seq 5 permit 10.1.0.0/24
ip prefix-list REDE-PRIORITARIA seq 5 permit 10.2.0.0/24
Criar o Route-maps para aplicar communities:
route-map APLICA_COMMUNITY permit 10
match ip address prefix-list REDE-LIBERADA
set community 65010:100 additive
route-map APLICA_COMMUNITY permit 20
match ip address prefix-list REDE-BLOQUEADA
set community 65010:200 additive
route-map APLICA_COMMUNITY permit 30
match ip address prefix-list REDE-PRIORITARIA
set community 65010:300 additive
O parâmetro
additive
no comandoset community
serve para adicionar uma nova community à rota sem apagar as communities que ela já possui. Sem additive, o comportamento padrão é substituir todas as communities existentes pela nova. Com additive, o roteador mantém as communities anteriores e adiciona a nova ao conjunto.
Agora vamos aplicar no vizinho BGP:
router bgp 65010
neighbor 192.0.2.2 remote-as 65020
neighbor 192.0.2.2 route-map APLICA_COMMUNITY out
A configuração no AS 65020 (Cliente), vamos aplicar Community-list para filtrar:
ip community-list standard BLOQUEADAS permit 65010:200
ip community-list standard PRIORITARIAS permit 65010:300
Route-map para bloquear e alterar local-pref:
route-map FILTRA_ENTRADA deny 10
match community BLOQUEADAS
route-map FILTRA_ENTRADA permit 20
match community PRIORITARIAS
set local-preference 200
route-map FILTRA_ENTRADA permit 30
set local-preference 100
A cláusula 30 é genérica: aplica local-pref padrão (100) se nenhuma outra der match.
Aplicar no vizinho BGP:
router bgp 65020
neighbor 192.0.2.1 remote-as 65010
neighbor 192.0.2.1 route-map FILTRA_ENTRADA in
Exemplos com Community Parte 2
Sobre usar community para rotas que não devam ser anunciadas. Bloquear uma rota com um route-map out
e usar uma community
podem parecer ações semelhantes, mas o objetivo, o alcance e o controle de cada abordagem são diferentes.
Se o objetivo for apenas não anunciar uma rota para um vizinho BGP, basta configurar a saída (out
) com um route-map
que filtre ou impeça o envio daquela rota. Não é obrigatório usar community
para isso.
Usando prefix-list + route-map:
ip prefix-list BLOQUEAR_ROTA seq 5 deny 10.1.0.0/24
ip prefix-list BLOQUEAR_ROTA seq 10 permit 0.0.0.0/0 le 32
route-map BLOQUEIO_OUT deny 10
match ip address prefix-list BLOQUEAR_ROTA
route-map BLOQUEIO_OUT permit 20
router bgp 65010
neighbor 192.0.2.2 remote-as 65020
neighbor 192.0.2.2 route-map BLOQUEIO_OUT out
Neste exemplo, a rota
10.1.0.0/24
não será anunciada para o vizinho, e todas as demais serão.
Usando community + filtro no route-map (se desejar delegar controle):
route-map MARCAR_BLOQUEIO permit 10
match ip address prefix-list REDE-BLOQUEADA
set community 65010:200 additive
router bgp 65010
neighbor 192.0.2.2 remote-as 65020
neighbor 192.0.2.2 route-map MARCAR_BLOQUEIO out
Nesse caso, a community é aplicada, e o AS vizinho pode decidir filtrar com base nela.
Usando diretamente no-export
:
route-map MARCAR_NOEXPORT permit 10
match ip address prefix-list REDE-BLOQUEADA
set community no-export additive
Com
no-export
, a rota pode circular dentro do AS (entre iBGPs), mas não será anunciada via eBGP, mesmo sem um filtro explícito na saída.
Com Route-map na saída (out), temos bloqueio direto. Esse método impede que a rota seja anunciada a um vizinho específico, aplicando um filtro diretamente. Como funciona:
O roteador analisa o prefixo antes de enviar.
Se a rota der match com uma ACL ou prefix-list, e o route-map for deny, ela não será anunciada para aquele vizinho.
Esse método é simples e direto. Possui um escopo local, o filtro só vale para aquele vizinho configurado. A decisão de bloquear é feita unilateralmente, pelo roteador que anuncia. Não depende do roteador vizinho interpretar nada.
Usando uma community, a rota é marcada no momento em que é processada ou anunciada. O roteador não bloqueia nada por padrão, quem vai agir sobre a marca é quem recebe a rota (o vizinho).
A community é um rótulo, que viaja junto com a rota.
O roteador vizinho pode ter regras para negar, preferir ou modificar rotas com base nessa marca.
A community não bloqueia sozinha, é preciso configurar o que será feito com ela.
Esse método de política é mais flexível e reutilizável para vários vizinhos. Permite criar regras como: "bloqueie tudo com 65010:200", "dê preferência para 65010:300", etc. O escopo é mais amplo, pode ser interpretada por vários roteadores ou ASNs ao longo do caminho. Permite delegar controle de política para outros AS.
O lado ruim é que a rota será anunciada e o vizinho BGP pode escolher aceitar ou não, mesmo que estejamos dizendo para não aceitar, ele pode.
Maximum Prefix
O comando maximum-prefix
é usado em sessões BGP para limitar a quantidade de rotas que podem ser recebidas de um vizinho. Ele serve como um mecanismo de proteção contra falhas de configuração ou propagação excessiva de rotas, como em casos de vazamentos de rota (route leaks) que podem causar instabilidade na rede.
A finalidade de definir um prefixo máximo é evitar sobrecarga na tabela BGP, proteger contra anúncios excessivos ou incorretos, impedir que um vizinho sobrecarregue o roteador local entre outros.
A sintaxe básica é a seguinte:
neighbor <IP-do-vizinho> maximum-prefix <número> [threshold] [restart-time] [warning-only]
Exemplo, vamos limitar em mil prefixos o que um vizinhos nos envia:
neighbor 192.0.2.1 maximum-prefix 1000
Este comando encerra a sessão BGP se o vizinho tentar anunciar mais de 1000 rotas.
Outro exemplo, vamos usar threshold
:
neighbor 192.0.2.1 maximum-prefix 1000 80
1000: limite máximo de rotas aceitas.
80: porcentagem de uso que aciona um alerta (log), neste caso, ao atingir 800 rotas.
Vamos trabalhar com tempo de reconexão:
neighbor 192.0.2.1 maximum-prefix 1000 80 5
Além do alerta com 80% e o limite de 1000 rotas, este comando define que o roteador tentará restabelecer a sessão BGP após 5 minutos, caso ela seja encerrada por excesso de prefixos.
Vamos configurar um log de aviso, sem derrubar a sessão:
neighbor 192.0.2.1 maximum-prefix 1000 80 warning-only
Neste caso, nenhuma ação será tomada se o número for ultrapassado, apenas um log de aviso será gerado.
Sem o warning-only
, o comportamento padrão é:
- A sessão BGP com o vizinho é derrubada imediatamente.
- Um log de erro é gerado informando que o limite foi excedido.
- Se o
restart-time
estiver configurado, a sessão será reativada automaticamente após o tempo definido.
Peer Groups
Os Peer Groups são um recurso no BGP que permite agrupar vizinhos (peers) que compartilham a mesma configuração. Ao invés de repetir manualmente os mesmos comandos para cada vizinho, é possível definir um grupo com os parâmetros comuns e associar os vizinhos a esse grupo. Isso torna a configuração mais simples, limpa e escalável, especialmente em ambientes com muitos vizinhos BGP, como em ISPs, IXPs ou grandes datacenters.
BGP Peer Group clássico (IPv4, sem template) Utilizado em versões mais antigas do IOS, apenas para sessões semafóricas (IPv4 unicast).
BGP Peer Templates (mais modernos) Suportam múltiplas address-families e permitem herança entre templates.
Abaixo podemos ver um exemplo simples com Peer Group clássico:
router bgp 65010
neighbor GRUPO-CLIENTES peer-group
neighbor GRUPO-CLIENTES remote-as 65020
neighbor GRUPO-CLIENTES update-source Loopback0
neighbor GRUPO-CLIENTES next-hop-self
neighbor GRUPO-CLIENTES route-map ENTRADA in
neighbor GRUPO-CLIENTES route-map SAIDA out
neighbor 192.0.2.1 peer-group GRUPO-CLIENTES
neighbor 192.0.2.2 peer-group GRUPO-CLIENTES
neighbor 192.0.2.3 peer-group GRUPO-CLIENTES
Nesse exemplo, todas as configurações aplicadas ao GRUPO-CLIENTES
são herdadas pelos três vizinhos. Qualquer mudança no peer group é propagada automaticamente para os vizinhos associados.
Exemplo com Peer Template (novo modelo)
router bgp 65010
bgp peer-group TEMPLATE-CLIENTE
remote-as 65020
update-source Loopback0
route-map ENTRADA in
route-map SAIDA out
address-family ipv4
send-community
next-hop-self
exit-address-family
neighbor 192.0.2.1 inherit peer-group TEMPLATE-CLIENTE
neighbor 192.0.2.2 inherit peer-group TEMPLATE-CLIENTE
Esse formato é mais moderno e usado em IOS-XR, NX-OS e IOS com suporte a peer templates.