iptables DNAT + SNAT: multiplicação indesejada do mesmo datagrama udp (e mau funcionamento)

1

tentando descobrir meu erro no seguinte cenário muito simples:

|peerA|(Aip:Aport) <--> (Bdev:Bip:Bport)|NatNode|(Cdev:Cip:Cport) <--> (Dip:Dport)| peerD

(o peer A emite datagramas para Bip: Bport, o NatNode os traduz como enviados por Cip: Cport e destinados a Dip: Dport; e vice-versa)

o que fiz, com tabela de roteamento iptables e "vanilla" vazia, é:

iptables -p udp -t nat -A PREROUTING -s Aip -d Bip -i Bdev --destination-port Bport -j DNAT --to-destination Dip:Dport

iptables -p udp -t nat -A POSTROUTING -s Aip -d Dip -o Cdev --destination-port Dport -j DNAT --to-source Cip:Cport

(mais as regras para a direção reversa e um destino LOG para cada alvo principal -t nat e -t filter)

o que eu esperava era: - corrigir reescrevendo (e está OK, como mostrado por wireshark) - cada pacote entrado de PREROUTING (decisão de roteamento, possivelmente para Cdev) atravessa FORWARD uma vez (decisão de roteamento, possivelmente para Cdev), então POSTROUTING uma vez , então ele vai para o rede.

o que eu tenho é (examinando o registro): 1. o primeiro pacote atravessa PREROUTING uma vez, filtra / FORWARD uma tonelada de vezes (sim, o mesmo id de pacote), então POSTROUTING muito de vezes, então é emitido para o rede uma vez e os pares remotos a recebem. 2. a partir do segundo datagrama, tudo parece acontecer, mas o datagrama traduzido não é emitido no dispositivo. 3. se eu esperar o suficiente (diga > 15 segundos) e tentar novamente, o datagrama principal da nova sequência se comportará como 1., a partir do segundo como 2.

Também tentei remover as opções -i e -o, mas parece não mudar nada.

O que estou fazendo de errado aqui?

Não consigo identificar o problema, parece-me que fiz "como pretendido", instintivamente suspeito que algo está errado nos pontos de decisão de roteamento, e talvez os pacotes como em 2. não sejam emitidos por algum comportamento de salvaguarda da pilha linux tcp / ip ...

Tenho certeza que é culpa minha, mas não consigo encontrar onde.

obrigado pela sua ajuda!

    
por Primate 29.10.2015 / 15:20

1 resposta

0

Se você quiser fazer o NAT clássico para Dip e implementar o encaminhamento de porta para o Dport, então você não precisa de nenhuma regra POSTROUTING especialmente criada para ele, apenas adicione o genérico -j MASQUERADE.

E ... DNAT no POSTROUTING? Você fez um erro de digitação?

Eu geralmente implemento o NAT clássico como (assumindo que o firewall de bloqueio esteja configurado e o conntrack receba todos os pacotes "respondidos"):

iptables -I POSTROUTING -o ppp0 -j MASQUERADE

iptables -I FORWARD -i eth0 -o ppp0 -j ACCEPT

iptables -I PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to local_ip:80

Aqui, eth0 é iface local na mesma sub-rede que local_ip, ppp0 é internet iface.

    
por 30.10.2015 / 15:07