¿Cómo hacer SNAT con el puerto de destino cambiado?

¿Cómo hacer SNAT con el puerto de destino cambiado?

Tengo un host Linux que sirve como fuente NAT (SNAT). Recibe todos los paquetes para la ruta predeterminada desde la red interna en una interfaz interna con IP 192.168.2.1. El host SNAT tiene varias direcciones IP salientes (por ejemplo, 3.3.3.3, 3.3.3.4, 3.3.3.5, ...).

Me gustaría configurar iptables (o alguna otra herramienta en Linux; no tiene que ser iptables, pero creo que es la herramienta correcta) de modo que el puerto al que llega un paquete en la IP privada interna determine la IP en el cual se envía la solicitud y el puerto de salida es constante (por ejemplo, puerto 80).

Por ejemplo, la siguiente asignación podría ser un prototipo (todos estos se recibirían en 192.168.2.1, pero con una IP de destino de la IP que aparece primero en la asignación... -> indica el dispositivo SNAT):

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

(192.168.xy podría ser cualquier host en la red privada. Los puertos z y r son casi con certeza puertos efímeros y obviamente son diferentes para cada sesión, pero el SNAT obviamente necesita administrar ese estado para enviar respuestas al solicitante correcto)

He aquí un ejemplo concreto:

Un paquete puede originarse desde una interfaz de la red privada (por ejemplo, 192.168.2.5). Por tanto, la IP de origen será "192.168.2.5". La IP de destino podría ser "10.10.10.10" y el puerto de destino podría ser "8001". La tabla de enrutamiento le dice al enrutador IP local que envíe todos los paquetes destinados a "0.0.0.0/0" a 192.168.2.1 y no hay ninguna entrada más específica en la tabla de enrutamiento. Entonces, el paquete llega a 192.168.2.1 (SNAT) con una IP de destino de 10.10.10.10 y un puerto de destino de 8001. Si eso sucede, quiero que NAT envíe el paquete a 3.3.3.3:r con un destino de 10.10. .10.10:80 (el 3.3.3.3 obviamente tendría que definirse en un mapeo y debería basarse en el puerto de destino original de 8001).

Creo que esto sería relativamente trivial con iptables si no fuera por el requisito de cambiar el puerto de destino, pero ese problema me deja perplejo.

¿Cómo puedo conseguir esto?

información relacionada