Estrutura do IPTables 2: a tabela nat
Quais os poderes da tabela nat existente no iptables? E as listas PREROUTING, POSTROUTING, para que servem?
Parte 2: Lista nat PREROUTING
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:
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.
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.
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.
Já tá nos favoritos.