Como fazer com que um determinado conteudo saia por um link especifico

De Wiki BPF
Ir para navegação Ir para pesquisar

Introdução

O titulo deste artigo é propositalmente duvidoso, visto que a maioria das pessoas dizem sair quando na verdade estão querendo dizer receber tráfego.

Antes de tudo, é importante lembrarmos que redes são compostas sempre de dois sentidos: upload e download. Quando você acessa uma página no facebook, por exemplo, inicialmente envia (faz upload) um pacote, para após isso receber (fazer download) outro pacote.

Quando você possui apenas um link de internet, é bastante simples: o caminho por onde você envia dados é o mesmo por onde também recebe. Entretanto, quando você é multihomed e possui dois ou mais links, o caminho pode ser assimétrico: você pode enviar dados por um link e receber por outro ou vice-versa.

O objetivo deste artigo é mostrar, de forma superficial, como manipular o tráfego para que um conteúdo seja acessado por um link ou por outro, para o sentido do download e para o sentido do upload. Este artigo abrangerá apenas como fazer tais modificações através de BGP.

Este artigo não objetiva esgotar todo o assunto sobre BGP, apenas esclarecer de forma superficial este tema, que é bastante recorrente.

Como a vasta maioria dos iniciantes em BGP utiliza Mikrotik, utilizaremos o próprio RouterOS nos exemplos deste artigo. Caso utilize outro vendor, basta seguir a mesma lógica exemplificada com Mikrotik.

Advertência: não considere os filtros usados nos exemplos deste artigo como sendo completos ou adequados para seu cenário. Eles foram usados apenas como um exemplo para contextualizar o conteúdo ensinado neste artigo.

Como manipular o upload

As rotas recebidas (import/IN) de seus neighbors BGP vão determinar por onde você irá fazer o upload para os destinos desejados. Quando estamos tratando de BGP, sempre o seu upload terá efeito em todo o seu tráfego. Isto quer dizer que se você desejar que um cliente faça upload para um determinado destino usando o link A, todos os demais clientes também farão upload por este mesmo caminho. Isto acontece porque o roteamento é sempre determinado pelo destino e não pela origem. A menos que você utilize algum recurso como PBR, não será possível determinar que apenas alguns hosts façam upload por um link e outros hosts façam upload por outro link, quando se tratar de um mesmo destino.

Existem duas formas principais, com BGP, de fazer com que um determinado link seja prioritário para upload de algum destino específico: weight e local-pref.

Para ambos os parâmetros, quanto maior o valor, mais preferível uma rota será. Entretanto o parâmetro weight não é suportado por todos os fabricantes, sendo assim, recomendamos a utilização do local-pref para que não tenha dificuldades de adaptação caso mude de equipamento futuramente.

Um exemplo prático: Determinando que o upload para o Facebook saia pelo Link A.

Considerações sobre o cenário explicado:

  • Temos dois Links, chamados de Link A e link B;
  • Nosso prefixo IPv6 é 2001:db8::/32;
  • Os filtros de import do link A se chamam "LinkA-V6.IN";
  • Os filtros de import do link B se chamam "LinkB-V6.IN";
  • Todas as colunas que foram preenchidas nos screenshots de exemplo estão sendo exibidas no Winbox. Nenhum outro parâmetro foi alterado.

Nosso cenário antes de fazer a alteração é o seguinte:

Artigo como fazer com que um determinado conteudo saia por um link especifico.png

Um export destes filtros:

/routing filter

add action=discard chain=LinkA-V6.IN comment=\

"Descartar meu prefixo IPv6" prefix=2001:db8::/32 \

prefix-length=32-128

add action=accept chain=LinkA-V6.IN comment="Aceita Full Routing" \

prefix=2000::/3 prefix-length=3-48

add action=discard chain=LinkB-V6.IN comment=\

"Descartar meu prefixo IPv6" prefix=2001:db8::/32 \

prefix-length=32-128

add action=accept chain=LinkB-V6.IN comment="Aceita Full Routing" \

prefix=2000::/3 prefix-length=3-48

1 - Determine qual o endereço IP do Facebook através da linha de comando de seu computador (endereço descoberto em anexo):

danieldamito@SageNetworks:~$ nslookup facebook.com

Server: 127.0.0.53

Address: 127.0.0.53#53

Non-authoritative answer:

Name: facebook.com

Address: 157.240.222.35

Name: facebook.com

Address: 2a03:2880:f148:82:face:b00c:0:25de

