Com apenas NAT - não. Pacotes IP possuem apenas um campo 'fonte'.
-
Se você fizer o iptables manter o endereço original do cliente (somente DNAT), então o yyyy tentará enviar as respostas diretamente para o cliente original (que acha que está falando com xxxx e não esperar quaisquer pacotes de yyyy).
-
Se você fizer o iptables colocar seu endereço como a nova fonte (DNAT + SNAT), então y.y.y.y não saberá o endereço original da fonte.
(Este é realmente o mesmo problema de tentar redirecionar a porta da LAN para a mesma LAN, e o segundo método é chamado de 'NAT hairpinning' ou 'NAT reflection'.)
Para fazer isso funcionar, você precisa de um túnel / VPN entre xxxx e yyyy - embrulhe os pacotes originais que você recebe, sem quaisquer alterações, dentro de outro pacote IP que é enviado para aaaa (que então desembrulhe o pacote tunnelled e veja a fonte original).
Claro, isso significa que você precisa de privilégios de root nos dois sistemas para configurar o encapsulamento. Adicionalmente, o destino (y.y.y.y) precisa suportar "policy routing" - Linux e FreeBSD pf são capazes disso. Ele precisa de uma regra que roteará tudo através da VPN se o endereço de origem for um endereço VPN.
Você ainda precisa da regra DNAT do iptables, mas seu "destino de destino" será o endereço de VPN de y, não o endereço público. Você pode usar qualquer tipo de túnel / VPN para isso, do básico "IP-in-IP" ao GRE ao OpenVPN ao WireGuard. Por exemplo:
-
x.x.x.x
Abra o túnel:
ip link add gre-y type gre local x.x.x.x remote y.y.y.y ttl 64 ip link set gre-y up ip addr add 192.168.47.1/24 dev gre-y
Adicione uma regra de encaminhamento de porta, como em uma LAN:
iptables -t nat -I PREROUTING -p tcp --dport 1234 -j DNAT --to-destination 192.168.47.2
-
y.y.y.y
Abra o túnel:
ip link add gre-x type gre local y.y.y.y remote x.x.x.x ttl 64 ip link set gre-x up ip addr add 192.168.47.2/24 dev gre-x
Verifique se funciona:
ping 192.168.47.1
Configure o roteamento de políticas, para que as respostas (e somente as respostas) passem pelo túnel:
ip route add default via 192.168.47.1 dev gre-x table 1111 ip rule add pref 1000 from 192.168.47.2 lookup 1111
(Para usar outro tipo de túnel / VPN, substitua apenas a parte "Trazer o túnel").