19.2. Gateways e Rotas

Contribuição de Coranth Gryphon.

Para uma máquina ser capaz de encontrar outra através de uma rede, é necessário um mecanismo que descreva como ir de uma para a outra. Isto é chamado roteamento. Uma ``rota'' é um par definido de endereços: um ``destino'' e um ``gateway''. O par indica que se você estiver tentando alcançar este destino, deve se comunicar através deste gateway. Existem três tipos de destinos: máquinas individuais, subredes e ``padrão'' . A ``rota padrão'' é usada se nenhuma das outras rotas for aplicável. Vamos falar um pouco mais sobre rotas padrão mais tarde. Também existem três tipos de gateways: máquinas individuais, interfaces (também chamadas de ``enlaces'') e endereços físicos de hardware Ethernet (endereços MAC).

19.2.1. Um Exemplo

Para ilustrar diferentes aspectos do roteamento, vamos usar o seguinte exemplo do netstat:

% netstat -r
Routing tables

Destination      Gateway        Flags     Refs     Use     Netif Expire

default      outside-gw     UGSc       37      418      ppp0
localhost    localhost      UH      0      181       lo0
test0        0:e0:b5:36:cf:4f   UHLW    5    63288       ed0     77
10.20.30.255     link#1         UHLW    1     2421
exemplo.com      link#1         UC      0    0
host1        0:e0:a8:37:8:1e    UHLW    3     4601       lo0
host2        0:e0:a8:37:8:1e    UHLW    0    5   lo0 =>
host2.exemplo.com link#1        UC      0    0
224      link#1         UC      0    0

As duas primeiras linhas especificam a rota padrão (a qual será abordada na próxima seção) e a rota para localhost (a própria máquina).

A interface (coluna Netif ) que esta tabela de roteamento usa para especificar o localhost é lo0, também conhecido como o dispositivo de loopback. Isto quer dizer para manter interno todo o tráfego para este destino, ao invés de enviá-lo para fora pela rede local, uma vez que simplesmente deverá retornar ao local de origem.

As próximas coisas que chamam a atenção são os endereços começando com 0:e0:. Estes são endereços de hardware Ethernet, também conhecidos como endereços MAC. O FreeBSD irá identificar automaticamente quaisquer máquinas (no exemplo test0) na Ethernet local e adicionar uma rota direta para aquela máquina pela interface Ethernet, ed0. Há, também, um tempo de expiração (timeout) associado a este tipo de rota, que é usado em caso de não se receber mais transmissões da máquina dentro de um prazo específico de tempo. Quando isto acontece, a rota para esta máquina será automaticamente removida. Estas máquinas são identificadas usando um mecanismo conhecido como RIP (Protocolo de Informação de Roteamento - Routing Information Protocol), que calcula rotas para as máquinas locais baseado na determinação do menor caminho.

O FreeBSD também adicionará rotas de subrede para a subrede local (10.20.30.255 é o endereço de difusão (broadcast) para a subrede 10.20.30, e exemplo.com é o nome de domínio associado àquela subrede). A designação link#1 refere-se à primeira placa Ethernet na máquina. Você irá notar que nenhuma interface adicional é especificada para aquelas.

Ambos os grupos (máquinas de rede local e subredes locais) têm suas rotas configuradas automaticamente por um daemon chamado routed. Se ele não estiver sendo executado, então somente existirão rotas definidas estaticamente (p.ex. configuradas explicitamente).

A linha host1 refere-se à nossa máquina, conhecida pelo endereço Ethernet. Uma vez que somos a máquina transmissora, o FreeBSD sabe fazer uso da interface loopback (lo0) ao invés de transmitir pela interface Ethernet afora.

As duas linhas host2 são um exemplo do que acontece quando usamos um apelido ifconfig(8) (veja a seção sobre Ethernet por razões pelas quais faríamos isso). O símbolo => após a interface lo0 diz que não somente estamos usando a loopback (uma vez que este endereço também se refere à maquina local), mas especificamente que é um apelido. Tais rotas somente surgem nas máquinas que suportam o apelido; todas as outras máquinas na rede local simplesmente terão uma linha link#1 para tais rotas.

A última linha (subrede de destino 224) trata do uso de multicast, que será abordado em outra seção.

Finalmente, diversos atributos das rotas podem ser vistos na coluna Flags. Abaixo está uma breve tabela contendo algumas destas flags e seus significados:

