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!