iptables direcionam o tráfego para ip externo específico para um ip local diferente e retornam respostas com ip externo como fonte

3

Meu raspberry pi é o meu gateway padrão, localizado entre o roteador e o resto da minha rede doméstica. Quando meu PC de mesa envia pacotes para um IP externo específico, eu quero que meu pi de framboesa os envie para outra máquina local. (Tentando emular um servidor de jogo, mas o jogo tem o IP do servidor codificado) Isso precisa funcionar para TCP e UDP.

Eu tentei as seguintes regras no meu framboesa: ( 1337 = porta de jogo, 1.2.3.4 = servidor de jogo, 192.168.0.169 = outro servidor de emulação de máquina local)

iptables -t nat -A PREROUTING -d 1.2.3.4/32 -p udp -m udp --dport 1337 -j DNAT --to-destination 192.168.0.169:1337
iptables -t nat -A PREROUTING -d 1.2.3.4/32 -p tcp -m tcp --dport 1337 -j DNAT --to-destination 192.168.0.169:1337

O UDP funciona bem. Os pacotes enviados são roteados para 192.168.0.169 e as respostas voltam. No entanto, eles não vêm de 1.2.3.4 (o servidor de jogos inexistente), mas do meu servidor emulado 192.168.0.169 . Para UDP, isso realmente não importa, no entanto, com o TCP, isso faz com que o handshake falhe:

(Meu PC desktop é 192.168.0.199 . Wireshark ver de 192.168.0.169 , o servidor de jogos emulado. Pelo que vejo o SYN ACK não funcionou, daí as retransmissões. Eu acho que isso é porque o SYN ACK vem de um IP inesperado)

Eu tentei reescrever o IP de origem dos pacotes voltando para 192.168.0.199 com esta regra:

iptables -t nat -A POSTROUTING -s 192.168.0.169/32 -d 192.168.0.199/32 -p tcp -j SNAT --to-source 1.2.3.4

No entanto, simplesmente não funciona. Eu não sou bom no iptables ainda, então eu provavelmente fiz algo errado, mas não tenho certeza se reescrever a fonte de todos os pacotes do servidor do jogo para o meu PC desktop é uma boa idéia de qualquer maneira (outros aplicativos ficarão bagunçados) .

Pergunta bônus: a DNAT não deveria reescrever o IP de origem quando houver uma resposta?

    
por whodatdev 28.09.2017 / 17:58

1 resposta

2

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
    
por 28.09.2017 / 22:44

Tags