U Up: A rota é ativa.
H Host: O destino da rota é uma única máquina.
G Gateway: Envie qualquer coisa para este destino por este sistema remoto, que o mesmo irá calcular a partir de lá para onde enviá-la. it.
S Static: Esta rota foi configurada manualmente, e não gerada automaticamente pelo sistema.
C Clone: Gera uma nova rota baseada nesta rota para máquinas a quem nos conectarmos. Este tipo de rota é normalmente usada em redes locais.
W WasCloned: Indica uma rota que foi autoconfigurada baseada em uma rota (Clone) da rede local.
L Link: Rota envolve referências ao hardware Ethernet.

19.2.2. Rotas Padrão

Quando um sistema local precisa fazer uma conexão a um sistema remoto, ele verifica a tabela de roteamento para determinar se existe um caminho conhecido. Se o sistema remoto estiver em uma das subredes que já sabemos como alcançar (rotas Clonadas), então o sistema verifica se pode se conectar por aquela interface.

Se falharem todos os caminhos conhecidos, o sistema tem uma última opção: a rota ``padrão''. Esta rota é um tipo especial rota de saída, ou gateway (normalmente a única presente no sistema), e é sempre indicada por um c no campo flags. Para sistemas em uma rede local, este gateway é configurado para qualquer máquina que tenha uma conexão direta para o mundo exterior (seja via enlace PPP, DSL, modem a cabo, T1 ou outra interface de rede).

Se você estiver configurando a rota padrão em uma máquina que esteja funcionando como o gateway para o mundo exterior, então a rota padrão será a máquina gateway localizada no seu Provedor de Serviços Internet (PSI).

Vamos dar uma olhada em um exemplo de rotas padrão. Esta é uma configuração comum:

[Local2]  <--ether-->  [Local1]  <--PPP--> [ISP-Serv]  <--ether-->  [T1-GW]
      

Os sistemas Local1 e Local2 estão em seu sítio local. Local1 está conectado a um PSI por uma conexão PPP discada. Este servidor PPP está conectado por uma rede local a outro computador gateway através de uma interface externa ao canal Internet do PSI.

As rotas padrão para cada uma das suas máquinas serão:

Sistema Gateway Padrão Interface
Local2 Local1 Ethernet
Local1 T1-GW PPP

Uma pergunta comum é ``Por que (ou como) nós configuramos o T1-GW para ser o gateway padrão para Local1, ao invés do servidor do PSI ao qual está conectado?''.

Lembre-se, uma vez que a interface PPP está usando um endereço da rede local do PSI para o seu lado da conexão, rotas para qualquer outra máquina na rede local do PSI serão criadas automaticamente. Assim, uma vez que você já sabe como alcançar a máquina T1-GW, então não há necessidade do passo intermediário de enviar tráfego para o servidor do PSI.

Como observação final, é comum usar o endereço X.X.X.1 como o endereço do gateway para sua rede local. Então (usando o mesmo exemplo), se o seu espaço de endereçamento classe-C era 10.20.30 e seu PSI estava usando 10.9.9 então as rotas padrão seriam:

Sistema Rota Padrão
Local2 (10.20.30.2) Local1 (10.20.30.1)
Local1 (10.20.30.1, 10.9.9.30) T1-GW (10.9.9.1)

19.2.3. Sistemas Duplamente Conectados

Existe um outro tipo de configuração que devemos abordar, que se trata de um sistema pertencente a duas redes diferentes. Tecnicamente, qualquer máquina funcionando como um gateway (no exemplo acima, usando uma conexão PPP) conta como um sistema duplamente conectado. Mas, na verdade, o termo somente é usado para se referir a uma máquina conectada a duas redes locais diferentes.

Em um caso, a máquina tem duas placas Ethernet, cada uma possuindo um endereço em subredes separadas. Alternativamente, a máquina pode ter somente uma placa Ethernet e estar usando um apelido ifconfig(8). O primeiro caso é usado se duas redes Ethernet fisicamente separadas estão em uso, e o segundo se há somente um segmento físico Ethernet, mas duas subredes separadas logicamente.

De um jeito ou de outro, as tabelas de roteamento são configuradas de forma que cada subrede saiba que esta máquina é o gateway definido (rota de entrada) para a outra subrede. Esta configuração, com a máquina atuando como um roteador entre duas subredes, é muitas vezes usado quando precisamos implementar filtragem de pacotes ou um firewall de segurança em cada uma ou em ambas as direções.

