Redireccionar tráfico de una IP y puerto hacia otra IP y puerto

Algo muy común  cuando administramos servidores es redireccionar tráfico.

Supongamos que tenemos un servidor con determinados servicios funcionando, pero por cualquier razón cambiamos uno de esos servicios (no sé, por ejemplo pop3 que es el puerto 110) hacia otro servidor. Lo normal y más frecuente sería simplemente cambiar la IP en el registro DNS, no obstante si alguien estaba usando la IP en vez del subdominio se verá afectado.

¿Qué hacer? … simple, redireccionar el tráfico que reciba ese servidor por ese puerto hacia otro servidor con el mismo puerto.

server-nodo-lan-ethernet

¿Cómo empezamos a redireccionar tráfico?

Lo primero será que debemos tener habilitado el forwarding en el servidor, para ello pondremos lo siguiente:

echo "1" > /proc/sys/net/ipv4/ip_forward

Todos los comandos que se muestran en este tutorial deben ser ejecutados con privilegios de administración, recomiendo que sean ejecutados directamente con el usuario root.

También pueden usar este otro comando, en caso de que el anterior no les funcione (me sucedió así en un CentOS):
sysctl net.ipv4.ip_forward=1
Luego reiniciaremos la red:

service networking restart

En distros RPM como CentOS y otras, sería:

service nertwork restart

Ahora pasaremos a lo importante, indicarle al servidor mediante iptables qué redireccionar:

iptables -t nat -A PREROUTING -p tcp --dport <puerto receptor> -j DNAT --to-destination <ip final>:<puerto de ip final>

O sea y siguiendo el ejemplo que mencioné, supongamos que deseamos redireccionar todo el tráfico que recibe nuestro servidor por el puerto 110 hacia otro servidor (ej: 10.10.0.2), que igual recibirá ese tráfico por el 110 (pues se trata del mismo servicio):

iptables -t nat -A PREROUTING -p tcp --dport 110 -j DNAT --to-destination 10.10.0.2:110

El servidor 10.10.0.2 verá que todos los paquetes o peticiones vienen desde la IP del cliente, en caso de que quieran natear las peticiones, o sea, que el 2do servidor vea que las peticiones llegan con la IP del 1er servidor (y en el cual aplicamos la redirección), sería poner además esta segunda línea:

iptables -t nat -A POSTROUTING -j MASQUERADE

Algunas preguntas y respuestas

En el ejemplo usé el mismo puerto en ambas ocasiones (el 110), no obstante pueden redireccionar tráfico de un puerto a otro sin problemas. Por ejemplo, supongamos que deseo redireccionar el tráfico del puerto 80 al 443 en otro servidor, para ello sería:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.10.0.2:443

Esto es iptables, pueden usar todos los otros parámetros que conocemos, por ejemplo, si solo deseamos redireccionar tráfico de una IP en específica, sería agregando -s <ip> … por ejemplo redireccionaré solo el tráfico que venga desde 10.10.0.51:

iptables -t nat -A PREROUTING -p tcp -s 10.10.0.51 --dport 80 -j DNAT --to-destination 10.10.0.2:443

O bien una red entera (/24):

iptables -t nat -A PREROUTING -p tcp -s 10.10.0.0/24 --dport 80 -j DNAT --to-destination 10.10.0.2:443

También podemos especificar la interfaz de red con -i <interfaz>:

iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 80 -j DNAT --to-destination 10.10.0.2:443

Fin!

Esto como dije ya, es iptables, pueden aplicar lo ya conocido para que el servidor haga exactamente lo que quieran que haga 😉

Saludos!

DedicatedServer_SubImage


