Encaminhamento de porta com DNAT e SNAT sem tocar em outros pacotes

1

Eu tenho um gateway Linux com iptables que faz roteamento e encaminhamento de porta. Eu quero que o encaminhamento de porta aconteça independentemente do roteamento.

Para encaminhamento de porta, adiciono isso à tabela nat :

iptables -t nat -A "$PRE" -p tcp -d $GW --dport $fromPort -j DNAT --to-destination $toHost:$toPort
iptables -t nat -A "$POST" -p tcp -d $toHost --dport $toPort -j SNAT --to $SRC

$PRE e POST são, na verdade, cadeias específicas de destino para as cadeias PREROUTING e POSTROUTING , respectivamente, para que eu possa manter os iptables limpos. $SRC é o endereço IP do qual sou SNATing, diferente do IP do gateway $GW .

O problema com esta configuração é que os pacotes roteados regulares que não foram DNAT mas que vão para a mesma combinação $toHost:$toPort também serão SNATed.

Eu gostaria de evitar isso. Alguma coisa inteligente que eu possa fazer?

    
por w00t 03.07.2012 / 15:13

1 resposta

1

Mantenha a simplicidade: você não precisa SNAT de nada. Ao fazer isso, todos os pacotes chegarão ao servidor de destino que parece vir do seu firewall, e não do cliente de origem, que na maioria dos casos não é o que você deseja.

Com a regra SNAT fora do caminho, você não precisa se preocupar com a correspondência de outro tráfego.

Observação: suas regras FORWARD terão que corresponder ao IP de origem real e ao IP de destino interno, pois a cadeia FORWARD é alcançada depois que as regras DNAT são aplicadas.

EDITAR

Dado o requisito de SNAT : desde que você esteja satisfeito com a maneira como a regra DNAT está correspondendo aos pacotes, você pode preceder isso com uma regra mangle que marca esses mesmos pacotes:

iptables -t mangle -A <mangle chain> -p tcp -d $GW --dport $fromPort -j MARK --set-mark 0x1

Então, toda a sua regra SNAT precisa corresponder aos pacotes marcados:

iptables -t nat -A "$POST" -m mark --mark 0x1 -j SNAT --to $SRC

Se você precisar identificar vários fluxos separados, será possível variar a marca no script junto com $SRC .

    
por 03.07.2012 / 16:11