¿Cómo puedo cambiar la IP de origen de un paquete entrante antes de que llegue al servicio en ejecución?
Tengo dos dispositivos, un administrador y un servidor, conectados mediante VPN y tengo NAT entre ellos.
IP de la interfaz del administrador: A IP de la interfaz del servidor: B
El administrador se conecta al servidor usando NAT IP Y y el servidor ve la IP X cuando el administrador se conecta
¿Cómo configuro iptables en el servidor de tal manera que cuando llegue el paquete con la IP de origen X, se modifique a IP?
Sé que esto no debería ser un problema en una red y un producto bien diseñados, pero necesitamos una solución por el momento hasta que se solucione en el lado del software.
Hasta ahora, las siguientes reglas de iptables no han ayudado:
iptables -t nat -A POSTROUTING -s <X> -o eth0 -j SNAT --to <A>
Cualquier ayuda se agradece.
Respuesta1
NAT depende de los servicios "solicitados" poriptablesy proporcionado por elconectarsubsistema. SNAT no está disponible antes de que se tome la decisión de enrutamiento, pero aún está disponible una vez que se eligió el paquete para ser enrutado al host: en el caso poco utilizadonat/ENTRADAcadena, como se documenta en elpágina de manual:
SNAT
Este objetivo sólo es válido en la tabla nat, en el
POSTROUTING
yINPUT
cadenas y cadenas definidas por el usuario que solo se llaman desde esas cadenas. [...]
Entonces, siempre que el servidor reciba el tráfico (sin enrutarlo más), al recibir un paquete desde la dirección IP de origen <X> en la dirección IP de destino del servidor <B> a través de la interfazeth0, se puede aplicar SNAT para que aparezca como dirección de origen <A> (que era la dirección de origen IP original, pero esta información se pierde), con esto:
iptables -t nat -A INPUT -s <X> -d <B> -i eth0 -j SNAT --to <A>
O usando una versión más simple:
iptables -t nat -A INPUT -s <X> -j SNAT --to <A>
Podría agregar más restricciones como -p tcp --dport XXXX
(XXXX para el servicio real alcanzado), y probablemente debería hacerlo: si tiene el problema que se describe a continuación, podría impedir el acceso al sistema a través de la VPN. Tenga un método de acceso de respaldo o no lo haga de forma remota a menos que esté seguro.
Es posible que la regla anterior no sea suficiente debido al enrutamiento. Si la dirección IP <A> no está en una ruta conocida hacia el Servidor (esto sucedería sólo si el Servidor no tienepor defectoruta). Si bien el sistema nunca enviará un paquete de regreso (IP o incluso ARP) a este destino (las respuestas no son SNAT), aún se necesita una ruta para un manejo correcto por parte de la pila de enrutamiento que no sabe que sucedió SNAT.
Entonces si eliptablesLa regla anterior no es suficiente (probablemente si el servidor no tiene una ruta predeterminada), puede agregar:
ip route add <A>/32 dev eth0