20 comentarios, deja el tuyo

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   Fer dijo

    Esto también lo podemos hacer desde un firewall que permita la redirección de puertos, no? (aplicando las reglas correspondientes).

    1.    KZKG^Gaara dijo

      Sí claro, al final un firewall como Pfsense u otros, usan iptables por atrás.

      1.    dhunter dijo

        Para ser exactos pfsense no usa iptables sino pf, recuerda que es un bsd por dentro.

        1.    KZKG^Gaara dijo

          Oh right, my bad!

  2.   Nicolas dijo

    Muchas gracias por el tip 🙂

    tengo un par de dudas:
    1 – El cambio es permanente? o se pierde al reiniciar el servidor?
    2 – Tengo varias instancias (digamos A, B y C) en la misma subred. En la instancia A aplico la regla para rutear el trafico a una IP externa, y probando con curls desde las instancias B y C, todo funciona de maravillas. El problema es que desde la instancia A no funciona. Probe usando tanto su ip como la interfaz de loopback, y ninguna funciona:
    $ iptables -t nat -A PREROUTING -p tcp –dport 8080 -j DNAT –to-destination x.x.x.x:8080
    $ iptables -t nat -A PREROUTING -p tcp -i lo –dport 8080 -j DNAT –to-destination x.x.x.x:8080

    $ curl ip-y-y-y-y:8080/hello_world
    curl: (7) Failed to connect to ip-y-y-y-y port 8080: Connection refused
    $ curl localhost:8080/hello_world
    curl: (7) Failed to connect to localhost port 8080: Connection refused

    Alguna idea de cual puede ser el problema?

    1.    KZKG^Gaara dijo

      Sí, el cambio se pierde al reiniciar, deberás usar iptables-save & iptables-restore o algo así para evitar eso.
      No entendí del todo lo que quieres hacer, ¿instancia A?

      1.    Nicolas dijo

        Tengo un servidor que solo admite conexiones desde una ip en particular (la del servidor A), no puedo ni deseo agregar mas ips a la whitelist (por temas de escalabilidad), por lo que quiero que todo el trafico hacia el servidor externo pase por dicho servidor (A).
        Por una cuestion de practicidad, tengo configuraciones globales que definen que IP usar para cada servicio, por lo que en este caso es algo asi como que «todos los que quieran usar el servicio externo, tienen que usar la ip A»
        Esto lo logre satisfactoriamente usando el metodo de este articulo, pero me encuentro con el problema de que al aplicarlo, el servidor A no puede acceder al servicio usando su propia ip (pero si lo hacen todos los otros servidores).
        Hasta ahora, lo mejor que encontre fue agregar el mapeo en el archivo /etc/hosts del servidor A, apuntando a la ip externa, sobreescribiendo la configuracion global.

  3.   braybaut dijo

    Muy bueno, si tengo otro servidor de correo podria reenviar el trafico del puerto 143 del server1 al server2 y los correos me llegaran al servidor2 cierto ?

    Saludos

    1.    KZKG^Gaara dijo

      En teoría sí, funciona así. Claro, debes tener instalado apropiadamente el servidor de correo en server2 🙂

  4.   msx dijo

    El tipo de posts que nos gusta leer, gracias!

  5.   abraham ibarra dijo

    Excelente articulo, tengo un proyecto en el cual estoy trabajando y queria hacerte una consulta , hay switches industriales con funcion de NAT (Supongo utilizan IPTables por debajo) , para traudcir una direccion IP sin hacer cambios en el equipo, un ejemplo , tengo un Servidor 10.10.2.1 que se comunica con equipos 10.10.2.X y mediante el switch se programa para que un equipo que tiene una direccion 192.168.2.4 en realidad sea visto desde el servidor como 10.10.2.5, tradujo esa direccion IP para que fuera visto desde los demas equipos con esa direccion, quiero hacerlo desde un server con Ubuntu u otra distribucion , Cuales serian las reglas de iptables?

  6.   Kuk dijo

    Muy buena info gracias ^_^

  7.   Yisus dijo

    Buenas tardes.
    Tengo un problema intentando hacer una redirección. me explico:
    tengo un servidor proxy en Ubuntu, con 2 tarjetas de red:
    eth0=192.168.1.1 está contectado al resto de la red local.
    eth1=192.168.2.2 está conectado al router.
    Necesito que todo lo que llegue por eth0, salga por eth1, y además pasando por el proxy (uso Squid, cuyo puerto por defecto es 3128), y no consigo dar con la tecla en la configuración de IPTABLES.
    No necesito restricción de ningún tipo, solo que quede un registro en el log de las direcciones web que se visitan.

    Espero que puedan ayudarme, ya que es una tarea bastante engorrosa que me lleva preocupando un par de días.

    Gracias.

  8.   Gabriel dijo

    amigo soy muy novato en esto de los servidores demas no tengo ni idea pero entiendo del tema y aprendo rapido, mi pregunta es la siguiente tengo 2 servidores serv_1 y serv_2 los cuales tengo conectados a la misma intranet, en dichos servidores tengo montado una owncloud , me gustaria hacer lo siguiente:

    que cierto rango de ips por ejemplo rangoip_1 al colocar una ip de acceso a la owncloud (ipowncloud) se direccione hacia el serv_1 y si es otro rangoip_2 colocado la misma ipowncloud se direccione al serv_2 , esto con el fin de que los 2 servidores estan ubicados en dos ciudades diferentes y los rangos de ip son diferentes pero todos son en la misma red, eso seria la primera parte , la segunda seria claro esta sincronizar estos 2 servidores para que sean espejos o que me aconcejan esto con el fin de optimizar el ancho de banda , por favor, si me van a explicar como haganlo paso a paso no al modo super programador =(

  9.   Antonio Carrizosa dijo

    Hola, disculpa, tengo un switch encargado de la comunicación de todos los dispositivos que conforman mi red, y después de este un firewall y por ultimo la salida a internet, lo que pasa es que me gustaría que el re-direccionamiento se diera en el switch y no tenga que llegar hasta el firewall a menos que el servicio que se solicite sea internet.

  10.   juan dijo

    Usando este metodo podria redireccionar HTTPS a HTTP?

  11.   mati dijo

    hola tal vez sea un poco tarde, pero queria consultarte, como debo hacer para que squid no modifique la ip del cliente al quererme conectar a un servidor web de la misma red?

  12.   Lafat32 dijo

    No me traten mal por preguntar. Se puede hacer esto en Windows?

  13.   Martin dijo

    Me ha sido util esta información. Como siempre con se puede confiar en ustedes chicos, cuando no encuentro algo en ingles suelo terminar buscando en español, de esas ocasiones casi siempre llego a este sitio.Gracias.

  14.   Seba dijo

    Tengo un router 4G que es cliente de una red que yo no administro (obvio, soy cliente)… este router es una puerta a esa red remota mediante OpenVPN. Ademas, dicho router cumple la funcion de portforwarding para acceder al puerto 80 de servidor de una de esas subredes en terreno.

    Esta fue la declaracion que tuve que meterle al router como una custom rule del firewall «-t nat -A POSTROUTING -j MASQUERADE»

    Gracias por la ayuda!