¿Cómo configurar un Firewall básico en CentOS 6 usando Iptables?

Actualizado el 25 de Julio, 2016. Por BlueHosting.

Introducción

iptables es un Firewall simple instalado en la mayoría de las distribuciones de Linux. Según la información del propio manual de Linux para iptables, esta es una herramienta de administración para la filtración y NAT de paquetes IPv4, en pocas palabras: es una herramienta para filtrar y bloquear tráfico de Internet. El firewall iptables está incluido por defecto en la mayoría de las versiones de CentOS 6.x.

Este artículo demostrará cómo crear un firewall sencillo en un VPS con CentOS. Este firewall simplemente abrirá los puertos que queremos y cerrará otros servicios. También se demostrará como prevenir ataques comunes, y cómo volver a ingresar a un VPS si usted mismo se niega el acceso por accidente.

Este tutorial no es bajo ningún concepto exhaustivo, y solo muestra cómo abrir algunos puertos de entrada: para apache, SSH, email y cómo cerrar todos los demás. No bloquearemos el tráfico de salida, y solo crearemos algunas reglas comunes para bloquear los bots y scripts comunes que buscan VPSs vulnerables.

Configuraremos el firewall regla a regla. Para resumir: un firewall es una lista de reglas, así que cuando una conexión entrante está abierta, si coincide con alguna de las reglas, esta regla puede aceptar la conexión o rechazarla. Si no se coincide con ninguna regla, entonces se utiliza la regla por defecto.

Nota
Este tutorial solo cubre la seguridad IPv4. En Linux, la seguridad IPv6 es mantenido de forma separada de Ipv4. Por ejemplo, "iptables" solo incluye reglas de firewall para direcciones IPv4, pero tiene una contraparte IPv6 llamada "ip6tables", que se usa para el mantenimiento de reglas de firewall aplicables a direcciones IPv6.

Si su VPS está configurado para IPv6, recuerdo asegurar ambas interfaces de red IPv4 e IPv6 con las herramientas apropiadas.

Decidir qué puertos y servicios abrir

Para comenzar, queremos saber qué servicios queremos abrir al público. Usaremos como ejemplo un servidor de alojamiento web típico: es un servidor web y de correo electrónico, pero también debemos permitirnos la entrada al servidor a través de SSH.

Primero, queremos dejar el puerto SSH abierto para que podamos conectarnos de forma remota al VPS: este puerto es el 22.

También, necesitamos los puertos 80 y 443 (puerto SSL) para tráfico web. Para enviar correos electrónicos, abriremos el puerto 25 (SMTP regular) y el 465 (SMTP seguro). Para permitir que los usuarios reciban correos electrónicos, abriremos el puerto 110 (POP3 regular) y el 995 (puerto para POP3 con seguridad).

Adicionalmente, abriremos los puertos IMAP, si tenemos este protocolo habilitado: 143 para IMAP, y 993 para IMAP sobre SSL. Nota: Es muy recomendable permitir únicamente protocolos seguros; sin embargo, ésta podría no ser una opción, ya que quizás no podamos influenciar a los usuarios del servicio de correo a que cambien sus clientes de email.

Bloquear los ataques más comunes

Los VPSs de Opencloud vienen generalmente con una configuración vacía: todo el tráfico es permitido. Para asegurarse de esto, podemos deshacernos de las reglas de firewall borrándolas por completo:

iptables -F

Luego, podemos simplemente agregar algunas reglas simples de firewall para bloquear los ataques más comunes, para proteger nuestro VPS de algunas jugarretas con scripts. En la práctica, no podemos fiarnos únicamente de iptables para protegernos de un DDoS de gran escala o ataques similares, pero al menos podemos librarnos de los bots de escaneo de red que eventualmente podrían encontrar nuestro VPS y comenzar a buscar brechas de seguridad para atacarlo. Primero, comenzaremos bloqueando los paquetes nulos:

iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

A través del comando anterior, le hemos dicho a nuestro firewall que tome todos los paquetes entrantes con banderas tcp NONE y que los descarte (DROP). Los paquetes nulos, son básicamente, paquetes de reconocimiento. Los patrones de ataque los usan para intentar ver cómo está configurado el VPS y encontrar vulnerabilidades. El siguiente patrón que debemos rechazar es un ataque Syn Flood o también denominado inundación TCP/SYN.

iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

Un Ataque Syn Flood, significa que el atacante abre una nueva conexión, pero no manifiesta lo que quiere (por ejemplo: paquetes SYN, ACK), aprovechándose del mecanismo de negociación TCP y saturando el tráfico en nuestro servidor. Simplemente quieren ocupar los recursos de nuestros servidores. No debemos aceptar este tipo de paquetes.

Ahora continuaremos con otro patrón bastante común: paquetes XMAS -o paquetes "árbol de navidad"- que son también paquetes de reconocimiento.

iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

En este punto, ya hemos agregado reglas para algunos de los patrones de ataque más comunes que buscan vulnerabilidades en nuestro VPS.

Abrir puertos para servicios seleccionados

Ahora podemos comenzar a añadir servicios seleccionados a nuestro filtro de firewall. Lo primero es agregar una interfaz para nuestro localhost:

iptables -A INPUT -i lo -j ACCEPT

Con este comando decimos a iptables que agregue (-A) una regla a la tabla para: filtrar las conexiones de entrada (INPUT) provenientes de la interfaz localhost (-i lo) y aceptarlas (-j ACCEPT). Un ejemplo del uso frecuente del host local o localhost es comunicar su servidor de correo o sitio web con una base de datos instalada localmente. De esta manera, su VPS puede usar la base de datos, pero ésta estará cerrada contra ataques desde el Internet.

Ahora podemos permitir tráfico del servidor web:

iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

Añadimos los dos puertos (puerto 80 http, y puerto 443 https) a la cadena "aceptar" (ACEPTAR) - permitiendo así, el tráfico en estos puertos. Ahora, autoricemos el uso de nuestros servidores SMTP a nuestros usuarios:

iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 465 -j ACCEPT

Como se explicó anteriormente, si podemos influenciar a nuestros usuarios, deberíamos usar más bien la versión segura del servicio. Pero es muy común que no podamos dictar las condiciones, y los usuarios se conectarán usando el puerto 25, lo que -por cierto- hace mucho más fácil que los atacantes puedan rastrear contraseñas.

Ahora procedamos a permitir que los usuarios lean los correos electrónicos en su servidor:

iptables -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 995 -j ACCEPT

Las últimas dos reglas permitirán el tráfico POP3. Una vez más, podemos aumentar la seguridad de nuestro servidor de email agregando solamente la versión segura del servicio.

También debemos permitir el protocolo de correo IMAP:

iptables -A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 993 -j ACCEPT

Limitar el acceso SSH

También debemos permitir el tráfico SSH, para poder conectarnos a nuestro VPS de forma remota. La manera más simple de hacerlo sería ingresando el siguiente comando:

iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

Ahora, le hemos dicho a iptables que agregue una regla para aceptar el tráfico tcp entrante en el puerto 22 (el puerto SSH por defecto). Se recomienda cambiar la configuración SSH a un puerto distinto, en este caso, la regla del firewall debe ser cambiada apropiadamente, sin embargo, no abordamos la configuración SSH en este tutorial.

No obstante, hay algo más que podemos hacer con nuestro firewall. Si nuestra oficina usa direcciones IP permanentes, podemos permitir conexiones SSH que solo provengan de esa fuente. Esto solo autorizaría conexiones desde nuestra ubicación.

Primero, averigüe su IP externa. Asegúrese de que ésta no es una dirección de su red LAN, ¡de lo contrario el siguiente paso no funcionará! Puede hacerlo visitando el sitio web What's my IP. Otra manera de hacerlo es ingresando:

w

En el terminal; nos veremos como usuario activo y podremos observar nuestra dirección IP. La salida será similar a lo siguiente:

[root@centos sysconfig]# w
 15:44:45 up 6 days,  6:17,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    190.36.xxx.yyy    09:47    0.00s  0.33s  0.00s w

Ahora, puede crear una regla de firewall para permitir únicamente el tráfico al puerto SSH, si viene de una fuente: su dirección IP.

