Acho que você pode conseguir isso com iptables
e a ferramenta samplicator
se você estiver usando um kernel novo o suficiente para suportar a tabela raw
.
Primeiro, por que socat
não funciona: Providenciar um fluxo de pacotes com socat
é bastante fácil. Você só faria isso:
socat - udp4-listen:20000,fork | tee >(socat - udp-sendto:X.X.X.X:20001) >(socat - udp-sendto:Y.Y.Y.Y:20000)
Isso duplica o tráfego para X.X.X.X:20001
e Y.Y.Y.Y:20000
.
Isso não ajuda você, porque o serviço que atende no X.X.X.X: 20001 vai "ver" 127.0.0.1 como o endereço de origem. É aí que samplicator
pode ajudar. Quoth a página de código samplicator
Google:
This simple program listens for UDP datagrams on a network port, and sends copies of these datagrams on to a set of destinations. ... Another option is that it can "spoof" the IP source address, so that the copies appear to come from the original source, rather than the relay.
Parece exatamente o que precisamos re: o endereço de origem. (Dito isto, eu não testei realmente esta ferramenta. A caixa que estou testando não tem compiladores instalados e eu não vou criar algo agora apenas para falha do servidor. > smile <)
A última coisa que você precisa é cuidar do tráfego proveniente de X.X.X.X:20001
, parecendo vir de X.X.X.X:20000
.
Em seguida, para NAT, as respostas de X.X.X.X:20001
a "vêm de" X.X.X.X:20000
:
iptables -t raw -A POSTROUTING -s X.X.X.X -p udp --sport 20001 -j NOTRACK
iptables -t nat -A POSTROUTING -s X.X.X.X -p udp --sport 20001 -j SNAT --to-source :20000
Cuidado: eu não testei tudo isso juntos. Eu zombei dele com socat
e funcionou bem menos o endereço de origem "spoofing" que samplicator
fornece.