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á:
- Ubuntu instalado en su sistema.
- Dos hosts Ubuntu 20.04 en el mismo centro de datos con redes privadas habilitadas.
- Cuenta de usuario no raíz configurada con privilegios sudo en cada máquina.
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:
|
1 |
ip -4 addr show scope global |
Verá la salida:
|
1 2 3 4 5 6 7 8 9 |
Ejemplo de salida 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 198.51.100.45/18 brd 45.55.191.255 scope global eth0 valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 192.168.1.5/16 brd 10.132.255.255 scope global eth1 valid_lft forever preferred_lft forever |
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:
|
1 |
ip route show | grep default= |
Verá la salida:
|
1 2 3 |
Salida: ip route show | grep default |
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:
|
1 |
sudo apt-get update |
|
1 |
sudo apt-get install 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:
|
1 |
sudo nano /etc/nginx/sites-enabled/default |
En la salida, verá que la directiva listen aparece dos veces:

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:

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

Si no ve ningún error en pantalla, ya puede reiniciar Nginx y habilitar la nueva configuración:
|
1 |
sudo service nginx restart |
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:
|
1 |
curl --connect-timeout 5 192.0.2.2 |
Verá la salida:

Si intentamos usar la interfaz pública, no podremos conectarnos:
|
1 |
curl --connect-timeout 5 203.0.113.2 |
|
1 |
curl: (7) No se pudo a conectar a 203.0.113.2 puerto 80: Conexión rechazada |
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:
|
1 |
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward |
Para activar el reenvío de puertos de forma permanente, edite el archivo /etc/sysctl.conf . Abra el archivo con privilegios sudo y escriba:
|
1 |
sudo nano /etc/sysctl.conf |
En el interior, busque y descomente la línea que se ve así:
|
1 |
net.ipv4.ip_forward=1 |
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:
|
1 |
sudo sysctl -p |
|
1 |
sudo sysctl --system |
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 :
|
1 |
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT |
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:
|
1 |
iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
|
1 |
iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
Verifiquemos si nuestra política en la cadena FORWARD está configurada como DROP:
|
1 |
sudo iptables -P FORWARD 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:
|
1 |
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2 |
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:
|
1 |
sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -d 192.0.2.2 -j SNAT --to-source 192.0.2.15 |
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:
|
1 |
curl 203.0.113.15 |
Verá la salida:

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:
|
1 |
sudo service iptables-persistent save |
También puede abrirlo y editarlo manualmente para mantener los comentarios en su archivo:
|
1 |
sudo nano /etc/iptables/rules.v4 |
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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
/etc/iptables/rules.v4 *filter # Permitir todo el tráfico saliente, pero descartar los paquetes entrantes y de reenvío por defecto :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] # Cadenas personalizadas por protocolo :UDP - [0:0] :TCP - [0:0] :ICMP - [0:0] # Tráfico UDP aceptable # Tráfico TCP aceptable -A TCP -p tcp --dport 22 -j ACCEPT # Tráfico ICMP aceptable # Política de aceptación estándar -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A INPUT -i lo -j ACCEPT # Descartar paquetes no válidos -A INPUT -m conntrack --ctstate INVALID -j DROP # Pasar el tráfico a cadenas específicas del protocolo ## Solo permitir conexiones nuevas (las establecidas y relacionadas ya deberían estar gestionadas) ## Para TCP, además solo permitir nuevos paquetes SYN, ya que es el único método ## válido para establecer una nueva conexión TCP -A INPUT -p udp -m conntrack --ctstate NEW -j UDP -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP -A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP # Rechazar cualquier cosa que haya llegado hasta este punto ## Intentar ser específico con el protocolo en el mensaje de rechazo -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable -A INPUT -p tcp -j REJECT --reject-with tcp-reset -A INPUT -j REJECT --reject-with icmp-proto-unreachable # Reglas para redirigir el puerto 80 a nuestro servidor web # 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 -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Fin de las reglas de filtrado de reenvío (Forward) # Aplicar los cambios COMMIT *raw :PREROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] # Reglas para traducir solicitudes para el puerto 80 de la interfaz pública # para que podamos redirigir correctamente al servidor web usando la # interfaz privada. # 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 -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2 -A POSTROUTING -d 192.0.2.2 -o eth1 -p tcp --dport 80 -j SNAT --to-source 192.0.2.15 # Fin de las traducciones NAT para el tráfico del servidor web COMMIT *security :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT |
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:
|
1 |
sudo iptables-restore -t < /etc/iptables/rules.v4 |
Si no ve errores, cargue el conjunto de reglas:
|
1 |
sudo service iptables-persistent reload |
Verifiquemos que nuestro servidor web siga siendo accesible a través de la dirección IP pública de su firewall:
|
1 |
curl 203.0.113.15 |
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:
- Configuración de un firewall con UFW en Ubuntu 18.04
- Configuración de un firewall con FirewallD en CentOS 7
- Conceptos básicos de UFW: Aprendiendo los comandos esenciales del firewall
¡Feliz computación!
Comentarios
Aún no hay comentarios. Sea el primero.