[GTER] OpenBGPD escondendo prefixos

Christian Lyra lyra at pop-pr.rnp.br
Wed Jun 15 18:50:33 -03 2011


Caros,

Aproveitando o assunto, solicito a ajuda de quem já mexeu com o
openbsd com o seguinte cenário:

Estou configurando um route-server (65000) e mais 3 ASs clientes ( 1,
2, 3). Os As 2 e 3 fornecem transito para um quarto AS (4). O AS4 por
sua vez anuncia os seus prefixos com um prepend para o AS3 e sem
prepend para o AS2. Se o ascii permitir a topologia é essa:

                 RS
-----------------------------------
|                 |                |
AS1          AS2           AS3
                  |                |
                  -----------------
                          |
                       AS4

Como cada AS anuncia dois prefixos, a tabela de rotas conhecida pelo
RS é a seguinte:

flags destination          gateway          lpref   med aspath origin
*>    10.1.0.0/17         x.x.x..91     100     0 1 i
*>    10.1.128.0/17        x.x.x.x.91     100     0 1 i
*>    10.2.0.0/17          x.x.x.x.92     100     0 2 i
*>    10.2.128.0/17        x.x.x.x.92     100     0 2 i
*>    10.3.0.0/17          x.x.x.x.93     100     0 3 i
*>    10.3.128.0/17        x.x.x.x.93     100     0 3 i
*>    10.4.0.0/17          x.x.x.x.92     100     0 2 4 i
*     10.4.0.0/17          x.x.x.x.93     100     0 3 4 4 i
*>    10.4.128.0/17        x.x.x.x.92     100     0 2 4 i
*     10.4.128.0/17        x.x.x.93     100     0 3 4 4 i

Como o BGP por padrão exporta apenas as rotas "best", o AS1 aprende o
caminho para o AS4 através do AS2, como era de se esperar. A
configuração do RS nesse cenário é a seguinte:

peer1="x.x.x.91"
peer2="x.x.x.92"
peer3="x.x.x.93"
ASN="65000"

AS $ASN
router-id x.x.x.99
fib-update no
transparent-as yes
nexthop qualify via bgp

group "RS" {
        neighbor $peer1 {
                descr   "AS1"
                remote-as 1
                announce all
        }
        neighbor $peer2 {
                descr "AS2"
                remote-as 2
                announce all
        }
        neighbor $peer3 {
                descr "AS3"
                remote-as 3
                announce all
        }
}

match from any set community $ASN:neighbor-as

Ok... até aí tudo bem. Agora vamos complicar um pouco mais o cenário e
estabelecer que o AS1 não troque mais tráfego com o AS2. Se
simplesmente aplicarmos um filtro no que é exportado para o AS1 e AS2,
então o AS1 não vai aprender o caminho para o AS4, porque a rota para
este AS via AS3 não é best. Essa situação é bem explicada pelo pessoal
do quagga aqui[1]. Para solucionar esse problema no quagga, foi criado
a opção de "route server client", que na prática implementa uma tabela
de roteamento para cada participante. O filtro é aplicado antes dos
prefixos serem inseridos na tabela do participante, e depois é feita a
escolha de caminhos.

No BIRD a solução é parecida, mas com um pequeno "plus" que é a
utilização de um tabelão principal onde *não* é aplicado a seleção de
rotas. Um exemplo dessa configuração pode ser encontrado em [2].

Estou com dificuldades de implementar uma solução parecida com o
OpenBGPd. Minha primeira tentativa foi a de simplesmente adicionar a
opção "route-collector yes" que segundo o manual, faz com que o
processo de seleção de rotas seja desligada. Imaginei que com isso o
RS enviasse todas as rotas que ele aprendeu para os peers, mas não foi
o aconteceu. E ao aplicar os filtros o AS1 não aprendeu o caminho para
o AS4. A configuração adicionada foi a seguinte:

route-collector yes
deny to $peer1 community $ASN:2
deny to $peer2 community $ASN:1

Bom... a segunda tentativa foi a de criar uma tabela de rotas nova, e
no comando que a cria é possível desligar a seleção de rotas:

rde rib tudo no evaluate

e dentro de cada peer acrescentei "rib tudo". Ao fazer isso descobri
que se não tem seleção de rotas, então nenhuma rota é exportada (o
openbpd leva a sério o negócio de só exportar as best!).

Por fim, a última tentativa foi a de criar uma rib para cada
participante e tentar aplicar o filtro a apenas uma rib. O manual dá a
entender que:

deny to $peer1 community $ASN:2 rib toAS1

é valido. Mas não é :-(

A documentação do openbgpd segue o padrão "openbsd", ou seja, costuma
ser boa, mas carece de exemplos. O google não ajudou muito, e
encontrei apenas alguns poucos exemplos de configuração. Desconfio que
é possível resolver isso com o recurso de rdomains, mas o manual
parece indicar esse recurso para outros cenários (vpns).

Enfim... alguem tem alguma idéia? :-)


[1] http://www.quagga.net/docs/docs-multi/Description-of-the-Route-Server-model.html
[2] https://git.nic.cz/redmine/projects/bird/wiki/Route_server_example

p.s. eu teria enviado essa msg para a lista "ptt.br" mas ela não existe :-(

-- 
Christian Lyra
PoP-PR/RNP



More information about the gter mailing list