Bonus question: Isn't DNAT supposed to rewrite the source IP when there is a response anyway?
Sim, as regras NAT do iptables operam apenas no primeiro pacote de uma conexão, os pacotes mais recentes são manipulados de acordo com os mapeamentos estabelecidos pela primeira regra.
Sent packets get routed to 192.168.0.169 and responses come back. However they don't come from 1.2.3.4 (the non existent game server) but from my emulated server
O problema é que o NAT não pode traduzir pacotes que nunca são enviados para ele. Aqui está o que está acontecendo em seu cenário.
- O cliente cria o pacote inicial para 1.2.3.4
- O cliente procura em sua tabela de roteamento, ele não encontra nenhuma rota melhor para enviar o pacote ao seu gateway padrão, que é a caixa NAT.
- A caixa NAT pesquisa o pacote na tabela de controle de conexão, determina se é uma nova conexão, executa as manipulações de NAT e estabelece uma entrada de rastreamento de conexão.
- O NAT procura o novo destino em sua tabela de roteamento e envia o pacote ao servidor.
- O servidor cria uma resposta trocando a origem e o destino como de costume
- O servidor procura em sua tabela de roteamento, encontra uma correspondência para o IP do cliente e envia o pacote diretamente para o cliente
- A resposta chega de volta ao cliente, mas como não retornou pela caixa NAT, tem o IP de origem incorreto.
- A resposta é descartada.
Então, o que podemos fazer sobre isso? Uma solução é MASQURADE o tráfego do cliente para o servidor para que o servidor veja o tráfego como proveniente da caixa NAT. Eu acredito que o seguinte deve fazer isso
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 192.168.0.169 -j MASQURADE