Você terá que executar os três comandos a seguir para que funcione:
iptables -t nat -A OUTPUT -p tcp -d 127.0.0.1 --dport 4242 -j DNAT --to 11.22.33.44:5353
sysctl -w net.ipv4.conf.eth0.route_localnet=1
iptables -t nat -A POSTROUTING -p tcp -s 127.0.0.1 -d 11.22.33.44 --dport 5353 -j SNAT --to $your-eth0-ip
Aqui está a explicação detalhada.
O primeiro comando fará o DNAT como esperado. No entanto, se você tentar capturar pacotes apenas com este conjunto de regras, verá que não recebe nada:
tcpdump -i any -n port 5353
Isso ocorre porque o kernel do Linux descarta esse tipo de pacote por padrão, se o pacote tiver 127.0.0.0/8
como uma extremidade e um endereço IP externo como a outra extremidade.
O segundo comando altera o parâmetro do kernel, para permitir que esse tipo de pacote passe (é claro, você deve alterar eth0
de acordo). Depois disso, quando você capturar o pacote no eth0, você verá os pacotes enviados, mas com o endereço de origem 127.0.0.1
e o endereço de destino 11.22.33.44
. Se este pacote pode ou não atingir o servidor de destino (os roteadores intermediários descartarão esse pacote), não há como esse pacote retornar. Portanto, você deve adicionar uma regra SNAT
para alterar o endereço de origem para sua eth0. E agora deve funcionar.