Primeira dica útil...
Temos uma máquina X que possuí 2 interfaces de redes, uma que realiza a conexão com a internet e a outra que presta um serviço de DHCP. Como fazer com que as máquinas que estão por de trás do DHCP acessem a rede deste servidor X???
A resposta é simples... Masquerade ou NAT. O que consiste o NAT? O NAT, segundo os sábios da wikipedia, é uma técnica que reescreve os endereços IPs de origem de um pacote que passa por algum gateway (roteador ou firewall) de maneira que um computador de uma rede interna possa acessar a outra rede(que pode ser a externa ou outra subnet).
Agora a parte prática... Preste atenção neste cenário:
M1 (10.0.0.1) --> (10.0.0.2) M2 (10.0.1.3) --> M3 (10.0.1.4)
A máquina 1 tem que falar com a máquina 3, mas ela não consegue. Para isso vamos realizar os seguintes procedimentos de criaçao de uma NAT na máquina 2.
0 - Faça as coisas como macho, e use o modo root.
1 - Habilitar o IP Forward!
$ echo 1 > /proc/sys/net/ipv4/ip_forward
2 - Construir as rotas... Esta etapa é a mais importante e é a que mais precisa de atenção. Temos as 2 placas, uma é para a rede interna e a outra para "externa".
Então vamos criar uma rota para a rede interna.
$ route add -net 10.0.0.0 netmask 255.255.255.0 eth0
Com isso todos os pedidos que forem para a rede 10.0.0.0 serão tratados pela interface eth0.
Agora precisamos tratar os outros pedidos...
$ route add default gw 10.0.1.3 eth1
Com este comando, todos os pedidos que forem diferentes da rede 10.0.0.0, serão encaminhados para a interface eth1. Ou seja se você fizer um tcpdump na eth1, e em seguida mandar pingar em 10.0.1.4, será a interface que foi definida no comando a cima que realizará os trabalhos.
Agora é a receita de bolo do IPTABLES... Mas antes existem coisas que precisamos saber...
1- A interface "externa": eth1
2- A interface interna: eth0
Se você não seguir um padrão, na hora de inserir as regras do IPTABLES, as coisas certamente não darão certo, e será necessário dar um flush esperto nestas regras..
$IPTABLES -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED, RELATED -j ACCEPT
$IPTABLES -A FORWARD -i eth0 -o eth1 -j ACCEPT
$IPTABLES -A FORWARD -j LOG
$IPTABLES -t nat -A POSTROUTING -o eth1 -j MASQUERADE
OBS.: Prometo um dia estudar de forma decente o IPTABLES e explicar o que cada uma destas linhas faz e porque faz... =(
Agora para fechar o caixão... Cada máquina da rede interna, tem que saber qual é o seu gateway... Se por algum insano motivo o DHCP não informou a rota, aqui segue o comando para o cenário que eu inventei:
Para a máquina da rede interna:
$ route add -net default gw 10.0.0.2
Para a máquina da rede "externa":
$ route add -net default gw 10.0.1.3
Referência (ou completamente chupado): http://br-linux.org/news2/006411.html
Se houver alguma falha nesse how-to ou partes a serem melhores explicadas, favor deixar um comentário.
Assinar:
Postar comentários (Atom)
Alguns pontos:
ResponderExcluir1) Vale a pena fazer umas restrições pela origem com "-s".
2) Se vc tiver um ip estático, vale a pena usar o SNAT em vez do MASQUERADE. Com o SNAT você vai definir o ip "externo". Com o masquerade, as entradas da tabela NAT são apagadas caso o link caia, no SNAT as entradas são mantidas. O que faz sentido, já que quando o link voltar, ele pode ter um novo ip (caso não seja ip estático).
3) No servidor, após fazer um flush nas regras, basicamente você só precisa do
# echo 1 > /proc/sys/net/ipv4/ip_forward
# $IPTABLES -t nat -A POSTROUTING -o eth1 -j MASQUERADE
4) Muito PNC nesse 2010!
you are a GOD
ResponderExcluir