Introducción
Iptables es una utilidad de línea de comandos de cortafuegos . Esto significa que es un software que le permite configurar un cortafuegos en su sistema. Normalmente está disponible por defecto en Linux sistemas. En esta guía, analizaremos algunas de las reglas y comandos comunes que acompañan al cortafuegos iptables. Cada vez que una conexión intente establecerse con su sistema, el cortafuegos consultará estas reglas para determinar cuál debe ser el siguiente paso.
Comandos de Iptables
Esta guía presentará algunos de los comandos de iptables más esenciales. Para seguir la guía, necesitará tener una comprensión básica de qué es iptables y cómo funciona. Le ayudará a comprender mejor las reglas que está implementando con los siguientes comandos. Recuerde que cualquiera de los comandos que se detallan a continuación se puede utilizar de forma aislada. Por otro lado, también puede combinarlos para adaptarlos a sus necesidades específicas.
Cosas a tener en cuenta
Antes de seguir leyendo, aquí hay algunas cosas que debe tener en cuenta:
- El orden de las reglas en iptables es importante.
- Para añadir una nueva regla al final de una cadena, su comando
iptablestendrá que utilizar la opción-A. - Si desea añadir la regla en otra posición, tiene que utilizar la opción
-I. Esta opción le permite especificar la ubicación exacta de la regla. Si desea colocar la regla al principio de la cadena, simplemente no proporcione un número de regla. - Para garantizar que tenga un acceso constante a su servidor, bloquee el tráfico SSH en el puerto 22 de forma predeterminada.
- En caso de que no lo haga y pierda el acceso a su servidor, puede volver a conectarse utilizando la consola. Permita el tráfico SSH para cambiar la configuración del cortafuegos.
- Si alguna vez desea revisar el conjunto de reglas actualmente activo, utilice los comandos
sudo iptables -S y sudo iptables -L.
Además, tenemos una guía detallada sobre cómo listar y eliminar reglas del cortafuegos iptables, que le ayudará aún más a aprovechar al máximo su cortafuegos iptables.
Ahora que hemos dejado de lado los requisitos previos, profundicemos en algunos de los comandos comunes de iptables:
Cómo guardar sus reglas
Comenzaremos determinando cómo puede guardar sus reglas. Es importante tener en cuenta que las reglas de iptables son efímeras. Esto significa que se perderán después de reiniciar el sistema, a menos que las guarde. A continuación, se explica cómo puede guardar manualmente sus nuevas reglas en el servidor Ubuntu y CentOS respectivamente:
-
Ubuntu
La forma más sencilla de guardar sus nuevas reglas en un servidor Ubuntu es utilizar el paquete iptables-persistent . Puede fácilmente crear un servidor Ubuntu siguiendo este tutorial.
Ahora, el primer paso para guardar sus nuevas reglas de iptables es instalar el paquete iptables-persistent utilizando apt-get. Así es como puede obtenerlo:
|
1 |
sudo apt-get install iptables-persistent |

Durante el proceso de instalación, debe decidir si desea guardar las reglas del cortafuegos actualmente activas. Para actualizar las reglas en su lugar y guardar los cambios, utilice este comando:
|
1 |
sudo netfilter-persistent save |

El comando anterior normalmente funciona para versiones de Ubuntu posteriores a la 16.04. Si está utilizando una versión anterior, use este comando en su lugar:
|
1 |
sudo invoke-rc.d iptables-persistent save |
-
CentOS
Puede configurar su cortafuegos con iptables en CentOS 6 o versiones anteriores. CentOS 7 utiliza FirewallD en su lugar. Siga este tutorial para aprender cómo configurar FirewallD en CentOS 7.
Puede guardar sus nuevas reglas en CentOS utilizando el script de inicio de iptables . Consulte el siguiente comando:
|
1 |
sudo service iptables save |
Este comando guardará sus nuevas reglas para el cortafuegos iptables. Las reglas de iptables actualmente activas se pueden encontrar en el /etc/sysconfig/iptables archivo.
Comandos útiles de iptables
Ahora, pasemos a algunos comandos muy útiles del cortafuegos iptables que puede necesitar utilizar en su servidor.
-
Conexiones loopback
Primero, exploraremos cómo puede permitir conexiones loopback. Su sistema utiliza una interfaz loopback para enviarse conexiones a sí mismo. Por ejemplo, imagine que ejecutó este comando: ping localhost o ping 127.0.0.1. Su servidor utilizará una interfaz de loopback, o una lo, para esencialmente hacer ping a sí mismo. Otras veces, el servidor puede usarla si su servidor de aplicaciones está configurado para conectarse a la dirección 'localhost'.
Independientemente de cuál sea la situación, debe asegurarse de que su cortafuegos iptables no bloquee estas conexiones. Por lo tanto, tendrá que permitir las conexiones de loopback para que estas funciones puedan llevarse a cabo.
Aquí están los comandos que ejecutará para permitir todo el tráfico que entra en la interfaz de loopback:
|
1 2 |
sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A OUTPUT -o lo -j ACCEPT |

