La razón por la que aparentemente iptables -t nat -A PREROUTING -d 192.168.12.87 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77
no funcionará es cómo se enrutarán los paquetes de retorno.
Puede configurar reglas que provoquen que los paquetes enviados a 192.168.12.87 sean simplemente NATizados a 192.168.12.77, pero 192.168.12.77 luego enviará respuestas directamente al cliente. Esas respuestas no pasarán por el host donde su regla de iptables está haciendo NAT, por lo tanto, los paquetes en una dirección se traducen, pero los paquetes en la otra dirección no.
Hay tres enfoques para resolver este problema.
- En el primer host, no solo haga DNAT, sino que también haga SNAT de modo que el tráfico de retorno se envíe de vuelta a través del primer host. La regla podría verse algo así
iptables -t NAT -A POSTROUTING -d 192.168.12.77 -p tcp --dport 80 -j SNAT --to-source 192.168.12.87
- Inspírese en el equilibrio de carga DSR y DNAT los paquetes en la capa Ethernet en lugar de en la capa IP. Al reemplazar el MAC de destino de los paquetes con el MAC de 192.168.12.77 y enviarlo a Ethernet sin tocar la capa IP, entonces 192.168.12.77 podría tener 192.168.12.87 configurado en una interfaz ficticia y así poder terminar la conexión TCP con la IP del servidor conocida por el cliente.
- Use la solución ingenua (pero no funciona) en el primer host. Luego maneje los paquetes de retorno en el segundo host haciendo un SNAT en el tráfico de retorno. Una regla podría verse así
iptables -t nat -A OUTPUT -p tcp --sport 80 -j SNAT --to-source 192.168.12.87
Cada una de esas tres soluciones tiene inconvenientes, por lo que debe considerar detenidamente si realmente necesita hacer este reenvío particular.
- El uso de SNAT perderá la IP del cliente, por lo que el host número 2 pensará que todas las conexiones provienen de 192.168.12.87. Además, utilizará el ancho de banda a través del host número 1 para todos los paquetes de respuesta, lo que tomaría una ruta más directa con los otros enfoques.
- El enfoque DSR interrumpirá todas las demás comunicaciones entre los dos nodos. El enfoque DSR en realidad solo es apropiado cuando la dirección del servidor no es la IP principal de ninguno de los hosts. Cada host necesita tener una IP primaria, que no es la IP DSR.
- Usar el seguimiento de conexión en un host para traducir en una dirección y el seguimiento de conexión en otro host para traducir en la otra dirección es simplemente feo, y hay varias formas en que podría romperse. Por ejemplo, si NAT modifica los números de puerto en cualquiera de los hosts, no hay forma de reconstruirlos. Tampoco es un hecho, que el seguimiento de la conexión funcionará correctamente, si el primer paquete que ve es un SYN-ACK en lugar de un ACK.
De los tres enfoques, creo que el primero es el que es más probable que funcione. Entonces, si no necesita conocer las direcciones IP del cliente, esa es la que recomendaría.
También puede optar por olvidarse de NAT por completo y no intentar resolver el problema en la capa MAC o IP. Puede ir hasta la capa HTTP y buscar una solución allí. En ese caso, la solución que encontrará es un proxy HTTP. Si instala un proxy HTTP en 192.168.12.87 y lo configura adecuadamente, puede hacer que reenvíe las solicitudes a 192.168.12.77 y reenvíe las respuestas. Además, puede insertar un encabezado X-Fordered-For conservando la IP del cliente original. El servidor en 192.168.12.77 debe configurarse para confiar en el encabezado X-Fordered-For de 192.168.12.87.