Nesta lista irão as regras que serão aplicadas no gancho
PREROUTING, ou seja, para pacotes que acabaram de entrar por uma das interfaces de rede, não importando qual será o destino dos mesmos, se para um processo local ou para ser roteado (forward).
Deve-se ter em mente que a etapa de roteamento é quem decidirá qual o caminho que o pacote irá tomar, inclusive decidindo se o mesmo será repassado ou entregue a um processo local. Para realizar o roteamento são considerados parâmetros de destino, como o IP, para saber se é desta máquina ou se deve ser repassado, e porta, se for local para decidir para qual processo.
Este entendimento é muito importante, pois a conclusão é óbvia:
- Se um pacote precisa ter algum parâmetro de DESTINO modificado, deve ser feito ANTES da etapa de roteamento.
Não tem sentido alterar parâmetros de destino após o mesmo ser roteado, pois o roteamento é em função do destino!
Assim sendo, é fácil entender porque na lista PREROUTING é permitido alterar apenas os campos de destino, seja número IP ou porta. A ação que realiza isto é chamada de DNAT (Destination NAT, sendo que NAT significa
Network Address Translate).
Exemplo:
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to :80
Os parâmetros do DNAT são "novoIpDestino:novaPortaDestino". No exemplo anterior, pela omissão do novo IP de destino, mantem-se o mesmo, porém reescrevendo no pacote a porta de destino para a 80. Na prática o que se fez é trocar a porta de destino para 80 em todos os pacotes TCP que tinham como porta destino a 8080.
Analisando a posição do gancho PREROUTING percebe-se que esta regra valerá para todo e qualquer pacote que chegar por uma de suas interfaces, não importando para onde ele seguiria, se local ou forward. Opcionalmente pode-se refinar a regra, sendo bem mais específico:
iptables -t nat -A PREROUTING -i eth0 -p tcp -s 10.1.5.4 -d 172.16.0.2 --dport 8080 -j DNAT --to 172.16.0.1:80
Neste exemplo se um pacote estiver entrando pela interface eth0 (e no gancho PREROUTING só é permitido -i, pois -o não se aplica), se for tcp vindo do ip 10.1.5.4, destinado ao ip 172.16.0.2 para a porta 8080, o ip de destino será trocado para 172.16.0.1 e a porta de destino para 80 (sendo politicamente correto, deveria se usar --to-destination no DNAT e --to-source no SNAT, porém usar apenas --to serve para ambos!).
Como o IP de destino pode ser trocado para qualquer um, inclusive para o IP local, um pacote que originalmente seria repassado (FORWARD) pode ter o ip destino trocado para o IP local e ser enviado para processos locais. Isto é possível somente porque estas regras são aplicadas ANTES da etapa de roteamento (figura 1).
Além da ação DNAT, a lista PREROUTING da tabela nat ainda aceita as ações (-j) LOG e DROP (REJECT não é aceito). Mesmo que, via de regra, pacotes deveriam ser dropados na filter, em algumas situações pode ser desejável poder bloquear antes da etapa de roteamento.
Existe ainda a ação REDIRECT, que nada mais é do que redirecionar o pacote para uma porta específica da máquina onde está o firewall, ou seja, um REDIRECT sempre vai trocar o IP de destino para o IP do firewall, sendo que o efeito seria quase o mesmo que um -j DNAT IPDOFIREWALL:porta, com a diferença que não é necessário conhecer o ip do firewall ao construir a regra.