Firewall con Iptables
Los firewall son imprescindibles en temas de seguridad y sistemas, podemos tenerlos a nivel de red, nivel de sistema o perimetrales (entre LAN e Internet). Iptables de Netfilter es el firewall implementado en el Kernel Linux estándar, soporta filtrado de paquetes, toda clase de direcciones de red, traducciones de puerto (NAT/NAPT) o filtrado por rangos de IP.
Puede que a simple vista nos parezca el típico firewall integrado en otros conocidos sistemas, pero no tiene nada que ver, ya que es implementado tanto en máquinas clientes como en servidores de grandes empresas e incluso en el caso de los firewall perimetrales en modo bridge podemos tener servidores dedicados para filtrar todo lo que entra y sale de nuestra red.
En esta interesante página vemos que de las 100 mejores herramientas de seguridad, el primer software de Firewall en salir en el puesto 23 es del que hablamos, y en el cual justo comentan que en plataformas windows también hay muchos Firewall pero ninguno está en este listado.
Top 100 herramientas de seguridad
Hay unas cuantas cosas a tener en cuenta ya que con esta herramienta hay que tener mucho cuidado al gestionarla
Lo primero a destacar es que no tiene un fichero de configuración propiamente dicho, recordemos que está integrado en el propio kernel, esto es importante, dado que si en un momento dado la máquina se reiniciara podemos perder toda la configuración, si queremos evitar esto o al menos antes de hacer cambios guardarlo o cambiando uno a uno los parámetros podemos hacerlo así:
Guardamos configuración en ruta por defecto /etc/sysconfig/iptables
# iptables-save
Esto es recomendable antes de hacer cambios y a cada cambio que hacemos por si posteriormente tenemos problemas o tenemos que restaurar configuración, en entornos críticos no podemos ponernos a teclear todo a mano, cada segundo con una aplicación o servicio caído cuentan.
# iptables-save > /root/iptables.`date +%F`01.txt
Con este comando guardamos las reglas en el directorio del usuario root con la fecha actual en formato iptables.2011101001.txt, siendo el último número (01) el cambio que hagamos, por tanto irá creciendo a medida que hagamos para diferenciarlos.
Para restaurar el iptables haremos esto de la ruta original:
iptables-restore
O por el contrario para un fichero determinado
iptables-restore < /root/iptables.2011101001.txt
Ahora vamos al lio, después de esta pedazo introducción esta es la forma de visualizar configuración actual y gestionar reglas.También podemos tener otras más de las que se explican aquí pero en este artículo quiero explicar las bases ya que la configuración se puede estirar sin límites y dependiendo de las necesidades.
Leer configuración actual del iptables.
# iptables --nL
Y esto es lo que veremos:
con el siguiente comando nos saldrán las reglas con números, que es algo muy útil si queremos quitar reglas:
#iptables -nL --line-numbers
Si tenemos muchas reglas, a la hora de borrar con el –line-numbers vemos de una forma fácil cual tenemos que quitar.
Hay tres cadenas en la configuración por defecto, INPUT, FORWARD, OUTPUT y luego una política.
– cadena INPUT – Filtrado de paquetes que llegan al firewall y por lo tanto acceden a la máquina.
– cadena FORWARD – Filtrado de paquetes que pasan a través de nuestro firewall y tienen destino otra máquina.
– cadena OUTPUT – Filtrado de paquetes que salen de nuestro servidor a diferentes destinos.
IMPORTANTE las reglas se leen en orden secuencial, comienza por la primera línea, verifica condiciones y si encuentra alguna que la cumple o la prohibe la ejecuta sin verificar las siguientes.
Gestionaremos el firewall con estos argumentos principalmente:
# iptables -A INPUT -s 0.0.0.0 -p tcp --dport 80 -j ACCEPT
Añade una regla a la cadena INPUT por ejemplo, de «source» cualquier dirección ip, en el protocolo tcp, por el puerto 80 y lo acepta.
# iptables -I CADENA 2 [regla que queremos insertar] -j [ACCEPT, DROP]
Inserta una regla antes que la regla número X en la cadena determinada, recordemos el orden de lectura.
# iptables -N EJEMPLO
Crear cadena personalizada nueva de nombre ejemplo, en entornos con muchísimos servidores es casi mejor hacerlo modular y separarlos.
# iptables -D EJEMPLO 3
Elimina la regla 3 de la cadena EJEMPLO
Si queremos meter una regla para permitir el acceso a SSH a ese servidor desde una determinada máquina 192.168.1.24 ponemos algo como esto:
# iptables -A INPUT -s 192.168.1.24 -p tcp --dport 22 -j ACCEPT
Si queremos denegar todas los demás accesos a SSH a este servidor la regla que tiene que ir debajo, (no a continuación pero es importante que la de aceptar esté por encima), va a ser algo así:
# iptables -A INPUT -s 0.0.0.0 -p tcp --dport 22 -j DROP
Pero no es necesario que denegar todas las reglas una a una como es obvio, para ello tenemos dos formas posibles, una muy común es poner en la última regla un parámetro de forma que aparezca así en todas las cadenas:
Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ACCEPT tcp -- anywhere anywhere tcp dpt:www DROP all -- anywhere anywhere
En este ejemplo sólo he puesto en la cadena INPUT, pero se pone en todas, en la última posición. Denegando todos los demás accesos que no estén en nuestra configuración.
Otra forma de hacerlo sería ponerlo en la Politica, si la ponemos por defecto como DROP, esto hace el firewall más seguro, tenemos que saber que hay que tener permitido y que no, con todo detalle. Es mucho más difícil de mantener y se administra diferente de poner la regla de DROP al final de cada cadena, con lo que de hacerlo hay que hacerlo desde el principio, porque si no es caos.
Regla de los puertos altos
Algunos protocolos son bidireccionales, una vez hecha la conexión como por ejemplo al conectarnos con SSH si ejecutamos un comando tan simple como «ls» el servidor nos manda esa información de vuelta por otro puerto que no es el 22 (SSH) con que hacemos la conexión del protocolo. Se pone en la cadena de OUTPUT normalmente para que deje abiertas las conexiones ESTABLISHED, tiene que quedar de la siguiente forma:
ACCEPT tcp -- anywhere anywhere tcp spt:smtp dpts 1024:65535 state ESTABLISHED
Deja un comentario