Introducción
Iptables es un firewall de software para distribuciones de Linux. Esta guía en formato de hoja de trucos proporciona una referencia rápida a los comandos de iptables que crearán reglas de firewall útiles en escenarios comunes y cotidianos. Esto incluye ejemplos de iptables que permiten y bloquean varios servicios por puerto, interfaz de red y dirección IP de origen.
Cómo Usar Esta Guía
- La mayoría de las reglas que se describen aquí asumen que su iptables está configurado para DROP el tráfico entrante, a través de la política de entrada predeterminada, y que desea permitir selectivamente el tráfico entrante
- Utilice las secciones subsiguientes 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ú de Contenidos en el lado derecho de esta página (en anchos de página amplios) 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 comando dados, sustituyendo los valores resaltados por los suyos propios
Tenga en cuenta que el orden de sus reglas importa. Todos estos comandos de iptables
utilizan la opción -A
para agregar la nueva regla al final de una cadena. Si desea colocarlo en otro lugar de la cadena, puede utilizar la opción -I
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 bloquearse a sí mismo fuera de su propio servidor al bloquear el tráfico SSH (puerto 22, por defecto). Si pierde el acceso debido a la configuración de su firewall, es posible que necesite conectarse a través de una consola basada en web para solucionar su acceso. Si está utilizando DigitalOcean, puede leer nuestra documentación del producto de Consola de Recuperación para obtener más información. Una vez que esté 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 sus reglas de firewall guardadas permiten el acceso SSH, otro método es reiniciar su servidor.
Recuerde que puede verificar su conjunto actual de reglas iptables con sudo iptables -S
y sudo iptables -L
.
¡Veamos los comandos iptables!
Guardando Reglas
Las reglas de iptables son efímeras, lo que significa que deben ser guardadas manualmente para que persistan después de un reinicio.
En Ubuntu, una forma de guardar las reglas de iptables es usar el paquete iptables-persistent
. Instálelo con apt de esta manera:
Durante la instalación, se le preguntará si desea guardar sus reglas de firewall actuales.
Si actualiza sus reglas de firewall y desea guardar los cambios, ejecute este comando:
Otras distribuciones de Linux pueden tener formas alternativas de hacer permanentes los cambios en tus reglas iptables. Consulta la documentación relevante para obtener más información.
Enumeración y Eliminación de Reglas
Si quieres aprender cómo enumerar y eliminar reglas iptables, consulta este tutorial: Cómo Enumerar y Eliminar Reglas de Firewall de Iptables.
Reglas Generalmente Útiles
Esta sección incluye una variedad de comandos iptables que crearán reglas generalmente útiles en la mayoría de los servidores.
Permitir Conexiones de Bucle Local
La interfaz loopback, también conocida como lo
, es lo que utiliza una computadora para reenviar conexiones de red a sí misma. Por ejemplo, si ejecutas ping localhost
o ping 127.0.0.1
, tu servidor hará ping a sí mismo utilizando la loopback. La interfaz loopback también se utiliza si configuras tu servidor de aplicaciones para que se conecte a un servidor de base de datos con una dirección localhost
. Por lo tanto, querrás asegurarte de que tu firewall esté permitiendo estas conexiones.
Para aceptar todo el tráfico en tu interfaz loopback, ejecuta estos comandos:
Permitir conexiones entrantes establecidas y relacionadas
Como el tráfico de red generalmente necesita ser bidireccional, tanto entrante como saliente, para funcionar correctamente, es típico crear una regla de firewall que permita el tráfico entrante establecido y relacionado, para que el servidor permita el tráfico de retorno para las conexiones salientes iniciadas por el servidor mismo. Este comando permitirá eso:
Permitir conexiones salientes establecidas
Es posible que desees permitir el tráfico saliente de todas las conexiones establecidas, que suelen ser la respuesta a conexiones entrantes legítimas. Este comando lo permitirá:
Permitir que la Red Interna acceda a la Externa
Suponiendo que eth0
es tu red externa, y eth1
es tu red interna, esto permitirá que tu red interna acceda a la externa:
Descartar Paquetes Inválidos
Algunos paquetes de tráfico de red se marcan como inválidos. A veces puede ser útil registrar este tipo de paquetes, pero a menudo está bien descartarlos. Hazlo con este comando:
Bloquear una Dirección IP
Para bloquear conexiones de red que provienen de una dirección IP específica, por ejemplo, 203.0.113.51
, ejecuta este comando:
En este ejemplo, -s 203.0.113.51
especifica una dirección IP de origen de “203.0.113.51”. La dirección IP de origen se puede especificar en cualquier regla de firewall, incluida una regla de permitir.
Si desea rechazar la conexión en su lugar, lo que responderá a la solicitud de conexión con un error de “conexión rechazada”, reemplace “DROP” con “REJECT” así:
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
, use este comando:
Esto es lo mismo que el ejemplo anterior, con la adición 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 particular.
Servicio: SSH
Si está utilizando un servidor sin una consola local, probablemente desee permitir conexiones entrantes de SSH (puerto 22) para poder conectarse y administrar su servidor. Esta sección cubre cómo configurar su firewall con varias reglas relacionadas con SSH.
Permitir todas las conexiones entrantes de SSH
Para permitir todas las conexiones entrantes de SSH, ejecute estos comandos:
El segundo comando, que permite el tráfico saliente de las conexiones SSH establecidas, solo es necesario si la política de OUTPUT
no está establecida en ACCEPT
.
Permitir conexiones entrantes de SSH desde una dirección IP o subred específica
Para permitir conexiones entrantes de SSH desde una dirección IP o subred específica, especifique la fuente. Por ejemplo, si desea permitir toda la subred 203.0.113.0/24
, ejecute estos comandos:
El segundo comando, que permite el tráfico saliente de las conexiones SSH establecidas, solo es necesario si la política de OUTPUT
no está establecida en ACCEPT
.
Permitir SSH saliente
Si la política de salida de tu firewall no está establecida en ACEPTAR y deseas permitir conexiones salientes de SSH, es decir, que tu servidor inicie una conexión SSH a otro servidor, puedes ejecutar estos comandos:
Permitir la entrada de Rsync 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 entrantes de rsync desde una dirección IP o subred específica, especifica la dirección IP de origen y el puerto de destino. Por ejemplo, si deseas permitir que toda la subred 203.0.113.0/24
pueda rsync a tu servidor, ejecuta estos comandos:
El segundo comando, que permite el tráfico saliente de conexiones rsync establecidas, solo es necesario si la política de SALIDA
no está establecida en ACEPTAR
.
Servicio: Servidor web
Los servidores web, como Apache y Nginx, suelen escuchar solicitudes en el puerto 80 y 443 para conexiones HTTP y HTTPS, respectivamente. Si tu política predeterminada para el tráfico entrante está establecida en rechazar o denegar, querrás crear reglas que permitan que tu servidor responda a esas solicitudes.
Permitir todas las conexiones entrantes HTTP
Para permitir todas las conexiones entrantes HTTP (puerto 80), ejecute estos comandos:
El segundo comando, que permite el tráfico saliente de las conexiones HTTP establecidas, solo es necesario si la política de OUTPUT
no está configurada en ACCEPT
.
Permitir todas las conexiones entrantes HTTPS
Para permitir todas las conexiones entrantes HTTPS (puerto 443), ejecute estos comandos:
El segundo comando, que permite el tráfico saliente de las conexiones HTTP establecidas, solo es necesario si la política de OUTPUT
no está configurada en ACCEPT
.
Permitir todas las conexiones entrantes HTTP y HTTPS
Si desea permitir tanto el tráfico HTTP como HTTPS, puede utilizar el módulo multiport para crear una regla que permita ambos puertos. Para permitir todas las conexiones entrantes HTTP y HTTPS (puerto 443), ejecute estos comandos:
El segundo comando, que permite el tráfico saliente de conexiones HTTP y HTTPS establecidas, solo es necesario si la política de salida no está establecida en ACEPTAR.
Servicio: MySQL
MySQL escucha las 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 entrantes de MySQL desde una dirección IP o subred específica, especifique la fuente. Por ejemplo, si desea permitir toda la subred 203.0.113.0/24
, ejecute estos comandos:
El segundo comando, que permite el tráfico saliente de conexiones MySQL establecidas, solo es necesario si la política de salida no está establecida en ACEPTAR.
Permitir MySQL a una interfaz de red específica
Para permitir conexiones de MySQL a una interfaz de red específica, digamos que tiene una interfaz de red privada eth1
, por ejemplo, use estos comandos:
El segundo comando, que permite el tráfico saliente de conexiones MySQL establecidas, solo es necesario si la política OUTPUT
no está establecida 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ífica, especifique la fuente. Por ejemplo, si desea permitir toda la subred 203.0.113.0/24
, ejecute estos comandos:
El segundo comando, que permite el tráfico saliente de conexiones PostgreSQL establecidas, solo es necesario si la política OUTPUT
no está establecida en ACCEPT
.
Permitir PostgreSQL a una Interfaz de Red Específica
Para permitir conexiones a PostgreSQL a través de una interfaz de red específica, por ejemplo, digamos que tienes una interfaz de red privada eth1
, utiliza estos comandos:
El segundo comando, que permite el tráfico saliente de conexiones PostgreSQL establecidas, solo es necesario si la política de OUTPUT
no está configurada en ACCEPT
.
Servicio: Correo
Los servidores de correo, como Sendmail y Postfix, escuchan en una variedad de puertos dependiendo de los protocolos utilizados para la entrega de correo. Si estás ejecutando un servidor de correo, determina qué protocolos estás utilizando y permite los tipos de tráfico apropiados. También te mostraremos cómo crear una regla para bloquear el correo SMTP saliente.
Bloquear Correo SMTP Saliente
Si tu servidor no debería enviar correo saliente, es posible que desees bloquear ese tipo de tráfico. Para bloquear el correo SMTP saliente, que utiliza el puerto 25, ejecuta este comando:
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
arriba.
Permitiendo todo el tráfico entrante de SMTP
Para permitir que su servidor responda a conexiones SMTP en el puerto 25, ejecute estos comandos:
El segundo comando, que permite el tráfico saliente de conexiones SMTP establecidas, solo es necesario si la política de OUTPUT
no está establecida en ACCEPT
.
Permitiendo todo el tráfico entrante de IMAP
Para permitir que su servidor responda a conexiones IMAP, puerto 143, ejecute estos comandos:
El segundo comando, que permite el tráfico saliente de conexiones IMAP establecidas, solo es necesario si la política de OUTPUT
no está establecida en ACCEPT
.
Permitiendo todo el tráfico entrante de IMAPS
Para permitir que su servidor responda a conexiones IMAPS en el puerto 993, ejecute estos comandos:
El segundo comando, que permite el tráfico saliente de conexiones IMAPS establecidas, solo es necesario si la política OUTPUT
no está establecida en ACCEPT
.
Permitir Todas las Conexiones Entrantes de POP3
Para permitir que su servidor responda a conexiones POP3 en el puerto 110, ejecute estos comandos:
El segundo comando, que permite el tráfico saliente de conexiones POP3 establecidas, solo es necesario si la política OUTPUT
no está establecida en ACCEPT
.
Permitir Todas las Conexiones Entrantes de POP3S
Para permitir que su servidor responda a conexiones POP3S en el puerto 995, ejecute estos comandos:
El segundo comando, que permite el tráfico saliente de conexiones POP3S establecidas, solo es necesario si la política OUTPUT
no está establecida en ACCEPT
.
Conclusión
Eso debería cubrir muchos de los comandos que se utilizan comúnmente al configurar un firewall iptables. Por supuesto, iptables es una herramienta muy flexible, así que siéntete libre de combinar los comandos con diferentes opciones para que se ajusten a tus necesidades específicas si no están cubiertas aquí.
Si estás buscando ayuda para determinar cómo debería configurarse tu firewall, echa un vistazo a este tutorial: Cómo elegir una política de firewall efectiva para asegurar tus servidores.