Conceptos básicos de Iptables: reglas y comandos comunes de firewall

Introducción
Iptables es un firewall de software para distribuciones Linux. Esta guía, que parece una hoja de referencia, ofrece una referencia rápida de los comandos de iptables que crearán reglas de firewall útiles en situaciones cotidianas comunes. Incluye ejemplos de iptables para permitir y bloquear varios servicios por puerto, interfaz de red y dirección IP de origen.
Cómo utilizar esta guía
- La mayoría de las reglas que se describen aquí suponen que su iptables está configurado para ELIMINAR el tráfico entrante, a través de la política de entrada predeterminada, y desea permitir selectivamente el tráfico entrante.
- Utilice las secciones siguientes que sean aplicables a lo que está intentando lograr. La mayoría de las secciones no se basan en ninguna otra, por lo que puede utilizar los ejemplos a continuación de forma independiente.
- Utilice el menú Contenido en el lado derecho de esta página (en páginas amplias) o la función de búsqueda de su navegador para localizar las secciones que necesita.
- Copie y pegue los ejemplos de línea de comandos dados, sustituyendo los valores resaltados con los suyos propios.
Tenga en cuenta que el orden de las reglas es importante. Todos estos iptables
comandos utilizan la -A
opción de agregar la nueva regla al final de una cadena. Si desea colocarla en otro lugar de la cadena, puede utilizar la -I
opción que le permite especificar la posición de la nueva regla (o colocarla al principio de la cadena sin especificar un número de regla).
Nota: Cuando trabaje con firewalls, tenga cuidado de no bloquear el acceso a su propio servidor bloqueando el tráfico SSH (puerto 22, por defecto). Si pierde el acceso debido a la configuración de su firewall, es posible que deba conectarse a él a través de una consola basada en web para solucionar el problema. Si utiliza DigitalOcean, puede leer la documentación del producto de la Consola de recuperación para obtener más información. Una vez que se haya conectado a través de la consola, puede cambiar las reglas de su firewall para permitir el acceso SSH (o permitir todo el tráfico). Si las reglas de firewall guardadas permiten el acceso SSH, otro método es reiniciar su servidor.
Recuerde que puede comprobar su conjunto de reglas de iptables actual con sudo iptables -S
y sudo iptables -L
.
¡Echemos un vistazo a los comandos de iptables!
Reglas de ahorro
Las reglas de iptables son efímeras, lo que significa que deben guardarse manualmente para que persistan después de un reinicio.
En Ubuntu, una forma de guardar las reglas de iptables es usar el iptables-persistent
paquete. Instálelo con apt de la siguiente manera:
- sudo apt install iptables-persistent
Durante la instalación, se le preguntará si desea guardar las reglas de firewall actuales.
Si actualiza las reglas de su firewall y desea guardar los cambios, ejecute este comando:
- sudo netfilter-persistent save
Es posible que otras distribuciones de Linux tengan formas alternativas de hacer que los cambios en iptables sean permanentes. Consulte la documentación correspondiente para obtener más información.
Reglas de listado y eliminación
Si desea aprender cómo enumerar y eliminar reglas de iptables, consulte este tutorial: Cómo enumerar y eliminar reglas de firewall de iptables .
Reglas de utilidad general
Esta sección incluye una variedad de comandos de iptables que crearán reglas que generalmente son útiles en la mayoría de los servidores.
Permitir conexiones de bucle invertido
La interfaz de bucle invertido , también conocida como lo
, es lo que utiliza una computadora para reenviar conexiones de red hacia sí misma. Por ejemplo, si ejecuta ping localhost
o ping 127.0.0.1
, su servidor se hará ping a sí mismo utilizando el bucle invertido. La interfaz de bucle invertido también se utiliza si configura su servidor de aplicaciones para conectarse a un servidor de base de datos con una localhost
dirección. Por lo tanto, querrá asegurarse de que su firewall permita estas conexiones.
Para aceptar todo el tráfico en su interfaz de bucle invertido, ejecute estos comandos:
- sudo iptables -A INPUT -i lo -j ACCEPT
- sudo iptables -A OUTPUT -o lo -j ACCEPT
Permitir conexiones entrantes establecidas y relacionadas
Como el tráfico de red generalmente debe ser bidireccional (entrante y saliente) para funcionar correctamente, es habitual crear una regla de firewall que permita el tráfico entrante establecido y relacionado , de modo que el servidor permita el tráfico de retorno para las conexiones salientes iniciadas por el propio servidor. Este comando permitirá que:
- sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Permitir conexiones salientes establecidas
Es posible que desee permitir el tráfico saliente de todas las conexiones establecidas , que suelen ser la respuesta a las conexiones entrantes legítimas. Este comando permitirá que:
- sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
Permitir que la red interna acceda a la red externa
Suponiendo eth0
que su red es externa y eth1
es su red interna, esto permitirá que su red interna acceda a la externa:
- sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
Descartar paquetes no válidos
Algunos paquetes de tráfico de red se marcan como no válidos . A veces puede ser útil registrar este tipo de paquetes, pero a menudo no hay problema en descartarlos. Para ello, utilice este comando:
- sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
Bloquear una dirección IP
Para bloquear conexiones de red que se originan desde una dirección IP específica, 203.0.113.51
por ejemplo, ejecute este comando:
- sudo iptables -A INPUT -s 203.0.113.51 -j DROP
En este ejemplo, -s 203.0.113.51
se especifica una dirección IP de origen “203.0.113.51”. La dirección IP de origen se puede especificar en cualquier regla de firewall, incluida una regla de permiso .
Si, en cambio, desea rechazar la conexión, lo que responderá a la solicitud de conexión con un error de “conexión rechazada”, reemplace “DROP” por “REJECT” de la siguiente manera:
- sudo iptables -A INPUT -s 203.0.113.51 -j REJECT
Bloqueo de conexiones a una interfaz de red
Para bloquear conexiones desde una dirección IP específica, por ejemplo 203.0.113.51
, a una interfaz de red específica, por ejemplo eth0
, utilice este comando:
- iptables -A INPUT -i eth0 -s 203.0.113.51 -j DROP
Este es el mismo ejemplo anterior, con el agregado de -i eth0
. La interfaz de red se puede especificar en cualquier regla de firewall y es una excelente manera de limitar la regla a una red en particular.
Servicio: SSH
Si utiliza un servidor sin una consola local, probablemente desee permitir conexiones SSH entrantes (puerto 22) para poder conectarse a su servidor y administrarlo. Esta sección explica cómo configurar su firewall con varias reglas relacionadas con SSH.
Permitir todas las conexiones SSH entrantes
Para permitir todas las conexiones SSH entrantes, ejecute estos comandos:
- 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
El segundo comando, que permite el tráfico saliente de conexiones SSH establecidasOUTPUT
, solo es necesario si la política no está configurada en ACCEPT
.
Permitir SSH entrante desde una dirección IP o subred específica
Para permitir conexiones SSH entrantes desde una dirección IP o subred específica, especifique la fuente. Por ejemplo, si desea permitir toda la 203.0.113.0/24
subred, ejecute estos comandos:
- sudo iptables -A INPUT -p tcp -s 203.0.113.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
El segundo comando, que permite el tráfico saliente de conexiones SSH establecidasOUTPUT
, solo es necesario si la política no está configurada en ACCEPT
.
Permitir SSH saliente
Si su OUTPUT
política de firewall no está configurada en ACCEPT
y desea permitir conexiones SSH salientes (su servidor inicia una conexión SSH a otro servidor), puede ejecutar estos comandos:
- 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
Permitir Rsync entrante desde una dirección IP o subred específica
Rsync, que se ejecuta en el puerto 873, se puede utilizar para transferir archivos de una computadora a otra.
Para permitir conexiones rsync entrantes desde una dirección IP o subred específica, especifique la dirección IP de origen y el puerto de destino. Por ejemplo, si desea permitir que toda la 203.0.113.0/24
subred pueda realizar conexiones rsync con su servidor, ejecute estos comandos:
- sudo iptables -A INPUT -p tcp -s 203.0.113.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
El segundo comando, que permite el tráfico saliente de conexiones rsync establecidasOUTPUT
, solo es necesario si la política no está configurada en ACCEPT
.
Servicio: Servidor Web
Los servidores web, como Apache y Nginx, suelen escuchar solicitudes en los puertos 80 y 443 para conexiones HTTP y HTTPS, respectivamente. Si su política predeterminada para el tráfico entrante está configurada para descartar o denegar, deberá crear reglas que permitan que su servidor responda a esas solicitudes.
Permitir todos los HTTP entrantes
Para permitir todas las conexiones HTTP entrantes (puerto 80), ejecute estos comandos:
- 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
El segundo comando, que permite el tráfico saliente de conexiones HTTP establecidas , solo es necesario si la OUTPUT
política no está configurada en ACCEPT
.
Permitir todos los HTTPS entrantes
Para permitir todas las conexiones entrantes HTTPS (puerto 443), ejecute estos comandos:
- 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
El segundo comando, que permite el tráfico saliente de conexiones HTTP establecidas , solo es necesario si la OUTPUT
política no está configurada en ACCEPT
.
Permitir todos los HTTP y HTTPS entrantes
Si desea permitir el tráfico HTTP y HTTPS, puede utilizar el módulo multipuerto para crear una regla que permita ambos puertos. Para permitir todas las conexiones entrantes HTTP y HTTPS (puerto 443), ejecute estos comandos:
- 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
El segundo comando, que permite el tráfico saliente de conexiones HTTP y HTTPS establecidasOUTPUT
, solo es necesario si la política no está configurada en ACCEPT
.
Servicio: MySQL
MySQL escucha conexiones de clientes en el puerto 3306. Si su servidor de base de datos MySQL está siendo utilizado por un cliente en un servidor remoto, debe asegurarse de permitir ese tráfico.
Permitir MySQL desde una dirección IP o subred específica
Para permitir conexiones MySQL entrantes desde una dirección IP o subred específica, especifique la fuente. Por ejemplo, si desea permitir toda la 203.0.113.0/24
subred, ejecute estos comandos:
- sudo iptables -A INPUT -p tcp -s 203.0.113.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
El segundo comando, que permite el tráfico saliente de conexiones MySQL establecidasOUTPUT
, solo es necesario si la política no está configurada en ACCEPT
.
Permitir el acceso a MySQL a una interfaz de red específica
Para permitir conexiones MySQL a una interfaz de red específica (por ejemplo, si tiene una interfaz de red privada eth1
), utilice estos comandos:
- 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
El segundo comando, que permite el tráfico saliente de conexiones MySQL establecidasOUTPUT
, solo es necesario si la política no está configurada en ACCEPT
.
Servicio: PostgreSQL
PostgreSQL escucha conexiones de clientes en el puerto 5432. Si su servidor de base de datos PostgreSQL está siendo utilizado por un cliente en un servidor remoto, debe asegurarse de permitir ese tráfico.
PostgreSQL desde una dirección IP o subred específica
Para permitir conexiones entrantes de PostgreSQL desde una dirección IP o subred específicas, especifique la fuente. Por ejemplo, si desea permitir toda la 203.0.113.0/24
subred, ejecute estos comandos:
- sudo iptables -A INPUT -p tcp -s 203.0.113.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
El segundo comando, que permite el tráfico saliente de conexiones PostgreSQL establecidasOUTPUT
, solo es necesario si la política no está configurada en ACCEPT
.
Permitir PostgreSQL en una interfaz de red específica
Para permitir conexiones PostgreSQL a una interfaz de red específica (por ejemplo, si tiene una interfaz de red privada eth1
), utilice estos comandos:
- 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
El segundo comando, que permite el tráfico saliente de conexiones PostgreSQL establecidasOUTPUT
, solo es necesario si la política no está configurada en ACCEPT
.
Servicio: Correo
Los servidores de correo, como Sendmail y Postfix, escuchan en distintos puertos según los protocolos que se utilicen para la entrega de correo. Si utiliza un servidor de correo, determine qué protocolos está utilizando y permita los tipos de tráfico adecuados. También le mostraremos cómo crear una regla para bloquear el correo SMTP saliente.
Bloqueo de correo SMTP saliente
Si su servidor no debería enviar correo saliente, es posible que desee bloquear ese tipo de tráfico. Para bloquear el correo SMTP saliente, que utiliza el puerto 25, ejecute este comando:
- sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT
Esto configura iptables para rechazar todo el tráfico saliente en el puerto 25. Si necesita rechazar un servicio diferente por su número de puerto, en lugar del puerto 25, sustituya ese número de puerto por el 25
anterior.
Permitir todos los SMTP entrantes
Para permitir que su servidor responda a las conexiones SMTP en el puerto 25, ejecute estos comandos:
- 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
El segundo comando, que permite el tráfico saliente de conexiones SMTP establecidasOUTPUT
, solo es necesario si la política no está configurada en ACCEPT
.
Permitir todos los IMAP entrantes
Para permitir que su servidor responda a las conexiones IMAP, puerto 143, ejecute estos comandos:
- 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
El segundo comando, que permite el tráfico saliente de conexiones IMAP establecidas , solo es necesario si la OUTPUT
política no está configurada en ACCEPT
.
Permitir todos los IMAPS entrantes
Para permitir que su servidor responda a las conexiones IMAPS, puerto 993, ejecute estos comandos:
- 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
El segundo comando, que permite el tráfico saliente de conexiones IMAPS establecidas , solo es necesario si la OUTPUT
política no está configurada en ACCEPT
.
Permitir todos los POP3 entrantes
Para permitir que su servidor responda a las conexiones POP3, puerto 110, ejecute estos comandos:
- 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
El segundo comando, que permite el tráfico saliente de conexiones POP3 establecidasOUTPUT
, solo es necesario si la política no está configurada en ACCEPT
.
Permitir todos los POP3 entrantes
Para permitir que su servidor responda a las conexiones POP3S, puerto 995, ejecute estos comandos:
- 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
El segundo comando, que permite el tráfico saliente de conexiones POP3S establecidas , solo es necesario si la OUTPUT
política no está configurada en ACCEPT
.
Conclusión
Esto debería cubrir muchos de los comandos que se usan comúnmente al configurar un firewall de iptables. Por supuesto, iptables es una herramienta muy flexible, así que siéntete libre de combinar los comandos con diferentes opciones para satisfacer tus necesidades específicas si no están cubiertas aquí.
Si busca ayuda para determinar cómo debe configurarse su firewall, consulte este tutorial: Cómo elegir una política de firewall eficaz para proteger sus servidores .
Deja una respuesta