2 - Cheque através da tabela de roteamento de seu roteador qual o prefixo maior onde este IP se encontra. Como Mikrotiks são relativamente pobres na filtragem/visualização de rotas, vamos exemplificar a checagem através de um Looking Glass. Usaremos o LG da Telia como exemplo:

Artigo como fazer com que um determinado conteudo saia por um link especifico - LG.png

3 - Em algum lugar antes de seu último filtro, adicione um novo filtro aumentando o local-pref ou weight desta rota. Como o local-pref padrão do Mikrotik tem o valor 100, iremos colocar 200 no prefixo do Facebook. Desta forma, as rotas do Facebook recebidas pelo link A terão o local-pref 200, enquanto as do link B terão o local-pref 100. Veja o passo a passo abaixo:

a) Crie um novo filtro, como o mesmo nome dos demais filtros do link A, adicionando o prefixo do Facebook e setando para que sejam filtrados quaisquer prefixos do tamanho da rede do Facebook (/32) até o menor prefixo atualmente divulgado na Internet em IPv6 (/48):

Artigo como fazer com que um determinado conteudo saia por um link especifico - filtro mk 2.png

b) Na guia actions, configure o parâmetro action com o valor accept:

Artigo como fazer com que um determinado conteudo saia por um link especifico - filtro mk 3.png

c) Na guia BGP Actions, configure o parâmetro Set BGP Local Pref com o valor 200:

Artigo como fazer com que um determinado conteudo saia por um link especifico - filtros mk 4.png

d) Mova este filtro para qualquer lugar antes do último filtro:

Artigo como fazer com que um determinado conteudo saia por um link especifico - filtros mk 5.png

Caso você tenha seguido todos estes passos, seus filtros deverão estar desta forma:

Artigo como fazer com que um determinado conteudo saia por um link especifico - filtros mk 6.png

Um export destes filtros:

/routing filter

add action=discard chain=LinkA-V6.IN comment="Descartar meu prefixo IPv6" prefix=2001:db8::/32 prefix-length=32-128

add action=accept chain=LinkA-V6.IN comment="Preferir Facebook pelo link A" prefix=2a03:2880::/32 set-bgp-local-pref=200

add action=accept chain=LinkA-V6.IN comment="Aceita Full Routing" prefix=2000::/3 prefix-length=3-48

add action=discard chain=LinkB-V6.IN comment="Descartar meu prefixo IPv6" prefix=2001:db8::/32 prefix-length=32-128

add action=accept chain=LinkB-V6.IN comment="Aceita Full Routing" prefix=2000::/3 prefix-length=3-48

Como manipular o download

Quando você não está diretamente conectado ao ASN do fornecedor do conteúdo desejado, não existe uma forma fácil de fazer com que o tráfego deste provedor venha por um link específico sem afetar todo o prefixo em questão.

Basicamente para que isto aconteça, seu prefixo precisa estar anunciado mais específico pelo link desejado ou ter um AS-PATH menor. A forma de manipular o download é através de suas rotas anunciadas (filtros de export/OUT). Como não objetivamos neste artigo dar uma explicação profunda, mas apenas introdutória sobre o assunto, iremos exemplificar cenários mais simples apenas.

Para que este artigo seja encurtado e divulgado, os passo-a-passos destes exemplos serão mais resumidos.

Manipulação usando prefixos mais específicos

Considerações sobre o cenário explicado:

  • Temos dois Links, chamados de Link A e link B;
  • Temos uma conexão direta com o Facebook (sessão bilateral) pelo IX;
  • Nosso prefixo IPv6 é 2001:db8::/32;
  • Os filtros de export do link A se chamam "LinkA-V6.OUT";
  • Os filtros de export do link B se chamam "LinkB-V6.OUT";
  • Os filtros de export do link B se chamam "Facebook-V6.OUT".
Artigo como fazer com que um determinado conteudo saia por um link especifico - Diagrama 1.jpeg.jpg

Em nosso cenário antes de fazermos as alterações, estamos anunciando nosso prefixo maior, /32, de forma igual para todos os peers BGP, através dos seguintes filtros:

Artigo como fazer com que um determinado conteudo saia por um link especifico - filtros mk 7.png

Um export destes filtros:

/routing filter

add action=accept chain=LinkA-V6.OUT comment="Anunciar meu prefixo /32" prefix=2001:db8::/32

add action=discard chain=LinkA-V6.OUT comment="Descartar o resto"

add action=accept chain=LinkB-V6.OUT comment="Anunciar meu prefixo /32" prefix=2001:db8::/32

add action=discard chain=LinkB-V6.OUT comment="Descartar o resto"

