El programa de utilidad de espacio de usuario iptables permite configurar las tablas proporcionadas por el firewall del kernel de Linux, así como las cadenas y reglas que almacena. El módulo del kernel que se usa actualmente para iptables solo se aplica al tráfico de IPv4, para configurar las reglas de firewall para las conexiones de IPv6, en su lugar debes usar ip6tables, que responde a las mismas estructuras de comando que iptables. Si estás utilizando CentOS 7, deberías considerar la configuración de firewalld, que combina la funcionalidad de iptables e ip6tables, aunque es posible seguir usando iptables de la misma manera.
Listado de reglas actuales
En CentOS y otras variantes de Red Hat, iptables a menudo viene con algunas reglas preconfiguradas, verifica las reglas actuales de iptable usando el siguiente comando:
1 |
sudo iptables -L |
Esto imprimirá una lista de tres cadenas, input, forward and output, como la salida del ejemplo de la tabla de reglas vacía a continuación:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT icmp -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination |
Los nombres de la cadena indican a qué tráfico se aplicarán las reglas en cada lista, input es para cualquier conexión que llegue a tu servidor en la nube, output es cualquier tráfico saliente y forward para cualquier paso. Cada cadena también tiene su configuración de política que determina cómo se maneja el tráfico si no coincide con ninguna regla específica, de forma predeterminada está configurado para aceptar.
Añadiendo reglas
Por lo general, los firewalls se pueden configurar de una o dos maneras, ya sea configurando la regla predeterminada para que acepte y luego bloquee cualquier tráfico no deseado con reglas específicas, o bien, utilizando las reglas para definir el tráfico permitido y bloquear todo lo demás.
Este último es a menudo el enfoque recomendado, ya que permite el bloqueo preventivo del tráfico, en lugar de rechazar de forma reactiva las conexiones que no deberían intentar acceder a tu servidor en la nube.
Para comenzar a utilizar iptables, primero debes agregar las reglas para el tráfico entrante permitido para los servicios que necesitas. Iptables puede rastrear el estado de la conexión, así que usa el siguiente comando para permitir que continúen las conexiones establecidas.
1 |
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
Puedes verificar que la regla se agregó usando el mismo comando sudo iptables -L como antes.
A continuación, debes permitir el tráfico a un puerto específico para habilitar las conexiones SSH con el siguiente comando:
1 |
sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT |
El comando ssh en el comando se traduce al número de puerto 22, que el protocolo utiliza de forma predeterminada.
La misma estructura de comando se puede usar para permitir el tráfico a otros puertos también. Para habilitar el acceso a un servidor web HTTP, usa el siguiente comando:
1 |
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT |
Después de agregar todas las reglas permitidas que requiera, cambia la política de output para eliminar.
1 |
sudo iptables -P INPUT DROP |
Las mismas reglas de política se pueden definir para otras cadenas también al ingresar el nombre de la cadena y seleccionar DROP o ACCEPT.
Guardando y restaurando reglas
Ahora, si tuvieras que reiniciar tu servidor en la nube, se borrarán todas estas configuraciones de iptables. Para evitar esto, guarda las reglas en un archivo.
1 |
sudo iptables-save > /etc/sysconfig/iptables |
Luego, simplemente puedes restaurar las reglas guardadas leyendo el archivo que guardaste.
1 2 3 4 |
# Overwrite the current rules sudo iptables-restore < /etc/sysconfig/iptables # Add the new rules keeping the current ones sudo iptables-restore -n < /etc/sysconfig/iptables |
Para automatizar la restauración al reiniciar, CentOS ofrece un servicio de sistema con el mismo nombre, iptables, que debe habilitarse.
1 |
sudo chkconfig iptables on |
Luego, simplemente puedes guardar las reglas actuales usando el siguiente comando:
1 |
sudo service iptables save |
Estos son solo algunos comandos simples que puedes usar con iptables, que es capaz de mucho más. Sigue leyendo para ver algunas de las otras opciones disponibles para un control más avanzado sobre las reglas de iptable.
Configuración avanzada de reglas
Según el comportamiento del firewall básico, las reglas se leen en el orden en que aparecen en cada cadena, lo que significa que deberás colocar las reglas en el orden correcto.
Al agregar nuevas reglas, se agregan al final de la lista. Puedes agregar nuevas reglas a una posición específica de la lista insertándolas usando el comando iptables -I <index> -, donde <index> es el número de orden en el que deseas insertar la regla. Para saber qué número de index (índice) se debe ingresar, usa el siguiente comando:
1 |
sudo iptables -L --line-numbers |
1 2 3 4 5 |
Chain INPUT (policy DROP) num target prot opt source destination 1 ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED 2 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh 3 ACCEPT tcp -- anywhere anywhere tcp dpt:http |
El número al principio de cada línea de regla indica la posición en la cadena. Para insertar una nueva regla sobre una regla existente específica, simplemente usa el número de índice de esa regla existente. Por ejemplo, para insertar una nueva regla en la parte superior de la cadena, usa el siguiente comando con el número de índice 1.
1 |
sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT |
Si deseas eliminar una regla existente de una cadena determinada, usa el comando de eliminación con el parámetro -D. La forma más fácil de seleccionar la regla para eliminar es usar los números de índice explicados anteriormente. Por ejemplo, para eliminar la segunda regla en la cadena de entrada, usa este comando:
1 |
sudo iptables -D INPUT 2 |
También es posible eliminar todas las reglas de una cadena específica o incluso las iptables completas utilizando el parámetro -F.
Esto es útil si sospechas que iptables está interfiriendo con tu intento de tráfico de red, o simplemente deseas comenzar a configurar nuevamente desde una tabla limpia. Recuerda guardar las reglas en un archivo antes de vaciar la tabla.
1 2 3 4 |
# Clear input chain sudo iptables -F INPUT # Flush the whole iptables sudo iptables -F |
Con el iptable vacío, tu servidor podría ser vulnerable a los ataques. Asegúrate de proteger tu sistema con un método alternativo mientras deshabilitas iptables incluso temporalmente.