Volver al blog

Redirección de puertos con Iptables en Linux: una guía práctica

Redirección de puertos con Iptables en Linux: una guía práctica

Redirección de puertos, también conocido como mapeo de puertos, es un método para permitir que dispositivos remotos se conecten a un servicio específico dentro de su red de área local (LAN) privada. Como su nombre indica, el proceso implica redirigir solicitudes de un puerto específico a otro puerto o red. Modifica el destino del paquete en tránsito y se considera un tipo de operación de traducción de direcciones de red (NAT).

Habilitar la redirección de puertos permite que aquellos dispositivos o hosts que no están conectados a la red interna se comuniquen entre sí, lo cual de otro modo estaría restringido si estuviera deshabilitado. Puede aprovechar los beneficios de la redirección de puertos para bloquear sitios web de destino, mejorar la seguridad y añadir un desvío alrededor del firewall NAT según su conveniencia.

En este tutorial, le guiaremos a través de los pasos para redirigir puertos con iptables en Linux.

Requisitos previos

Para seguir este tutorial, necesitará:

Detalles del host

Primero, necesitamos conocer los detalles de las interfaces y direcciones de los servidores de trabajo. Comprobemos las interfaces de red de nuestro sistema:

Verá la salida:

Aquí, la salida resaltada muestra dos interfaces, la primera eth0 asignada a la dirección 192.51.100.45, y la segunda eth1 asignada a la dirección 192.168.1.5. De estas dos interfaces, una es pública y la otra es privada. Ejecutaremos un comando para distinguir entre las dos y averiguar cuál es la interfaz pública, la que está conectada a su puerta de enlace predeterminada. Para distinguirlas, escriba:

Verá la salida:

Datos ficticios para el tutorial

Utilizaremos direcciones e interfaces ficticias a lo largo de este tutorial. Es libre de utilizar estos datos o reemplazarlos, según su conveniencia.

Detalles de red del servidor web:

  • Dirección IP pública: 203.0.113.2

  • Dirección IP privada: 192.0.2.2

  • Interfaz pública: eth0

  • Interfaz privada: eth1

Detalles de red del firewall:

  • Dirección IP pública: 203.0.113.15

  • Dirección IP privada: 192.0.2.15

  • Interfaz pública: eth0

  • Interfaz privada: eth1

Configuración del servidor web

Comencemos con nuestro host de servidor web. Primero, inicie sesión con su sudo usuario.

Instalar Nginx

Primero, instalaremos Nginx en nuestro host de servidor web y lo bloquearemos para que solo escuche en su interfaz privada. Esto permitirá que nuestro servidor web solo esté disponible si hemos configurado la redirección de puertos de manera correcta.

A continuación, actualice la caché de paquetes locales y use apt para descargar e instalar Nginx:

Añadir restricciones

Una vez que hayamos instalado Nginx en nuestro host de servidor web, lo bloquearemos para asegurarnos de que acepte entradas de interfaces privadas y de ningún otro lugar. Además, esto garantizará que nuestros servidores web solo estén activos si la configuración de redirección de puertos es correcta.

Para añadir restricciones, abra el archivo de configuración del bloque de servidor predeterminado /etc/nginx/sites-enabled/default en cualquier editor de texto de su elección (aquí estamos usando el editor de texto nano), y escriba:

En la salida, verá que la directiva listen aparece dos veces:

Port Forwarding Nginx Default File

En este tutorial, estamos usando la primera directiva para demostrar el reenvío de IPv4. La segunda, que está configurada para IPv6, se puede eliminar. Agregue la dirección IP privada de su servidor web con dos puntos justo antes del 80 para informar a Nginx que acepte entradas solo desde la interfaz privada. A continuación, edite la directiva:

Port Forwarding Nginx Edited Default File

Una vez hecho esto, guarde y cierre el archivo. Antes de continuar, asegúrese de que no haya errores de sintaxis. Probemos el archivo:

Nginx T

Si no ve ningún error en pantalla, ya puede reiniciar Nginx y habilitar la nueva configuración:

Verificación de la restricción de red

Verifiquemos el nivel de acceso que tenemos a nuestro servidor web. Intente acceder al servidor web utilizando la interfaz privada mediante el curl comando:

Verá la salida:

Port Forwarding Nginx Output1

Si intentamos usar la interfaz pública, no podremos conectarnos:

Esto es exactamente lo que esperábamos.

Configurar el cortafuegos para reenviar el puerto 80

Avancemos en nuestro trabajo implementando el reenvío de puertos en nuestra máquina de cortafuegos.

Habilitar el reenvío en el kernel

Por defecto, la mayoría de los sistemas tienen el reenvío de puertos desactivado (OFF). Realizaremos cambios para activar (ON) el reenvío de puertos haciendo algunas ediciones. Además, existe la opción de activar el reenvío de puertos de forma permanente utilizando los privilegios sudo como se muestra en los siguientes pasos.

Para activar el reenvío de tráfico a nivel de kernel, escriba:

Para activar el reenvío de puertos de forma permanente, edite el archivo /etc/sysctl.conf . Abra el archivo con privilegios sudo y escriba:

En el interior, busque y descomente la línea que se ve así:

Una vez hecho esto, guarde y cierre el archivo. Luego, use los comandos sysctl para aplicar los cambios en la configuración para que sea más efectiva:

Configuración básica del cortafuegos

Primero, revise la guía sobre cómo configurar un cortafuegos básico en su máquina. Al finalizar, tendrá:

  • Instalado iptables-persistent
  • Guardado el conjunto de reglas predeterminado en /etc/iptables/rules.v4
  • Conocimiento exhaustivo sobre cómo agregar y modificar reglas utilizando el iptables comando

