Sunday, March 7, 2010

Roteador em GNU/Linux com apenas uma interface de rede.

Roteador em GNU/Linux com apenas uma interface de rede.

Olá, pessoal.

Já faz um bom tempo que eu não posto nada devido ao tempo que tenho ocupado com outras atividades. No entanto, esta semana ajudei um amigo a resolver um problema que achei que deveria postar. Na verdade é um problema que já resolvi de outras formas diferentes, mas agora resolvi de um jeito bem simples.

O problema era o seguinte: uma máquina que deveria ser o roteador entre a rede interna e a rede externa e possuía apenas uma interface de rede. Não faz muito sentido fazer isso, mas funciona bem quando se quer filtrar o tráfego em uma única máquina, por exemplo.

Inicialmente a visão física da rede era a seguinte:
Antes da configuração


Depois da configuração



Apesar de não fazer qualquer alteração física na rede, a visão lógica da rede fica da seguinte forma depois da configuração:




O conteúdo deste post está baseado na distribuição GNU/Linux Ubuntu Server 9.10 (Karmic Koala) no roteador, rede interna 192.168.0.0/24 e rede externa 192.168.15.0/24. Suponha que a interface eth0 já possui um endereço da rede externa, 192.168.15.243, por exemplo. Tanto faz o sistema operacional das máquinas da rede interna desde que você saiba configurá-los na rede.

Vamos à solução?

Passo 1: Criar a interface virtual de rede.
Na máquina que queremos como roteador, supondo que a interface física e única de rede esteja mapeada em eth0, vamos criar a interface virtual eth0:1.
Neste caso teremos uma mesma interface de rede, com um único endereço físico, respondendo por dois endereços de rede diferentes. Vou mostrar um método temporário e um método permanente. No método temporário as configurações serão apagadas quando o computador for desligado. Já no método permanente as configurações vão permanecer mesmo que o computador seja desligado.

Método temporário

$ sudo ifconfig eth0:1 192.168.0.1 netmask 255.255.255.0 up

Método permanente
Abra, edite e salve o arquivo /etc/network/interfaces
Após a última linha do arquivo, adicione as linhas abaixo:

#Interface virtual de rede
auto eth0:1
iface eth0:1 inet static
address 192.168.0.1
netmask 255.255.255.0


Reinicie as configurações de rede

$ sudo /etc/init.d/networking restart


Passo 2: Ativar o roteamento e a tradução de endereços.
A ativação do roteamento é sempre temporária a menos que o kernel seja recompilado. Por isso, no final do post há um script completo que pode ser colocado na inicialização do sistema para que o roteamento seja sempre ativado.

Ativando roteamento

$ sudo bash -c 'echo "1" > /proc/sys/net/ipv4/ip_forward'


Ativando tradução de endereços da rede interna para rede externa.

$ sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE


Passo 3: Criar um script para ser executado na inicialização do sistema.
Este script foi criado pensando em uma interface virtual temporária. Caso você opte por uma interface virtual permanente, basta excluir a parte que cria a interface virtual do script.

#Início
#Criando e configurando a interface virtual de rede
ifconfig eth0:1 192.168.0.1 netmask 255.255.255.0 up


#Ativando roteamento

echo "1" > /proc/sys/net/ipv4/ip_forward


#Ativando tradução de endereços
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE


#Fim


Supondo que você salve o script no arquivo /home/user/script/configRoteador.sh
Para que esse script seja executado em toda inicialização do sistema basta colocar uma chamada no arquivo /etc/rc.local antes do comando exit 0.

sh /home/user/script/configRoteador.sh

exit 0

Agora, basta configurar o gateway dos computadores da rede interna para o novo roteador 192.168.0.1
Com o esquema desse post você pode ter em uma única máquina, com uma única interface de rede, vários serviços sendo executados como firewall, filtro de pacotes, compartilhamento de arquivos, etc.

Espero que o conteúdo do post seja útil para mais alguém.

[]s