Quando o assunto é firewall logo se pensa em usar um Linux com iptables. O que não falta são tutoriais pela Internet que ensinam como instalar e configurar um firewall no Linux usando o iptables. Infelizmente muita gente se confunde quando o assunto é a chain PREROUTING e POSTROUTING da tabelna NAT do Netfilter.
A proposta deste post é justamente explicar o que acontece com o pacote quando passa por uma dessas chains.
PREROUTING
Logo que o pacote chega ele é modificado, isso acontece antes do roteamento do pacote. É usado em regras de DNAT e Redirecionamento de porta.
Vamos analisar o cenário abaixo, onde estamos fazendo um DNAT, ou seja, toda requisição feita para o IP 200.164.30.20 na porta 80 será repassado para o IP da rede interna 192.168.2.100.
A requisição vem da Internet com destino 200.164.30.20:80.
No nosso firewall a porta 80 esta desabilitada, neste caso o pacote seria “dropado”, mas como temos essa regra de IPTABLES:
iptables -t nat -A PREROUTING -d 200.164.30.20 -p tcp --dport 80 -j DNAT --to 192.168.2.100
Neste caso todo pacote com destino 200.164.30.20:80 será repassado para 192.168.2.100:80, porém isso acontece antes de qualquer roteamento. Veja a figura abaixo que mostra o que acontece logo que o pacote chega no firewall:
Como o nosso firewall conhece a rede 192.168.2.0/24 o pacote será repassado para o IP 192.168.2.100 na porta 80. Note que o roteamento foi o último procedimento realizado. Neste caso não seria lógico realizar o roteamento primeiro já que o DST possui o mesmo IP do firewall (200.164.30.20).
POSTROUTING
Os pacotes precisam ser modificados após o roteamento. É usado em regras de SNAT e IP MASQUERADING.
Neste post vou usar o MASQUERADING para explicar como funciona o POSTROUTING.
Segue abaixo a descrição tirada do FOCALINUX do que seria o MASQUERADING:
“O IP Masquerading é um tipo especial de SNAT usado para conectar a sua rede interna a internet quando você recebe um IP dinâmico de seu provedor”.
Veja o cenário abaixo:
A máquina 192.168.2.100 pretende acessar a INTERNET, mas para isso é preciso ter uma regra de MASQUERADING no Firewall, onde o mesmo mascara todo acesso da máquina de origem para que saia para a Internet com o IP do próprio Firewall. A regra do iptables seria assim:
iptables -t nat -A POSTROUTING -s 192.168.2.100 -o eth0 -j MASQUERADE
A requisição vem de uma máquina interna da rede (192.168.2.100) com destino (dst) www.google.com.
Veja a figura abaixo que mostra o que acontece logo que o pacote chega no firewall:
Quando o pacote chegar no Firewall vai ser repassado para o Gateway padrão do Firewall que esta configurado na placa de rede com saída para a Internet. No segundo momento, logo depois do roteamento, o pacote bate na chain POSTROUTING da nossa regra de iptables e o mesmo é modificado para que possa navegar na Internet com um IP válido, no nosso caso o IP do Firewall (200.164.30.20).
É fundamental entender o fluxo do pacote quando o mesmo passa pelo Netfilter, Postrouting e Prerouting são chains que poucos entendem. Espero que com este post as dúvidas possam ter sido esclarecidas sobre o assunto.
É fundamental entender o fluxo do pacote quando o mesmo passa pelo Netfilter, Postrouting e Prerouting são chains que poucos entendem. Espero que com este post as dúvidas possam ter sido esclarecidas sobre o assunto.
Excelente explicação. Muito obrigado.
ResponderExcluirparabéns, ótimo post.
ResponderExcluirAté que enfim entendi essas chains...Ja tinha lido sobre isso mas nunca entendia! Muito obrigada!
ResponderExcluirOpa!
ResponderExcluirLegal o Post! Bom entender bem os processos do IPtables.
Agora, o Iptables também consegue redirecionar a saída de uma conexão, por um determinado link, apontando para outra porta externa?
Ex:
Máquina 192.168.0.100 envia para link.teste.com.br:5000, deve passar pelo link1 (eth1), redirecionando para link.teste.com.br:5111.
Máquina 192.168.0.100 envia para link.teste.com.br:6000, deve passar pelo link2 (eth2), redirecionando para link.teste.com.br:6111.
Obs1: "link.teste.com.br" é um endereço externo
Vlw!
Fala Diego, valeu pela visita. Se eu entendi seu comentário, então isso é possível sim utilizando SNAT, para mais informações acesse esse link http://tinyurl.com/9grl97c
ExcluirOlá.
ResponderExcluirGostei da explicação.
Vc poderia explicar pra que serve cada opção(-t ,-a...) ?
vlw
A opção -t serve para que você diga qual tabela quer trabalhar, como usamos o POSTROUTING e PREROUTING então a tabela seria a NAT. O -A é usado para adicionar uma nova regra. Qualquer dúvida acesse o manual pelo linux: man iptables.
ExcluirOlá!
ResponderExcluirmuito bom o post, deu pra entender melhor.
aproveitando o tema, você teria algum post ou indicaria algum sobre o OpenSwan?
estou tomando um coro para conseguir levantar o tunel. D:
Desde já, obrigado!
Osvaldo estou com um duvida! Usei pre e pos rousting em dois servidores as portas estão liberadas, porém a regra que utilizei é que o usuário deve acessar a vpn de um cliente aqui no RJ acessando o nosso servidor pelo servidor de SP, a duvida é crio uma rota para acessar o servidor do RJ ou o script prerouting e postrouting que estão no servidor de SP é o suficiente.
ResponderExcluirGrato!
Tá um pouco confuso o que você postou, mas vou tentar responder quanlquer coisa posta de novo.
ExcluirEm relação a utilização de roteamento você pode resolver usando o ping entre os 2 roteadores, se ambos estão na Internete provavelmente não haverá problema. Em relação a VPN se o usuário for fechar essa conexão de dentro da rede de vocês a única coisa que será preciso é liberar a porta de saída para se conectar na VPN do Rio.
Amigo parabéns muito bem explicado.
ResponderExcluirTudo esta no kernel antes ou depois dele. Dai as regras muito bom parabens.
ResponderExcluirTudo esta no kernel antes ou depois dele. Dai as regras muito bom parabens.
ResponderExcluirMuito boas as explicações, mas tenho uma duvida, é possível fazer um encaminhamento de portas de um serviço(squid) para outro serviço(dansguardian) sem alterar o cabeçalho(endereço IP de quem requisitou)?
ResponderExcluirVou tentar explicar melhor, tenho um squid autenticado no domínio, dessa forma, o squid busca as informações de UserID no Active Directory, e o sarg gera os relatórios para esses UserID's, se eu encaminhar o que chega na porta do squid para a porta do dansguardian(filtro de conteúdo), os relatórios não saem para os UserID's e sim para a interface localhost(por causa da regra de nat do iptables) , dessa forma eu não sei o que cada usuário acessou. Preciso encaminhar o que chegar na porta que o squid escuta para a porta que o dansguardian escuta sem usar nat(sem alterar o cabeçalho dos pacotes). Isso é possíve?
Boa tarde,
ResponderExcluirSe eu quiser utilizar o PREROUTING para dois IPS: Utilizando o comando abaixo
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 0:8010 -j DNAT --to IP_INTERNO
Muito bom! Obrigado!
ResponderExcluirParabéns pela explicação
ResponderExcluir