-
Conexiones entrantes establecidas y relacionadas
Otro tipo de conexión que puede necesitar permitir es la conexión saliente. Para asegurarse de que su servidor esté recibiendo y enviando tanto tráfico entrante como saliente respectivamente, debe permitir las conexiones entrantes establecidas y relacionadas. Esto permite que el servidor envíe tráfico de retorno a las conexiones salientes. Use este comando para permitir conexiones entrantes tanto establecidas como relacionadas:
|
1 |
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
![]()
-
Conexiones salientes establecidas
El servidor normalmente enviará respuestas a las conexiones entrantes en forma de tráfico saliente de conexiones establecidas. Para permitir esto, use el siguiente comando:
|
1 |
sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT |
![]()
-
De interno a externo
A veces, es posible que incluso necesite configurar su cortafuegos para dar acceso de lo interno a lo externo. Por defecto, su red externa debería ser eth0 y eth1 debería ser su red interna. Si este es el caso, use este comando para habilitar el acceso:
|
1 |
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT |

-
Descartar paquetes no válidos
A veces, algunos de los paquetes de tráfico de red se etiquetarán como no válidos. La mayoría de las veces, simplemente puede descartar estos paquetes no válidos. Para hacerlo, use el siguiente comando:
|
1 |
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP |
Reglas para bloquear direcciones IP
A continuación, veremos algunos comandos que puede utilizar para bloquear conexiones procedentes de ciertas direcciones IP. Para facilitar las cosas, utilizaremos la dirección IP 15.15.15.51 como ejemplo en nuestros comandos. Puede sustituir este valor por su dirección IP específica.
|
1 |
sudo iptables -A INPUT -s 15.15.15.51 -j DROP |
En -s 15.15.15.51, el -s significa origen (source). Por lo tanto, el comando está especificando la dirección IP de origen '15.15.15.51'. De manera similar, puede especificar la dirección IP de origen en cualquier regla de cortafuegos. Esto incluye la regla de permitir y la de rechazar.
Si desea rechazar la conexión, utilizará REJECT en lugar de DROP en el comando de esta manera:
|
1 |
sudo iptables -A INPUT -s 15.15.15.51 -j REJECT |
Como resultado, su servidor dará un error de 'conexión rechazada' (connection refused) cada vez que esa dirección IP en particular envíe una solicitud de conexión.
-
Bloquear conexiones a una interfaz específica
Es posible que bloquee todas las solicitudes de conexión que provengan de una dirección IP en particular a una interfaz de red en particular. En nuestro ejemplo, la dirección IP es 15.15.15.51 y la interfaz de red es eth0. Use este comando para bloquear las conexiones:
|
1 |
iptables -A INPUT -i eth0 -s 15.15.15.51 -j DROP |
Lo fantástico es que puede especificar la interfaz de red en cualquier regla. Esto significa que cualquier regla se puede aplicar y limitar únicamente a una red específica.
Reglas para el servicio: SSH
SSH se vuelve relevante si está utilizando un servidor en la nube. En este caso, debe permitir las conexiones SSH entrantes en el puerto 22. Habilitar estas conexiones le permite conectarse a su servidor y administrarlo. Aquí, discutiremos una serie de reglas comunes relacionadas con SSH.
-
Permitir todas las conexiones SSH entrantes
Los siguientes comandos habilitan todas las conexiones SSH entrantes:
|
1 2 |
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
En el conjunto anterior, solo necesita usar el segundo comando si la política OUTPUT no está configurada como ACCEPT. Permite el tráfico saliente de las conexiones SSH establecidas.
-
Permitir SSH entrante desde una subred
El comando anterior permite todas las conexiones entrantes. Puede usar los siguientes comandos para permitir únicamente conexiones entrantes desde una dirección IP o subred específica. Supongamos que solo desea permitir conexiones entrantes de la subred 15.15.15.0/24 :
|
1 2 |
sudo iptables -A INPUT -p tcp -s 15.15.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
Al igual que antes, solo necesita usar el segundo comando si la política OUTPUT no está configurada como ACCEPT. Permite el tráfico saliente de las conexiones SSH establecidas.
-
Permitir SSH saliente
Use estos comandos si la política OUTPUT del firewall no está configurada como ACCEPT y desea habilitar las conexiones SSH. Esto permitirá que su servidor inicie conexiones SSH con otros servidores:
|
1 2 |
sudo iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A INPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
Para utilizar más a fondo SSH en sus servidores en la nube, eche un vistazo a nuestros tutoriales sobre cómo usar SSH para conectarse a un servidor remoto en Ubuntu y cómo configurar su servidor Linux para usar la autenticación basada en claves SSH.
-
Permitir Rsync entrante desde una subred
Rsync es una función que puede usar para transferir archivos de un sistema a otro. Se ejecuta en el puerto 873. Por lo tanto, si desea permitir conexiones Rsync entrantes en el puerto 873 desde una dirección IP o subred específica, use los siguientes comandos:
|
1 2 |
sudo iptables -A INPUT -p tcp -s 15.15.0/24 --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 873 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
Como puede ver, especificamos la dirección IP de origen junto con el puerto de destino. Utilizará el segundo comando solo si la política OUTPUT del firewall no está configurada como ACCEPT. Permite el tráfico saliente de las conexiones Rsync establecidas. Además, puede echar un vistazo a nuestro tutorial sobre cómo utilizar Rsync para sincronizar directorios locales y remotos en un VPS.
Reglas para el servicio: Servidor web
Las conexiones HTTP se reciben normalmente en el puerto 80. De manera similar, HTTPS suele llegar por el puerto 443. Los servidores web como Apache y Nginx escuchan en estos puertos para captar solicitudes de conexión. A veces, la configuración predeterminada puede hacer que su servidor deniegue o descarte estas solicitudes entrantes. Es por eso que necesitará establecer nuevas reglas para permitir el tráfico.
-
Permitir todas las conexiones HTTP entrantes
Puede permitir todas las conexiones HTTP entrantes en el puerto 80 con estos comandos:
|
1 2 |
sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
Utilizará el segundo comando solo si la política OUTPUT del firewall no está configurada como ACCEPT. Permite el tráfico saliente de las conexiones HTTP establecidas.
-
Permitir todas las conexiones HTTPS entrantes
Use estos comandos para permitir todas las solicitudes de conexión HTTPS entrantes en el puerto 443:
|
1 2 |
sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
Usará el segundo comando solo si la política del cortafuegos iptables OUTPUT no está configurada como ACCEPT. Permite el tráfico saliente de conexiones HTTP establecidas.
-
Permitir todas las conexiones entrantes de HTTP y HTTPS
Puede usar el módulo multiport si desea permitir el tráfico de los puertos HTTP y HTTPS. Use estos comandos si este es el caso:
|
1 2 |
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
Usará el segundo comando solo si la política del cortafuegos OUTPUT no está configurada como ACCEPT. Permite el tráfico saliente de conexiones HTTP y HTTPS establecidas.
Reglas para el servicio: MySQL
A veces, un cliente puede usar un servidor remoto para acceder a su servidor de base de datos MySQL. En ese caso, debe permitir manualmente el tráfico entrante desde el puerto correspondiente. MySQL escucha las solicitudes de conexión desde el puerto 3306.
-
Permitir conexiones MySQL entrantes desde una subred
Tendrá que especificar el origen si desea permitir conexiones MySQL desde una subred en particular. En nuestro ejemplo, permitiremos el tráfico entrante desde la 15.15.15.0/24 subred usando estos comandos:
|
1 2 |
sudo iptables -A INPUT -p tcp -s 15.15.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
Usará el segundo comando solo si la política del cortafuegos OUTPUT no está configurada como ACCEPT. Permite el tráfico saliente de conexiones MySQL establecidas.
-
Habilitar conexiones MySQL a una interfaz
Si también desea especificar qué interfaz de red debe recibir las conexiones MySQL, puede usar estos comandos:
|
1 2 |
sudo iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
En este caso, estamos permitiendo las conexiones a una interfaz de red privada llamada eth1.
Usará el segundo comando solo si la política del cortafuegos OUTPUT no está configurada como ACCEPT. Permite el tráfico saliente de conexiones MySQL establecidas.
Puede seguir nuestro tutorial para una configuración sencilla de MySQL en su servidor.
Reglas para el servicio: PostgreSQL
Su cliente puede usar un servidor remoto para acceder a su servidor de base de datos PostgreSQL. En ese caso, debe permitir estas conexiones entrantes. Estas conexiones vendrán a través del puerto 5432.
-
Permitir conexiones PostgreSQL entrantes desde una subred
Puede usar los siguientes comandos para permitir conexiones PostgreSQL entrantes desde una subred o dirección IP particular. Como puede ver, especificamos el origen que es la 15.15.15.0/24 subred.
|
1 2 |
sudo iptables -A INPUT -p tcp -s 15.15.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
Usará el segundo comando solo si la política del cortafuegos OUTPUT no está configurada como ACCEPT. Permite el tráfico saliente de las conexiones PostgreSQL establecidas.
-
Habilitar conexiones PostgreSQL a una interfaz específica
Si desea permitir únicamente conexiones PostgreSQL a una interfaz de red particular, use estos comandos:
|
1 2 |
sudo iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -o eth1 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
En este caso, estamos permitiendo las conexiones a una interfaz de red privada llamada eth1. Utilizará el segundo comando solo si la política del cortafuegos OUTPUT no está establecida en ACCEPT. Permite el tráfico saliente de las conexiones PostgreSQL establecidas.
Siga este tutorial para instalar PostgreSQL en su servidor Ubuntu.
Reglas para el servicio: Correo
Es posible que también deba configurar su cortafuegos de acuerdo con el servidor de correo que esté utilizando. Por ejemplo, Sendmail y Postfix pueden recibir conexiones en varios puertos diferentes. Depende del protocolo que utilice para la entrega de correo. Para bloquear y permitir ciertas conexiones de correo, necesita saber qué protocolo está utilizando.
-
Permitir conexiones SMTP entrantes
Las conexiones SMTP normalmente entran por el puerto 25. Aunque SMTP también suele utilizar el puerto 587 para el correo saliente. Para permitir que su servidor responda a estas conexiones, use los siguientes comandos:
|
1 2 |
sudo iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
Utilizará el segundo comando solo si la política del cortafuegos OUTPUT no está establecida en ACCEPT. Permite el tráfico saliente de las conexiones SMTP establecidas.
-
Permitir todas las conexiones IMAP entrantes
Para permitir que su servidor responda a todas las conexiones IMAP entrantes en el puerto 143, simplemente escriba y ejecute esto:
|
1 2 |
sudo iptables -A INPUT -p tcp --dport 143 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 143 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
Utilizará el segundo comando solo si la política del cortafuegos OUTPUT no está establecida en ACCEPT. Permite el tráfico saliente de las conexiones IMAP establecidas.
-
Permitir todas las conexiones IMAPS entrantes
Use estos comandos para permitir que su servidor responda a las conexiones IMAPS en el puerto 993:
|
1 2 |
sudo iptables -A INPUT -p tcp --dport 993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 993 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
Utilizará el segundo comando solo si la política del cortafuegos OUTPUT no está establecida en ACCEPT. Permite el tráfico saliente de las conexiones IMAPS establecidas.
-
Permitir todas las conexiones POP3 entrantes
Estas conexiones entrarán por el puerto 993. Si desea que su servidor responda a las solicitudes de conexión IMAPS, use los siguientes comandos:
|
1 2 |
sudo iptables -A INPUT -p tcp --dport 110 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 110 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
Utilizará el segundo comando solo si la política del cortafuegos OUTPUT no está establecida en ACCEPT. Permite el tráfico saliente de las conexiones POP3 establecidas.
-
Permitir todas las conexiones POP3S entrantes
Use estos comandos para permitir que su servidor establezca conexiones con solicitudes POP3S entrantes en el puerto 995:
|
1 2 |
sudo iptables -A INPUT -p tcp --dport 995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 995 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
Utilizará el segundo comando solo si la política del cortafuegos OUTPUT no está establecida en ACCEPT. Permite el tráfico saliente de las conexiones POP3S establecidas.
-
Cómo bloquear el correo SMTP saliente
En lugar de permitir conexiones entrantes y habilitar la respuesta del servidor, es posible que desee bloquear el correo saliente por completo. Puede bloquear todo el correo SMTP saliente en el puerto 25 usando este comando:
|
1 |
sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT |
Como resultado, todo el tráfico saliente en el puerto 25 será rechazado por el cortafuegos iptables. Puede utilizar la misma estructura de comandos si desea rechazar cualquier otro servicio. Todo lo que necesita hacer es reemplazar el puerto 25 con el número de puerto correspondiente.
Conclusión
Esta guía cubre los comandos esenciales del cortafuegos iptables. Le proporciona las herramientas esenciales que necesita para configurar su cortafuegos iptables de manera efectiva. Tenga en cuenta que no existe una solución única para todos. Estos comandos son extremadamente flexibles. Esto significa que puede usarlos de la manera que mejor se adapte a usted y a sus necesidades.
¡Feliz computación!

Comentarios
Aún no hay comentarios. Sea el primero.