iptables -A INPUT -p tcp -s SU_DIRECCIÓN_IP -m tcp --dport 22 -j ACCEPT

Recuerde que, evidentemente, debe remplazar SU_DIRECCIÓN_IP por su dirección IP real.

Podemos abrir más puertos en nuestro firewall como sea necesario cambiando los números de puerto. De esa manera, el firewall permitirá el acceso estrictamente a los servicios que especifiquemos. Ahora mismo, necesitamos añadir una regla más que nos permitirá el uso de conexiones salientes (por ejemplo: ping desde nuestro VPS o actualizaciones de software):

iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Esto permitirá que cualquier conexión saliente reciba respuestas desde el VPS al otro lado de esa conexión. Cuando tengamos todo configurado, bloquearemos todo lo restante, y permitiremos todas las conexiones salientes:

iptables -P OUTPUT ACCEPT
iptables -P INPUT DROP

¡Felicidades! Ya hemos hecho una configuración básica, pero bastante completa, de nuestras reglas de firewall.

Guardar la configuración

Ahora que hemos establecido toda nuestra configuración, podemos enumerar las reglas para verificar si falta algo:

iptables -vnL

La opción -n habilita la visualización numérica de las direcciones IP, en lugar de los nombres de dominio. Si esta opción no está incluida, el firewall buscará el nombre del servidor al cual pertenece y mostrará este último. El parámetro -v nos dará un resultado verboso, incluyendo nombre de la interfaz, opciones de la regla y máscaras ToS.

Finalmente podemos guardar nuestra configuración de Firewall:

iptables-save | sudo tee /etc/sysconfig/iptables

El archivo de configuración de iptables de CentOS está ubicado en /etc/sysconfig/iptables. El comando anterior guardó las reglas que creamos en ese archivo. Ahora debemos asegurarnos de que todo funciona, podemos entonces reiniciar el firewall:

service iptables restart

Las reglas guardadas se mantienen incluso si el VPS es reiniciado.

Eliminar la configuración para desbloquearnos

Si cometiéramos un accidente en nuestra configuración, podríamos bloquear nuestro propio acceso al VPS. Quizás hemos colocado una dirección IP incorrecta y el firewall no permitirá conexiones desde nuestra estación de trabajo. Ahora no tenemos acceso a esas reglas, y si las guardamos, ni siquiera un reinicio nos ayudaría. ¡Tenga especial cuidado al hacer cambios en la iptable, podría bloquear su acceso remoto al servidor!

Existen algunos métodos para evitar bloqueos de acceso en el servidor, pero los mismos no se abordan en este tutorial. Algunos ejemplos son: uso de crontab para hacer los cambios de forma temporal; hacer un respaldo de nuestra tabla y reiniciar el servicio iptables por un tiempo determinado. La explicación de estas técnicas no forma parte de este tutorial, nuevamente, ejecute las operaciones con cuidado.

Recuerde que para eliminar todas las reglas dentro de la tabla iptables puede ejecutar:

iptables -F

Conclusión

Este no es un tutorial exhaustivo, y solo hace un manejo superficial de un firewall simple en una máquina Linux. Hará lo suficiente en un servidor web y de correo típico, para un escenario de desarrollar no muy familiarizado con la línea de comandos de Linux y la tabla iptables.

Sin embargo, hay mucho más que puede hacerse. Hay gran cantidad de tutoriales y manuales en la red para ayudarnos a lograr una configuración más robusta. Para ambientes productivos, es muy recomendable crear una configuración más detallada o buscar a un experto en seguridad que prepare nuestra configuración.

En todo caso, recomendamos explorar las distintas opciones y consultar otros recursos para hacerse de más conocimiento en el tema.

Recursos adicionales

Puede consultar los siguientes recursos en busca de información adicional con respecto a este tema. Aunque este material es provisto esperando que sea útil, tome en cuenta que no podemos dar fe de la actualidad o precisión de los contenidos externos.

  • Para explorar las distintas opciones que provee iptables recuerde que puede usar:

     iptables --help
    
  • Puede también consultar el manual en línea.

¿QUÉ DESEAS SABER?

Intentaremos leer tu mente...