Introducción
Iptables es el software de firewall que se incluye de forma predeterminada con la mayoría de las distribuciones de Linux. Esta guía proporciona una referencia rápida a los comandos de iptables que crearán reglas de firewall útiles en escenarios cotidianos comunes. Esto incluye ejemplos de iptables para permitir y bloquear varios servicios por puerto, interfaz de red y dirección IP de origen.
Tenga en cuenta que el orden de sus reglas es importante. Todos estos comandos de iptables
-A
para agregar la nueva regla al final de una cadena. Si desea colocarlo en otro lugar de la cadena, puede usar la -I
que le permite especificar la posición de la nueva regla (o simplemente colocarla al principio de la cadena sin especificar un número de regla).
Nota:
Recuerde que puede verificar su conjunto de reglas iptables actual con el comando sudo iptables -S
y sudo iptables -L
.
Guarda las reglas
Las reglas de iptables son temporales inicialmente, lo que significa que deben guardarse manualmente para que persistan después de un reinicio.
Ubuntu
En Ubuntu, la forma más fácil de guardar las reglas de iptables para que sobrevivan al reinicio es usar el paquete iptables-persistent
Instálelo con apt-get así:
sudo apt-get update
sudo apt-get install iptables-persistent
Durante la instalación, se le preguntará si desea guardar sus reglas de firewall actuales.
Si actualiza las reglas del firewall y desea guardar los cambios, ejecute este comando:
sudo netfilter-persistent save
En las versiones de Ubuntu anteriores a la 16.04, ejecute este comando en su lugar:
sudo invoke-rc.d iptables-persistent save
CentOS 8 y versiones anteriores
En CentOS 6 y versiones anteriores (CentOS 7 y versiones posteriores usan FirewallD de forma predeterminada), puede usar el iptables
para guardar las reglas de iptables:
sudo service iptables save
Esto guardará sus reglas actuales de iptables en el /etc/sysconfig/iptables
.
Reglas generalmente útiles
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 reenviarse las conexiones de red a sí misma. Por ejemplo, si hace ping localhost
o a ping 127.0.0.1
, el servidor se hará ping a sí mismo utilizando loopback. La interfaz de bucle invertido también se utiliza si configura el servidor de aplicaciones para que se conecte a un servidor de base de datos con una localhost
". Por lo tanto, querrá asegurarse de que su firewall permita estas conexiones.
Para aceptar todo el tráfico en la interfaz de loopback, 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
Dado que el tráfico de red generalmente debe ser bidireccional (entrante y saliente) para funcionar correctamente, es típico crear una regla de firewall que permita el tráfico entrante establecido ( establecido) y relacionado (relacionado), de modo que el servidor permita que el tráfico regrese a las conexiones salientes iniciadas. por el servidor sí. Este comando permitirá:
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á:
sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
De adentro hacia afuera
Suponiendo que eth0
es su red externa y eth1
es su red interna, esto permitirá que su interno acceda a la externa:
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
Eliminar (DROP) paquetes no válidos
Algunos paquetes de tráfico de red están marcados como no válidos (no válidos). A veces puede ser útil registrar este tipo de paquetes, pero a menudo está bien descartarlos. Hazlo con este comando:
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
Bloquear una dirección IP
Para bloquear las conexiones de red que se originan en una dirección IP específica, por ejemplo 15.15.15.51
, ejecute este comando:
sudo iptables -A INPUT -s 15.15.15.51 -j DROP
En este ejemplo, -s 15.15.15.51
Especifica un origen dirección IP del " 15.15.15.51
". La dirección IP de origen se puede especificar en cualquier regla de firewall, incluida una regla de permitir (permitir).
Si quieres rechazar en su lugar (rechazar) la conexión, que responderá a la solicitud de conexión con un error de "conexión rechazada", reemplace "DROP" con "REJECT" así:
sudo iptables -A INPUT -s 15.15.15.51 -j REJECT
Bloquear conexiones a una interfaz de red
Para bloquear conexiones desde una dirección IP específica, por ejemplo 15.15.15.51
, a una interfaz de red específica, por ejemplo eth0
. Utilice este comando:
sudo iptables -A INPUT -i eth0 -s 15.15.15.51 -j DROP
Esto es lo mismo que en 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 restringir la regla a una red en particular.
Servicio: SSH
Si está utilizando un servidor en la nube, probablemente desee permitir conexiones SSH entrantes (puerto 22) para poder conectarse y administrar su servidor. Esta sección explica cómo configurar el firewall con varias reglas relacionadas con SSH.
Permitir SSH entrante
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 las conexiones SSH establecidas, solo es necesario si la OUTPUT
no está configurada en ACCEPT
.
Permitir SSH entrante desde una dirección IP o subred específica
Para permitir conexiones SSH desde una dirección IP o subred específica, especifique la fuente. Por ejemplo, si desea permitir toda la 15.15.15.0/24
, ejecute estos comandos:
sudo iptables -A INPUT -p tcp -s 15.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
El segundo comando, que permite el tráfico saliente de las conexiones SSH establecidas, solo es necesario si la OUTPUT
no está configurada en ACCEPT
.
Permitir SSH saliente
Si OUTPUT
su firewall no está configurada en ACCEPT
y desea permitir conexiones SSH salientes (el 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 funciona 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 15.15.15.0/24
pueda resincronizarse con el servidor, ejecute estos comandos:
sudo iptables -A INPUT -p tcp -s 15.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
El segundo comando, que permite el tráfico saliente de las conexiones rsync establecidas, es necesario solo si la OUTPUT
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 de tráfico entrante predeterminada está configurada para descartar o denegar, le recomendamos que cree reglas que permitan que su servidor responda a tales solicitudes.
Permitir HTTP entrante
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 las conexiones HTTP establecidas, es necesario solo si la OUTPUT
no está configurada en ACCEPT
.
Permitir HTTPS entrante
Para permitir todas las conexiones HTTPS (puerto 443) entrantes, 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 las conexiones HTTP establecidas, es necesario solo si la OUTPUT
no está configurada en ACCEPT
.
Permitir HTTP y HTTPS entrantes
Si desea permitir el tráfico HTTP y HTTPS, puede usar el módulo multipuerto (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 de salida de conexiones establecidas HTTP y HTTPS, sólo es necesaria si la OUTPUT
política no se establece en ACCEPT
.
Servicio: MySQL
MySQL escucha las conexiones del cliente 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 15.15.15.0/24
, ejecute estos comandos:
sudo iptables -A INPUT -p tcp -s 15.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
El segundo comando, que permite el tráfico saliente de conexiones MySQL establecidas, solo es necesario si la OUTPUT
no está configurada en ACCEPT
.
Permitir MySQL a una interfaz de red específica
Para permitir conexiones MySQL a una eth1
específica, por ejemplo, si tiene una interfaz de red privada, use 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 las conexiones MySQL establecidas, es necesario solo si la OUTPUT
no está configurada en ACCEPT
.
Servicio: PostgreSQL
PostgreSQL está escuchando conexiones de cliente 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 subred o dirección IP 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 15.15.15.0/24
, ejecute estos comandos:
sudo iptables -A INPUT -p tcp -s 15.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
El segundo comando, que permite el tráfico saliente de las conexiones PostgreSQL establecidas, es necesario solo si la OUTPUT
no está configurada en ACCEPT
.
Permitir que PostgreSQL acceda a una interfaz de red específica
Para permitir conexiones de PostgreSQL a una eth1
específica, por ejemplo, si tiene una interfaz de red privada, use 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 las conexiones PostgreSQL establecidas, es necesario solo si la 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á ejecutando 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.
Bloquear correo SMTP saliente
Si se supone que su servidor no debe enviar correo saliente, es posible que desee bloquear ese tipo de tráfico. Para bloquear el correo SMTP saliente, que usa 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 que no sea su número de puerto, en lugar del puerto 25, simplemente reemplácelo.
Permitir todos los SMTP entrantes
Para permitir que el servidor responda a las conexiones SMTP, 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 establecidas, es necesario solo si la OUTPUT
no está configurada en ACCEPT
.
Nota: Es
Permitir todos los IMAP entrantes
Para permitir que el 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 las conexiones IMAP establecidas, es necesario solo si la OUTPUT
no está configurada en ACCEPT
.
Permitir todos los IMAP entrantes
Para permitir que el 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 las conexiones IMAPS establecidas, es necesario solo si la OUTPUT
no está configurada en ACCEPT
.
Permitir todos los POP3 entrantes
Para permitir que el 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 las conexiones POP3 establecidas, es necesario solo si la OUTPUT
no está configurada en ACCEPT
.
Permitir todos los POP3S entrantes
Para permitir que el 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 las conexiones POP3S establecidas, es necesario solo si la OUTPUT
no está configurada en ACCEPT
.
Conclusión
Este tutorial debe 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éntase libre de intentar emparejar los comandos con diferentes opciones para satisfacer sus necesidades específicas si no se tratan aquí.