Como fazer SNAT com porta de destino alterada?

Como fazer SNAT com porta de destino alterada?

Eu tenho um host Linux servindo como NAT de origem (SNAT). Recebe todos os pacotes da rota padrão da rede interna em uma interface interna com IP 192.168.2.1. O host SNAT possui vários endereços IP de saída (por exemplo, 3.3.3.3, 3.3.3.4, 3.3.3.5, ...).

Eu gostaria de configurar o iptables (ou alguma outra ferramenta no Linux - não precisa ser iptables - mas acho que é a ferramenta certa) de forma que a porta na qual um pacote chega no IP privado interno determine o IP em qual a solicitação é enviada e a porta de saída é constante (por exemplo, porta 80).

Por exemplo, o mapeamento abaixo pode ser prototípico (todos seriam recebidos em 192.168.2.1, mas com um IP de destino do IP listado primeiro no mapeamento... -> indica o dispositivo SNAT):

  • (src) 192.168.xy:z (destino) 10.10.10.10:8001 -> (src) 3.3.3.3:r (destino) 10.10.10.10:80
  • (src) 192.168.xy:z (destino) 11.11.11.11:8002 -> (src) 3.3.3.4:r (destino) 11.11.11.11:80
  • (src) 192.168.xy:z (destino) 12.12.12.12:8003 -> (src) 3.3.3.5:r (destino) 12.12.12.12:80
  • (src) 192.168.xy:z (destino) 13.13.13.13:8004 -> (src) 4.4.4.3:r (destino) 13.13.13.13:80

(192.168.xy pode ser qualquer host na rede privada. As portas z e r são quase certamente portas efêmeras e são obviamente diferentes para cada sessão, mas o SNAT obviamente precisa gerenciar esse estado para obter respostas ao solicitante correto)

Aqui está um exemplo concreto:

Um pacote pode ser originado de uma interface na rede privada (por exemplo, 192.168.2.5). O IP de origem será, portanto, “192.168.2.5”. O IP de destino pode ser “10.10.10.10” e a porta de destino pode ser “8001”. A tabela de roteamento informa ao roteador IP local para enviar todos os pacotes destinados a "0.0.0.0/0" para 192.168.2.1 e não há mais nenhuma entrada específica na tabela de rotas. Portanto, o pacote chega em 192.168.2.1 (o SNAT) com IP de destino 10.10.10.10 e porta de destino 8001. Se isso acontecer, quero que o NAT envie o pacote em 3.3.3.3:r com destino 10.10 .10.10:80 (o 3.3.3.3 obviamente teria que ser definido em um mapeamento e deveria ser baseado na porta de destino original 8001).

Eu acho que isso seria relativamente trivial com o iptables se não fosse pelo requisito de alterar a porta de destino - mas esse problema me deixa confuso.

Como posso conseguir isso?

informação relacionada