Usando IPTABLES para configurar o Linux como um Roteador

February 1st, 2004

Category: Administracao e Suporte

Tagged with: , ,

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

No comments yet


Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>