Se você deseja que esta máquina, na prática, passe adiante pacotes entre as duas interfaces, você precisa dizer ao FreeBSD para permitir esta capacidade.

19.2.4. Construindo um Roteador

Um roteador de rede é simplesmente um sistema que repassa pacotes de uma interface para outra. Padrões da Internet e boas práticas de engenharia impedem o Projeto FreeBSD de permitir isto por padrão no FreeBSD. Você pode permitir esta característica alterando a seguinte variável para YES no rc.conf(5):

gateway_enable=YES   # Set to YES if this host will be a gateway

Esta opção irá ajustar a variável do sysctl(8) chamada net.inet.ip.forwarding para 1. Se você precisar parar o roteamento temporariamente, você pode reajustá-la para 0.

Seu novo roteador precisará de rotas para saber aonde enviar o tráfego. Se sua rede for simples o suficiente você pode usar rotas estáticas. O FreeBSD também vem com o daemon de roteamento padrão do BSD routed(8), o qual fala RIP (ambas as versões 1 e 2) e IRDP. O suporte para BGP v4, OSPF v2 e outros protocolos de roteamento sofisticados estão disponíveis com o pacote net/zebra. Produtos comerciais, como o gated, também estão disponíveis para soluções mais complexas de roteamento.

Mesmo quando o FreeBSD é configurado desta forma, ele ainda não cumpre completamente com os requisitos padrões da Internet para roteadores. Mas chega bem perto para uso normal, entretanto.

19.2.5. Propagação do Roteamento

Nós já falamos sobre como definimos nossas rotas para o mundo exterior, mas não sobre como o mundo exterior nos encontra.

Já sabemos como as tabelas de roteamento podem ser configuradas de forma que todo o tráfego para um espaço de endereçamento em particular (nos nossos exemplos, uma subrede classe-C) pode ser enviado a um determinado sistema naquela rede, o qual irá repassar os pacotes para dentro.

Quando você obtiver a designação de um espaço de endereçamento para seu sítio, seu provedor de serviços irá configurar suas tabelas de roteamento de forma que todo o tráfego para sua subrede será enviado através do seu enlace PPP ao seu sítio. Mas como os sítios através do país saberão enviar ao seu PSI?

Há um sistema (muito parecido com a informação DNS distribuída) que mantém registros de todos os espaços de endereçamento designados, e que define seu ponto de conexão à Espinha Dorsal Internet. A ``Espinha Dorsal'' são os principais canais que carregam o tráfego da Internet através do país e ao redor do mundo. Cada máquina de espinha dorsal tem uma cópia de um conjunto mestre de tabelas, as quais direcionam tráfego a uma determinada rede e a um provedor de espinha dorsal específico e, de lá, abaixo na cadeia de provedores de serviços até atingir a sua rede.

É a tarefa do seu provedor de serviços anunciar para os sítios da espinha dorsal que eles são o ponto de conexão (e, assim, o caminho de entrada) para seu sítio. Isto é conhecido como propagação de rotas.

19.2.6. Resolução de Problemas

Às vezes, há um problema com propagação de rotas, e alguns sítios ficam incapazes de se conectar a você. Talvez o comando mais útil para tentar descobrir onde o roteamento está em pane é o traceroute(8). Ele é igualmente útil se você não parece conseguir realizar uma conexão a uma máquina remota (p.ex. o ping(8) falhou).

O comando traceroute(8) é executado com o nome do sistema remoto que você está tentando se conectar. Ele vai mostrar os sistemas gateway ao longo do caminho da tentativa, eventualmente alcançando o sistema-alvo, ou terminando por falta de conectividade.

Para maiores informações, veja a página do manual do traceroute(8).

19.2.7. Roteamento Multicast

O FreeBSD suporta aplicações multicast e roteamento multicast de forma nativa. Aplicações multicast não requerem qualquer configuração especial no FreeBSD; aplicações geralmente irão funcionar sem necessidade de ajustes. O roteamento multicast requer que o suporte seja compilado no núcleo, ou kernel:

options MROUTING

Além disso, o daemon de roteamento multicast mrouted(8) precisa ser configurado para ativar túneis e DVMRP através do /etc/mrouted.conf. Mais detalhes sobre as configurações multicast podem ser encontradas nas páginas de manual do mrouted.

Este, e outros documentos, podem ser obtidos em ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Para perguntas sobre FreeBSD, leia a documentação antes de contatar <questions@FreeBSD.org>.
Para perguntas sobre esta documentação, envie e-mail para <doc@FreeBSD.org>.