quinta-feira, 10 de março de 2011

Roteamento (FreeBSD)

Introdução

Vamos começar do início. A internet surgiu... Tá, nem tão do início assim. Vou começar explicando o conceito de REDE e INTERNET. É denominada rede de computadores a união de 2 ou mais computadores ou dispositivos ligados de forma física e lógica permitindo a troca de informações entre eles. Para exemplificar, imagine uma empresa. O gerente precisa de um de um documento que vem de outro setor que fica distante da sua sala. Se ele tiver que ir até lá para pegar pessoalmente, gastará tempo e esforço. Nessa mesma empresa, em um determinado setor muitos funcionários precisam usar a unica impressora do local. Se cada um levar um documento para o computador ligado a impressora através de um CD ou pendrive, também será gasto um tempo precioso (sem falar que seria muito chato). Com todas essas máquinas conectadas entre si em uma rede, o trabalho se torna mais prático e rápido.
Já a internet é um conjunto de diversas redes inter-conectadas através de pontos de acesso chamados de roteadores.
Roteamento
Para uma máquina ser capaz de encontrar outra através de uma rede e haver troca de informações é necessário um mecanismo que direcione os dados 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. 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).

Habilitar Encaminhamento de Pacotes 

    Para configurar o FreeBSD como roteador em uma rede pequena, basta habilita-lo como gateway, configurar uma rota default e, em alguns casos, criar uma tabela estática de roteamento.
    Em redes maiores pode ser necessário o uso de protocolos de roteamento, como o RIP, que gerenciem, de modo dinâmico, a tabela de roteamento de seu servidor.

Tabela de Roteamento

Agora iremos abordar a configuração de uma rota default e a criação de uma tabela de roteamento no FreeBSD.
Primeiramente deve-se utilizar o comando netstat, que permite visualizar a tabela de roteamento do FreeBSD.
Para visualizar a tabela de roteamento, você deverá utilizar o comando netstat associado ao parâmetro -r.
Por exemplo, ao executar o comando netstat -r, você terá algo parecido com:

# netstat -r

Routing tables

Internet:
Destination        Gateway            Flags     Refs     Use     Netif Expire
localhost              localhost            UH          0        6       lo0
default              200.132.10.2        UG          0        0      ppp0

Então, vamos começar:

1) Habilite o FreeBSD para atuar como gateway, editando o arquivo /etc/rc.conf alterando as seguintes linhas:

gateway_enable="NO"                         # Set to YES if this host will be a gateway.
paragateway_enable="YES"                # Set to YES if this host will be a gateway.

2) Após alterar salve o arquivo. Para efetivar esta alteração voce deverá dar um boot em seu servidor, deixe para fazê-lo, após configurar os demais itens.

3) Configure a rota default. para fazer isso no FreeBSD, edite o arquivo /etc/rc.conf e altere a linha:defaultrouter="NO" # Set to default gateway (or NO).
paradefaultrouter="IP_do_gateway_default" # Set to default gateway (or NO).

4) Especifique o IP ou o hostname do gateway default.

5) Após alterar, salve o arquivo. Para efetivar essa alteração será necessário efetuar um boot em seu servidor. Supondo que o default gateway possua o IP 200.132.10.2, se você utilizar o comando netstat para verificar a tabela de rotamento do FreeBSD após o boot, ela seria algo do tipo:

# netstat -r

Routing tables

Internet:
Destination        Gateway            Flags     Refs     Use     Netif Expire
localhost             localhost             UH           0        6                lo0
default               200.132.10.2       UG          0        0              ppp0
192.16.13.0        192.16.12.3        UG          0        0              ed0

Como Definir Rotas Estáticas

O comando utilizado para manipular manualmente a tabela de roteamento do FreeBSD é o comando route. Por exemplo para adicionarmos uma rota para a rede 192.16.13.0 sendo que o gateway para esta rede é o host 192.16.12.3 a sintaxe do comando seria:

# route add 192.16.13.0/24 192.16.12.3

Após a execução do comando acima a tabela de roteamento mostrada anteriormente ficaria assim:

# netstat -r

Routing tables

Internet:
Destination             Gateway            Flags      Refs     Use     Netif Expire
loca l                 lhost localhost         UH           0        6             lo0
default               200.132.10.2          UG           0        0             ppp0
192.16.13.0      192.16.12.3            UG           0        0             ed0 

