Execute para saber meu email:
perl -e "\$_=qq#bfhemJye\\x7Fdoxn\\x24ieg\\x24hx\\x07\\x00#;s/./chr(ord$&^10)/ge;print"
Menu
Principal
Artigos Geeks
JN - Jornal Nerd
Web Links
Arquivo
Usando IPTABLES para configurar o Linux como um Roteador PDF Imprimir E-mail
Escrito por hlbog   
Dom, 01 de Fevereiro de 2004 06:39

A situação é comum: você tem uma conexão banda larga em casa ou escritório e gostaria de que mais de um computador pudesse accessar a Internet.

Entretanto, o seu provedor (Cable ou ADSL) limita o acesso a apenas 1 MAC address registrado.

As soluções mais comuns são:

  1. Comprar um roteador simples;

  2. Usar o Windows e ?compartilhar? a conexão de rede (ecle! :P);

  3. Colocar uma segunda placa de rede em um computador e configurá-lo como um roteador.

A compra de um equipamento de roteamento tem as vantagens de sua instalação ser simples e você não precisar deixar um computador ligado o tempo inteiro. As desvantagens são o custo e a falta de flexibilidade para configurar outras coisas, como traffic shapping.

Usar o compartilhamento do Windows não é uma boa idéia. Imagine o overhead que deve haver na rede! Essa análise valeria um outro artigo... :)

Este documento trata da implementação da última alternativa. A figura mostra a sua situação inicial.


            Internet
|
|
------------
| Cable/ DSL |
| Modem |
------------
|
| Ethernet Card eth0 - IP Público
-----/------
| Computer |
| A |
------------