También puede consultar cómo listar y eliminar reglas del cortafuegos iptables.

Agregar las reglas de reenvío

Configuraremos nuestro cortafuegos para asegurar que el tráfico que ingresa a nuestra interfaz pública ( eth0 ) en el puerto 80 se reenvíe a nuestra interfaz privada ( eth1). Por defecto, nuestro cortafuegos básico tiene una cadena FORWARD establecida en DROP el tráfico. Agregar reglas de cortafuegos permitirá reenviar conexiones a nuestro servidor web. Para mayor seguridad, bloquearemos las reglas del cortafuegos para permitir solicitudes de reenvío.

En la cadena FORWARD , aceptaremos nuevas conexiones destinadas al puerto 80 que provengan de nuestra interfaz pública y se dirijan a nuestra interfaz privada. Identificaremos las nuevas conexiones con la ayuda de la extensión conntrack y las representaremos mediante un paquete TCP SYN :

Debe permitir cualquier tráfico posterior en ambas direcciones resultante de la conexión entrante. Escriba los comandos a continuación para permitir el tráfico ESTABLISHED y RELATED entre nuestras interfaces pública y privada:

Verifiquemos si nuestra política en la cadena FORWARD está configurada como DROP:

Hasta ahora, hemos agregado algunas reglas que permiten que el tráfico entre nuestras interfaces pública y privada pase a través de nuestro firewall. Sin embargo, iptables aún no está informado para dirigir el tráfico porque la configuración de las reglas del firewall aún no se ha realizado. En los siguientes pasos, agregaremos las reglas NAT y ajustaremos el conjunto de reglas permanentes para dirigir el tráfico.

Cómo agregar las reglas NAT para dirigir paquetes

Realizaremos dos operaciones separadas para que iptables altere correctamente los paquetes y agilice la comunicación con los clientes y el servidor web.

DNAT es la primera operación que comienza la cadena PREROUTING de la tabla nat La operación altera la dirección de destino del paquete y permite que se enrute correctamente a medida que pasa entre redes. Sin embargo, los clientes en la red pública se conectarán a nuestro servidor de firewall y no tendrán información sobre la topología de nuestra red privada. Para pasar información con la red privada, cambie la dirección de destino de cada paquete para permitir que llegue correctamente a nuestro servidor web de destino.

Es crucial tener en cuenta que nos estamos enfocando en configurar el reenvío de puertos. Realizar NAT en cada paquete que llega al firewall no es parte de nuestro tutorial. Haremos coincidir los paquetes en el puerto 80 con la dirección IP privada de nuestro servidor web:

El paquete se enrutará correctamente a nuestro servidor web conteniendo la dirección original del cliente como dirección de origen. A pesar de los intentos realizados por el servidor para enviar la respuesta directamente a esa dirección, no habrá posibilidad de establecer una conexión TCP legítima.

Para configurar un enrutamiento adecuado, modificaremos la dirección de origen del paquete. Editemos la dirección de origen a la dirección IP privada de nuestro servidor de firewall. Después de la modificación, la respuesta se enviará de vuelta al firewall, que la reenviará al cliente.

Para habilitar esta funcionalidad, agregue una regla a la cadena POSTROUTING de la tabla nat evaluada justo antes de que los paquetes se envíen a la red. Luego, haga coincidir los paquetes destinados a nuestro servidor web por dirección IP y puerto:

Una vez que esta regla esté en su lugar, nuestro servidor web debería ser accesible apuntando nuestro navegador web a la dirección pública de nuestra máquina de firewall:

Verá la salida:

Nginx Output2

Nuestra configuración de reenvío de puertos está completa.

Ajustar el conjunto de reglas permanentes

Después de completar la configuración del reenvío de puertos, guardaremos esto en nuestro conjunto de reglas permanentes. Si desea mantener los comentarios en el conjunto de reglas actual, use el servicio iptables-persistent para guardar sus reglas:

También puede abrirlo y editarlo manualmente para mantener los comentarios en su archivo:

A continuación, configure la tabla filter y la tabla nat para agregar las reglas de la cadena FORWARD y las reglas de ROUTING respectivamente. Ajustar la tabla nat nos permitirá agregar reglas PREROUTING y POSTROUTING como se muestra en el ejemplo a continuación:

Después de agregar los valores anteriores, guarde y cierre el archivo. A continuación, escriba el siguiente comando para probar la sintaxis de sus reglas:

Si no ve errores, cargue el conjunto de reglas:

Verifiquemos que nuestro servidor web siga siendo accesible a través de la dirección IP pública de su firewall:

Conclusión

Al final de este tutorial, debería sentirse cómodo reenviando puertos en un servidor Linux con iptables. Puede aprovechar las capacidades de reenvío de puertos para ocultar la topología de su red privada mientras optimiza el tráfico de servicios para que fluya libremente a través de su máquina de firewall de puerta de enlace.

Dado que el proceso depende explícitamente de la seguridad de su red y de los puertos utilizados, es seguro. Puede haber una posibilidad de riesgo si no tiene un firewall de seguridad o seguridad VPN en su red. Por lo tanto, es recomendable configurar el firewall como se describe en este tutorial. Esperamos que esta guía le ayude a mantenerse seguro en Internet al utilizar su red privada.

Para explorar más soluciones de firewall que puede implementar en su sistema, consulte estos recursos de nuestro blog:

¡Feliz computación!

author

Pranay Kapgate

Autor · CloudSigma

Preslav Dobrev es diseñador creativo en CloudSigma, centrado en una identidad empresarial coherente mediante el uso de canales de marketing tradicionales e innovadores. Es experto en fusionar la visión artística con el marketing estratégico para crear narrativas de marca impactantes.

Comentarios

Aún no hay comentarios. Sea el primero.