Você pode definir rotas estaticas adcionando essas linhas no arquivo  /etc/rc.conf:
 
static_routes="administracao"
route_administracao="-net 192.168.1.0/24 10.10.1.1"
Existe tambem  outra forma de definir suas rotas estaticas em /etc/rc.conf. Veja:

static_routes="rh"
route_rh="-net 192.168.2.0/24 10.10.2.1"





Exemplo de configuração de rede
Em uma empresa temos dois departamentos: O administrativo e o Recursos Humanos. Cada um possui uma rede interna do departamento mas prescisam compartilhar arquivos e recursos entre essas redes. Todas as estações de trabalho estão no FreeBSD e cada uma contém apenas uma interface de rede. Como poderiamos conectar essas redes?
  • Primeiro: devemos definir a faixa de IPS de cada rede e confgigura-las separadamente. Usaremos para o ADM a faixa 192.168.1.x e para o RH 192.198.2.x;
  • Segundo: Escolha uma maquina em cada rede para ser o gatway, por questão de organização escolheremos 192.168.1.1 para gatway de ADM e 192.168.2.1 para gatwayde RH;
Em cada estação de trabalho se deve-se configura-las na rede alterando o arquivo /etc/rc.conf.
ADM:
#ee /etc/rc.conf  (Adicionar as seguintes linhas no fim do arquivo)
ifconfig_rl0="inet 192.168.1.2 netmask 255.255.255.0"
defauterouter="192.168.1.1"

//PCs RH

#ee /etc/rc.conf  (Adicionar as seguintes linhas no fim do arquivo)
ifconfig_rl0="inet 192.168.2.2 netmask 255.255.255.0"
defauterouter="192.168.2.1"

**Atenção... O FreeBSD reconhece a interface de rede pelas iniciais do fabricante. No nosso caso é uma RealTek, por isso rl0! procure mais informações de como ele pode reconhecer sua placa de rede e se for diferente é só substituir no codigo... você pode dar o comando ifconfig e ver.
**Cada maquina deve ter o ip diferente!!! altere a cada maquina o ultimo numero...!  Mas cuidado.... Os IPS termiandos em 0 (ex: 192.168.1.0) representam o endereço de rede e o s terminados em 255 (ex: 192.168.2.255) representam o endereço de loopback... esses são reservados e não podem ser associados a nenhuma maquina.

Ex para o pc 2 da rede RH
#ee /etc/rc.conf  (Adicionar as seguintes linhas no fim do arquivo)
ifconfig_rl0="inet 192.168.2.3 netmask 255.255.255.0"
defauterouter="192.168.2.1"
e assim sucessivamente até todas as maquinas tiverem um endereço IP destinto.
Configurando o Gatway usando alias
   Voce deve estar se perguntando... como posso usar um gatway com apenas uma interface de rede? O FreeBSD nos dá uma possibilidade de utilizar uma interface virtual chamada de ALIAS. Isso mesmo, com o alias temos a impressão de que temos duas interfaces de rede. Vamos então para a configuração do gatway usando o alias??
Da mesma forma deve-se alterar o arquivo /etc/rc.conf
Vamos usar o IP 10.10.1.1 Para a interface de rede  e o 192.168.1.1 para o alias
//GATWAY ADM
#ee /etc/rc.conf
gatway_enable=”YES”  (Atenção o YES deve ser sempre em MAIUSCULO)
ifconfig_rl0=”inet 10.10.1.1 netmask 255.255.255.0”
ifconfig_rl0_alias0=”inet 192.168.1.1 netmask 255.255.255.0”
//GATWAY RH

#ee /etc/rc.conf
gatway_enable=”YES”  (Atenção o YES deve ser sempre em MAIUSCULO)
ifconfig_rl0=”inet 10.10.2.1 netmask 255.255.255.0”
ifconfig_rl0_alias0=”inet 192.168.2.1 netmask 255.255.255.0”





Quando se adiciona as rotas estáticas, indica-se a rede na qual quer conectar (Rede ADM para a Rede RH adciona a rota para a rede 192.168.2.0 pois o endereço terminado em zero representa toda a rede),  a mask que aqui está representada como /24 e o IP válido do Gatway da outra rede (no caso, o IP do Gatway de RH é 10.10.2.1), pois é por ele que todas as informações da rede passarão. Então agora abaixo adicionaremos as rotas estáticas no arquivo /etc/rc.conf:

