Como DNAT pacotes locais

Sep 19 2020

Tenho um programa que envia pacotes UDP para 192.168.0.2:12345, recebe pacotes na porta 54321 e usa o endereço IP 192.168.0.1. Quero enviar pacotes para 10.10.10.10 com a mesma porta, pois este programa e servidor remoto só aceitam 12345 e 54321. Este é o topo:

No início, eu uso o pré-roteamento de iptables:

iptables -t nat -A PREROUTING -s 192.168.0.1 -p udp --dport 12345 -j DNAT --to 10.10.10.10:12345

Mas não funciona, usei o LOG, descubro que o nat nunca aconteceu (192.168.0.1 & 192.168.0.2 não precisa de roteamento?):

iptables -t nat -A PREROUTING -s 192.168.0.1 -p udp --dport 12345 -j LOG

Então eu acho que esses pacotes podem ser encontrados na cadeia INPUT:

iptables -A INPUT -s 192.168.0.1 -p udp --dport 12345 -j LOG

Existe alguma maneira de usar o DNAT se eu apenas puder ver esses pacotes no INPUT?

A propósito, posso usar o socat para redirecionar esses pacotes, mas não consigo bloquear portas em 12345 e 54321 no lado do servidor:

socat UDP4-RECVFROM:192.168.0.1,fork UDP4-SENDTO:10.10.10.10:12345
socat UDP4-RECVFROM:10.10.10.10,fork UDP4-SENDTO:192.168.0.1:54321

Algumas atualizações de minha parte, posso usar phydev para pacotes nat agora:

iptables -t nat -A PREROUTING -m physdev --physdev-in tap0 -s 192.168.0.1 -p udp --dport 12345 -j DNAT --to 10.10.10.10:12345

De tcpdump de eth0, posso ver pacotes de 192.168.0.1 a 10.10.10.10: (192.168.0.1 não posso usar em minha rede)

tcpdump -n -i eth0 host 10.10.10.10 
12:36:22.250548 IP 192.168.0.1.54321 > 10.10.10.10.12345: UDP, length 16

No entanto, não consigo ver esses pacotes do servidor 10.10.10.10 ... Então eu executo o tcpdump no servidor remoto, posso ver estes pacotes:

21:55:44.980988 IP 192.168.0.1.54321 > 10.10.10.10.12345: UDP, length 16

Mas 192.168.0.1 não pode ser usado em minha rede de laboratório, ele foi descartado.

Então, o restante se tornou: como fazer o DNAT em um pacote e depois o SNAT no mesmo pacote ...

Respostas

1 codefarmer Sep 24 2020 at 17:09

Corrigi esse problema executando o comando

conntrack -F

Depois de todas as minhas regras de iptables. Não há necessidade de usar --phydev, apenas usando duas regras a seguir:

iptables -t nat -A PREROUTING -s 192.168.0.1 -d 192.168.0.2 -p udp --dport 12345 -j DNAT --to 10.10.10.10:12345
iptables -t nat -A POSTROUTING -d 10.10.10.10/24 -o eth0 -j SNAT --to-source 10.10.10.5
Tomek Sep 20 2020 at 16:00

Para realizar DNAT de pacotes gerados localmente, deve-se usar a cadeia OUTPUT da tabela NAT, não a cadeia PREROUTING.

Sua regra provavelmente deve ser:

iptables -t nat -A OUTPUT -s 192.168.0.1 -p udp --dport 12345 -j DNAT --to 10.10.10.10:12345