add action=accept chain=Facebook-V6.OUT comment="Anunciar meu prefixo /32" prefix=2001:db8::/32

add action=discard chain=Facebook-V6.OUT comment="Descartar o resto"

Iremos anunciar nossos dois prefixos /33 que estão contidos no prefixo /32 para o Facebook, mas manter apenas o anúncio do /32 para os demais links.

Desta forma o facebook sempre elegerá a conexão direta conosco como caminho para envio de tráfego (download em nosso sentido e upload no sentido deles), visto que o prefixo é mais específico.

Veja os filtros:

Artigo como fazer com que um determinado conteudo saia por um link especifico - filtros mk 8.png

Um export destes filtros:

/routing filter

add action=accept chain=LinkA-V6.OUT comment="Anunciar meu prefixo /32" prefix=2001:db8::/32

add action=discard chain=LinkA-V6.OUT comment="Descartar o resto"

add action=accept chain=LinkB-V6.OUT comment="Anunciar meu prefixo /32" prefix=2001:db8::/32

add action=discard chain=LinkB-V6.OUT comment="Descartar o resto"

add action=accept chain=Facebook-V6.OUT comment="Anunciar meu prefixo /32" prefix=2001:db8::/33

add action=accept chain=Facebook-V6.OUT comment="Anunciar meu prefixo /32" prefix=2001:db8:8000::/33

add action=discard chain=Facebook-V6.OUT comment="Descartar o resto"

Manipulação usando prepends

Um dos critérios de eleição de rota do BGP é o tamanho do AS-PATH. Caso haja empate no tamanho do prefixo, o algoritmo do BGP passará a analisar outros critérios. O primeiro critério que podemos influenciar em outros roteadores é o tamanho do AS-PATH, através do recurso de prepend.

Considerações sobre o cenário explicado:

  • Temos dois Links, chamados de Link A (AS1) e link B (AS2);
  • Nosso ASN é o 3;
  • O Facebook está diretamente conectado com nossos dois upstreams/fornecedores de link;
  • Nosso prefixo IPv6 é 2001:db8::/32;
  • Os filtros de export do link A se chamam "LinkA-V6.OUT";
  • Os filtros de export do link B se chamam "LinkB-V6.OUT".
Artigo como fazer com que um determinado conteudo saia por um link especifico - Diagrama 2

Em nosso cenário antes de fazermos as alterações, estamos anunciando nosso prefixo maior, /32, de forma igual para todos os peers BGP, através dos seguintes filtros:

Artigo como fazer com que um determinado conteudo saia por um link especifico - filtros mk 9.png

Um export destes filtros:

/routing filter

add action=accept chain=LinkA-V6.OUT comment="Anunciar meu prefixo /32" prefix=2001:db8::/32

add action=discard chain=LinkA-V6.OUT comment="Descartar o resto"

add action=accept chain=LinkB-V6.OUT comment="Anunciar meu prefixo /32" prefix=2001:db8::/32

add action=discard chain=LinkB-V6.OUT comment="Descartar o resto"

Com o cenário atual o Facebook tem duas rotas para nos alcançar, com os seguintes AS-PATHs:

Via link A: AS1 - AS3

Via link B: AS2 - AS3

Desta forma, critérios menos previsíveis serão usados para definir como o Facebook nos alcançará. Nosso objetivo é influenciar sua decisão fazendo com que a rota pelo link B tenho o AS-PATH mais longo, de forma que o tráfego nos seja enviado pelo link A.

Assim sendo, iremos adicionar 1 prepend no anúncio de nosso prefixo /32 para o link B e deixar sem prepends para o link A.

Artigo como fazer com que um determinado conteudo saia por um link especifico - filtros mk 10.png

Um export destes filtros:

/routing filter

add action=accept chain=LinkA-V6.OUT comment="Anunciar meu prefixo /32" prefix=2001:db8::/32

add action=discard chain=LinkA-V6.OUT comment="Descartar o resto"

add action=accept chain=LinkB-V6.OUT comment="Anunciar meu prefixo /32" prefix=2001:db8::/32 set-bgp-prepend=1

add action=discard chain=LinkB-V6.OUT comment="Descartar o resto"

Vejam que a única mudança foi a adição do valor 1 no parâmetro prepend no anúncio para o link B.

Após esta mudança, as rotas que o Facebook terá para nos alcançar são as seguintes:

Via link A: AS1 - AS3

Via link B: AS2 - AS3 - AS3

Como a rota pelo link A é a mais curta, ela será preferida em detrimento da rota pelo link B e todo o download advindo do Facebook deverá chegar pelo link A.

Artigo original por Daniel Damito.