static_routes="administracao"
route_administracao="-net 192.168.1.0/24 10.10.1.1"
 
static_routes="rh"
route_administracao="-net 192.168.2.0/24 10.10.2.1" 

/*Espero ter ajudado*/




Programa


Aqui tem o código fonte de um programa que irá configurar automaticamente o IP, Gateway, Rota Default, listar e adcionar rotas estáticas e Habilitação de roteamento .
#include<stdio.h>
#include<stdlib.h>
main()
{
     char ip[20],ipd[20],mask[20],mask1[20],var[50],gt[20],gt1[20],var1[50],var2[50];
     int op;

     while (op!=6)
     {      /*Aqui você coloca as opções de configuração que o usuario porerá escolher*/
     printf("\nDigite a opção que desejas:\n");
     printf("\n1.Configurar a interface de Rede\n");
     printf("\n2.Configurar a Rota Padrao\n");
     printf("\n3.Listar a Tabela de rotas\n");
     printf("\n4.Habilitar roteamento\n");
     printf("\n5.Adicionar rota estática\n");
     printf("\n6.Sair\n");
     scanf("%d",&op);
     switch (op)
     {
     case 1:
          printf("\n Configurar a interface de Rede \n");
          printf("Digite o IP:");
          scanf("%s",&ip); //Salva o IP digitado na variável ip
          printf("Digite a Mascara:");
          scanf("%s",&mask);/*Salva a MASK digitado na variável mask*/
          sprintf(var,"ifconfig rl0 %s netmask %s", ip, mask);
/*Aqui adicona toda a sintaxe do comando ifconfig dentro da variavel var, já inserindo os dados informados pelo usúario*/
          system(var);
/*O system serve para executar no console o valor da variavel, que no caso já é o comando completo de configuração da interface de rede*/
     break;
     case 2:
          printf("\nConfigurar a Rota Padrao\n");
          printf("Digite o Gateway:");
          scanf("%s",&gt);/*Salva o GATWAY digitado na variável gt*/
          sprintf(var1,"route add default %s",gt);
/*Aqui adicona toda a sintaxe do comando route add dentro da variavel var, já inserindo o dado informados pelo usúario*/
          system(var1);
/*O system serve para executar no console o valor da variavel, que no caso já é o comando completo de configuração de rota padrão */
     break;
     case 3:
          printf("\nLista de Rotas\n");
          system("netstat -rn");
/*O netstat -rn não precisa de mais nenhum parâmetro, por isso que system irá executar no console diretamente, e assim listar as rotas */

     break;
     case 4:
         printf("\nHabilitar Roteamento\n");
          system("sysctl net.inet.ip.forwarding=1");
/*Assim como o netstat -rn, o sysctl não precisa de mais nenhum parâmetro, por isso que system irá executar no console diretamente, e assim habilitar o reteamento */
     break;
     case 5:
          printf("\nAdicionar rota estática\n");
          printf("Digite o IP da rota:");
          scanf("%s",&ipd);/*Salva o IP da rota estática digitado na variável gt1*/
          printf("Digite a mascara:");
          scanf("%s",&mask1);/*Salva a MASK digitada na variável mask1*/
          printf("Digite o gateway:");
          scanf("%s",&gt1);/*Salva o GATWAY digitado na variável gt!*/
          sprintf(var2,"route add %s %s %s",ipd,gt1,mask1);
/*Aqui adicona toda a sintaxe do comando route add dentro da variavel var2, já inserindo os dados informados pelo usúario*/
          system(var2);
/*O system serve para executar no console o valor da variavel, que no caso já é o comando completo de adicionar rota estárica*/
     break;
    
     case 6:
     break;   
     default:
     printf("opcao invalida\n");
     break;
     }
     }

}
Para utilizá-lo você deve copia-lo em algum editor de texto no FreBSD (recomendamos o ee), salvar com a extenção .c e digitar os seguintes comandos para complilar seu código-fonte:

#ee 
#gcc -o <nome_do_codigo-fonte><nome_do_programa>
#./<nome_do_programa>


ex: você salvou o código com o nome programa.c e vai compliar em um programa chamado configuracao_redes


#gcc-o programa.c configuracao_redes
#./configuracao_redes


Bibliografia:
http://www.primeirospassos.org/sessao8_8.html
http://doc.fug.com.br/handbook/network-routing.html
http://interred.cefetce.br/cdd/
http://pt.wikipedia.org/wiki/Rede_de_computadores