Ethernet Card eth0 - Não Configurada
-----/------
| Computer |
| B | O Sem Internet :,(
------------ `-|-
/

O computador A conecta-se ao provedor e recebe, através de DHCP, um IP público. O provedor cadastrou o MAC address dessa placa de rede e só aceita solicitações de IP desta placa, portanto não funciona você simplesmente ligar um hub ou switch no Modem. Os outros computadores nunca receberiam um IP do provedor.

O que vamos fazer primeiramente é instalar uma segunda placa de rede no computador A e configurar uma rede interna entre esses dois computadores.

            Internet
|
|
------------
| Cable/DSL |
| Modem |
------------
|
| Ethernet Card eth0 - IP Público
-----/------
| Computer |
| A |
-----/------
| Ethernet Card eth1 - IP 192.168.0.1
|
| Rede Interna 192.168.0.0/24
|
| Ethernet Card eth0 - IP 192.168.0.2
-----/------ Default Gateway 192.168.0.1
| Computer |
| B |
------------

As redes 192.168.0.0/16, 172.16.0.0/12 e 10.0.0.0/8 são faixas de IP reservados para rede privativas. Para maiores detalhes consulte o RFC1918.


A ligação entre os dois computadores pode ser através de um cabo cross, ou com a utilização de um hub ou switch.

Para configurar os endereços IP nas interfaces você pode utilizar o comando ifconfig, ou algum utilitário de configuração como o linuxconf.

Na estação A:

[root@malkovich root]# ifconfig eth1 192.168.0.1 netmask 255.255.255.0 broadcast 192.168.0.255

Na estação B:

[root@localhost root]# ifconfig eth0 192.168.0.2 netmask 255.255.255.0 broadcast 192.168.0.255

O default gateway do computador B deve ser o computador A. Para isso use o comando route ou ainda o linuxconf.

[hlbog@malkovich hlbog]# route add default gw 192.168.0.1


Verifique, no computador A, o arquivo /etc/resolv.conf. Este arquivo contém o servidor DNS fornecido pelo provedor. Configure no computador B este arquivo com as mesmas linhas.

[hlbog@malkovich hlbog]# cat /etc/resolv.conf
nameserver 200.xxx.xxx.xxx
nameserver 200.xxx.xxx.xxx
search dominio.com.br local

Teste a conexão entre as duas estações. Do computador A faça um ping para o outro.

[hlbog@malkovich hlbog]# ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=1 ttl=127 time=2.03 ms
64 bytes from 192.168.0.2: icmp_seq=2 ttl=127 time=2.07 ms
64 bytes from 192.168.0.2: icmp_seq=3 ttl=127 time=2.06 ms

-- 192.168.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2017ms
rtt min/avg/max/mdev = 2.035/2.056/2.073/0.040 ms

E do computador B para o IP 192.168.0.1

[hlbog@localhost hlbog]# ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=127 time=2.04 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=127 time=2.00 ms

--- 192.168.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1006ms
rtt min/avg/max/mdev = 2.005/2.026/2.048/0.049 ms

Caso você não obtenha resposta, verifique se você não está filtrando o computador B na configuração do iptables do computador A.
Execute o comando abaixo como root, em A, para aceitar pacotes ICMP (ping) vindos de B (192.168.0.2).

[root@malkovich root]# iptables -A INPUT -p icmp -s 192.168.0.2 -j ACCEPT

E teste o ping novamente.

A configuração das interfaces de rede pode ser feita de forma permanente alterando-se os arquivos adequados a sua distribuição. No Slackware (BSD-like convention) altere o arquivo /etc/rc.d/rc.inet1.conf, no Mandrake e semelhantes (System V convention), os arquivos para cada interface estão em /etc/sysconfig/network-scripts/ e seus nomes iniciam com o prefixo ifcfg- seguido do nome da interface, por exemplo, ifcfg-eth0. Segue abaixo uma listagem do arquivo /etc/sysconfig/network-scripts/ifcfg-eth0, para o computador B.
Caso você tenha usado o linuxconf para configurar as interfaces, esse procedimento não é necessário, pois as alterações permanecerão após o boot.

DEVICE="eth0"
BOOTPROTO="static"
IPADDR="192.168.0.2"
NETMASK="255.255.255.0"
GATEWAY="192.168.0.1"
ONBOOT="yes"

Estando a rede interna funcional, vamos partir para a configuração do computador A como um roteador. O primeiro ponto é habilitar esta funcionalidade no Linux. Isto pode ser feito alterando-se manualmente o conteúdo do arquivo /proc/sys/net/ipv4/ip_forward.

[root@malkovich root]# echo 1 > /proc/sys/net/ipv4/ip_forward


O seu conteúdo default é 0 (zero).

Entretanto, desta forma, esta configuração não fica permanente. No próximo boot da máquina ela será perdida.
Para torná-la permanente, configure o arquivo /etc/sysctl.conf, alterando o
seguinte trecho (para Slackware veja instruções seguintes):

# Controls IP packet forwarding
net.ipv4.ip_forward = 0

Substitua 0 por 1 e salve o arquivo.

# Controls IP packet forwarding
net.ipv4.ip_forward = 1


No Slackware basta você tornar executável o script /etc/rc.d/rc.ip_forward:

[root@malkovich root]# chmod 755 /etc/rc.d/rc.ip_forward

O próximo passo é configurar a chain FORWARD do netfilter no computador A, para que aceite rotear pacotes de/para o computador B.

[root@malkovich root]# iptables -A FORWARD -s 192.168.0.2 -j ACCEPT
[root@malkovich root]# iptables -A FORWARD -d 192.168.0.2 -j ACCEPT
[root@malkovich root]# iptables -P FORWARD DROP


O último comando coloca a política default proibindo forward de qualquer outra fonte que não case com alguma das regras criadas.

Finalmente, devemos fazer o MASQUERADE. Isso vai criar um mapeamento em que todas as conexões vindas de B com destino a Internet (forwarding) sairão com o endereço IP configurado na interface eth0 do computador A. É uma forma de NAT, só que mais indicada quando se está trabalhando com IP dinâmico na interface de saída.

[root@malkovich root]# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

A interface eth0, neste exemplo, é a interface de saída do computador (roteador) ligado ao provedor. No seu caso o nome dessa interface pode ser outro. O ADSL, por exemplo, cria uma interface ppp0 para conexão com a Internet.

Teste a conectividade da estação B com a Internet.

[hlbog@localhost hlbog]# ping www.linuxit.com.br

Caso esteja tendo problemas verifique novamente as configurações apresentadas e preste especial atenção se a configuração do iptables das estações não está proibindo a comunicação entre elas.

Você pode gerar um log da regra de FORWARD, na estação A, para acompanhar o que está acontecendo.

[root@malkovich root]# iptables -I FORWARD 1 -j LOG --log-level 5 --log-prefix 'FW > '
[root@malkovich root]# tail -f /var/log/messages

Se o roteamento está sendo feito mas não há resposta do site, verifique também a resolução de nomes em B.

[root@localhost root]# host www.linuxit.com.br
Host www.linuxit.com.br not found: 2(SERVFAIL)

Caso receba o erro acima, corrija o arquivo /etc/resolv.conf.

Tudo funcionando? Salve a configuração do iptables. Você pode usar o comando:

[root@malkovich root]# iptables-save > /etc/sysconfig/iptables

Normalmente, o iptables restaura as configurações após um boot através deste arquivo.

Pronto, seu computador está atuando como um router para a rede interna. Esta rede pode ser expandida facilmente colocando-se um hub, e configurando as outras estações apropriadamente, de acordo com as instruções aqui apresentadas.

Não esqueça também de configurar cuidadosamente filtros de pacotes no roteador e nas outras estações, através do iptables, para implementar alguma segurança na sua rede.

Qualquer sugestão, melhoria ou correção pode ser enviada ao meu email.
A versão em PDF deste artigo pode ser encontrada na seção de downloads do SouNerd.com.

Abraços,

-- hlbog

Última atualizacao: Sáb, 25 de Setembro de 2004 10:38
 
 
Template by SEO-Templates