terça-feira, 22 de novembro de 2011

Entendendo IPTABLES: PREROUTING e POSTROUTING


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.
 





17 comentários:

  1. Excelente explicação. Muito obrigado.

    ResponderExcluir
  2. Até que enfim entendi essas chains...Ja tinha lido sobre isso mas nunca entendia! Muito obrigada!

    ResponderExcluir
  3. Opa!

    Legal 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!

    ResponderExcluir
    Respostas
    1. 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

      Excluir
  4. Olá.
    Gostei da explicação.
    Vc poderia explicar pra que serve cada opção(-t ,-a...) ?

    vlw

    ResponderExcluir
    Respostas
    1. 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.

      Excluir
  5. Olá!

    muito 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!

    ResponderExcluir
  6. 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.

    Grato!

    ResponderExcluir
    Respostas
    1. Tá um pouco confuso o que você postou, mas vou tentar responder quanlquer coisa posta de novo.
      Em 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.

      Excluir
  7. Amigo parabéns muito bem explicado.

    ResponderExcluir
  8. Tudo esta no kernel antes ou depois dele. Dai as regras muito bom parabens.

    ResponderExcluir
  9. Tudo esta no kernel antes ou depois dele. Dai as regras muito bom parabens.

    ResponderExcluir
  10. Muito 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)?

    Vou 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?

    ResponderExcluir
  11. Boa tarde,

    Se 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

    ResponderExcluir