Por um tempo agora (introduzido na versão 1.3, acredito), iptables
' o módulo conntrack pode rastrear dois estados virtuais, SNAT e DNAT:
SNAT Um estado virtual, correspondendo se o endereço de origem original for diferente do destino de resposta. DNAT Um estado virtual, correspondendo se o destino original for diferente da fonte de resposta.
No meu roteador/host de firewall, tenho algumas regras para SNAT como esta:
# SNAT
iptables -t filter -A FORWARD -i $FROM_IFACE -o $TO_IFACE -s $FROM_IP -d $TO_IP -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A FORWARD -i $TO_IFACE -o $FROM_IFACE -s $TO_IP -d $FROM_IP -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o $TO_IFACE -s $FROM_IP -d $TO_IP -j SNAT --to-source $SNAT_IP
# DNAT
iptables -t nat -A PREROUTING -i $FROM_IFACE -d $FROM_IP -p $PROTO --dport $PORT -j DNAT --to-destination $TO_IP
iptables -t filter -A FORWARD -i $FROM_IFACE -o $TO_IFACE -d $TO_IP -p $PROTO --dport $PORT -j ACCEPT
iptables -t filter -A FORWARD -i $TO_IFACE -o $FROM_IFACE -s $TO_IP -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Depois de pesquisar bastante no Google, não consegui encontrar nenhum exemplo de iptables
regras usando esses "novos" SNAT
ou DNAT
estados, mas tentei de qualquer maneira substituir ESTABLISHED,RELATED
por SNAT
ou DNAT
, assim:
# SNAT
iptables -t filter -A FORWARD -i $FROM_IFACE -o $TO_IFACE -s $FROM_IP -d $TO_IP -m conntrack --ctstate NEW,SNAT -j ACCEPT
iptables -t filter -A FORWARD -i $TO_IFACE -o $FROM_IFACE -s $TO_IP -d $FROM_IP -m conntrack --ctstate SNAT -j ACCEPT
iptables -t nat -A POSTROUTING -o $TO_IFACE -s $FROM_IP -d $TO_IP -j SNAT --to-source $SNAT_IP
# DNAT
iptables -t nat -A PREROUTING -i $FROM_IFACE -d $FROM_IP -p $PROTO --dport $PORT -j DNAT --to-destination $TO_IP
iptables -t filter -A FORWARD -i $FROM_IFACE -o $TO_IFACE -d $TO_IP -p $PROTO --dport $PORT -j ACCEPT
iptables -t filter -A FORWARD -i $TO_IFACE -o $FROM_IFACE -s $TO_IP -m conntrack --ctstate DNAT -j ACCEPT
Pareceu funcionar , e esse método tem pelo menos um benefício que pude notar: meu firewall costumava descartar pacotes RST indo de meus hosts internos para a Internet (já que estão no .INVALID
estado), mas com esse novo método, eles foram autorizados a passar
Infelizmente, embora conveniente, não tenho certeza se esse método é realmente adequado, porque meu conhecimento teórico sobre redes não é suficiente para entender se é muito permissivo (ou seja, permitir que alguns pacotes indesejados de fora da minha LAN cheguem ao interior).
Acho que minha pergunta poderia ser formulada assim: um pacote pode ter o estado SNAT
or DNAT
sem ter o estado ESTABLISHED
or RELATED
(exceto, obviamente, o primeiro que tem o NEW
estado)?
Nota: Eu tentei logar tais pacotes, mas pelo que sei é impossível, pois iptables
aceita apenas uma --ctstate
opção e !
não pode ser usado dentro dela (ou seja, não posso dizer, ou pelo menos não consegui encontrar uma maneira de dizer, "registrar pacotes que têm SNAT
estado, mas não ESTABLISHED
ou RELATED
estado"). Se houver um método alternativo para registrá-los em que não pensei, isso também seria muito bem-vindo.
EDIT 1: depois de algumas tentativas e erros, percebi que estava errado (daí o texto riscado): alguns pacotes ainda estão no estado INVALID
e, portanto, finalmente descartados.
EDIT 2: se usar SNAT
/ DNAT
no lugar de ESTABLISH,RELATED
não for seguro, forneça alguns exemplos concretos de casos em que os pacotes podem estar nesses estados anteriores sem estar nos últimos.