Administración - Firewall

Drakfirewall

Bueno, ya hemos hablado de este asistente de Mandriva, que nos permite configurar de forma simple un cortafuegos en nuestro Servidor. Y hemos dicho que se trata de un configurador gráfico de shorewall. De esta forma ya tenemos un firewall que actúa como un filtro, abriendo ciertos puertos de nuestro Servidor para poder recibir determinadas peticiones, y dejando cerrando otros (suponemos). Su uso es muy simple: tras ejecutar como root el comando drakfirewall tenemos ante nosotros una ventana en la que elegimos lo que deseamos. Si tenemos un servidor web, ssh y un Servidor de Correo (smtp), sólo tenemos que desmarcar la opción "Todo (sin cortafuegos)" y marcar las correspondentes casillas. Como no vemos nada sobre un servidor web seguro (https), damos a "Avanzada", que nos muestra la entrada "Otros puertos", donde escribimos 443/tcp. Ya basta con "Aceptar".

Vemos que nuestro asistente dispone de pocas opciones de configuración. Podemos usar webmin para configurar shorewall... aunque podemos perdernos. Y requerirá triple esfuerzo: aprender a usar webmin, aprender a usar shorewall y, por supuesto, aprender iptables.

Yo he intentado comprender el proceso y construir mi propio cortafuegos. Y es que: ¿Qué es un firewall? ¿Qué papel desempeña en él shorewall y drakfirewall? He escuchado algo de iptables: ¿qué tiene todo esto que ver? Bueno, hay por ahí muchos manuales sobre iptables, guías para comprender iptables en cinco minutos, hasta en 21 segundos, iptables para vagos,... libros y autores de todo tipo: Ingenieros Superiores, gurús, Informáticos Extraordinarios y hasta simples pringaos que copian y pegan. Aquí vamos a batir todos los récords.

Monólogos sobre Iptables de un matemático que no sabe ni papa de informática

Atención: si siente naúseas o cefaleas abandone la lectura rápidamente. No me hago responsable de los efectos secundarios.

  • Por lo visto, los datos puede entrar (INPUT), salir (OUTPUT) o pasar (FORWARD) por mi Servidor. Bueno, mi Servidor no es un correveidile de otras máquinas. No está aquí para que un pc de la Red Interna le diga: oye, quiero ir a este ftp de Internet, anda, déjame; ni para que un pc de Internet le diga: oye, toma esta imagen que me han pedido desde la Biblioteca, pero no es para tí, pásasela. ¡Oh, no! Así que en mi Servidor sólo habrá dos opciones: INPUT y OUTPUT.
  • Esos datos viajan por los cables y por los circuitos encerrada en paquetes... La imagino como la medicina que va dentro de las cápsulas que nos dan en la Farmacia... de esas que llevan escrito en el exterior, en letras muy pequeñas, una información sobre lo que va dentro. Bueno, pues por lo visto hay tres tipos de cápsulas: paquetes TCP, paquetes UDP y paquetes ICMP. Creo que tiene algo que ver con los protocolos de comunicación TCP/IP y cosas de esa calaña.
  • Dicen que el núcleo de Linux (el kernel, vamos) tiene una capacidad de filtrar esos paquetes (netfilter), pudiendo eliminarlos silenciosamente, sin más (DROP), rechazarlos (REJECT) y anotar información sobre ellos en un archivo de bitácora (LOG).
  • Iptables es el software con el que configuramos esa capacidad de filtrado del núcleo. Bueno, hay un ejecutable que se llama iptables (/sbin/iptables) y también hay un paquete llamado iptables (iptables-xxx.rpm). Cuando configuramos el filtrado de paquetes del núcleo usando iptables se dice que estamos configurando un firewall en nuestro sistema.
  • En algunos sitios, por ahí, le llaman firewall a un script que contiene un conjunto de reglas, con las que gracias al ejecutable iptables le decimos al núcleo: estos paquetes entrantes acéptalos, esos otros recházalos, cuando recibas más de x paquetes por minuto anótalo, ... Cuando ejecutamos ese script las reglas se aplicarán inmediatamente; pero al reiniciarse el equipo esas reglas se pierden y el núcleo ya no las recuerda.
  • Hay herramientas (programas,claro) que escriben personas que saben de esto, que se encargan de escribir esas reglas por nosotros. Nosotros le decimos: tengo un servidor web, y la herramienta solita las traduce a las reglas que entiende iptables y las ejecuta. Y más: guarda esa configuración en uno o varios archivos e incorpora un programita que se iniciará con el próximo arranque; entonces leerá esos ficheros donde ha guardado lo que nosotros le hemos pedido y el núcleo filtrará paquetes desde el principio. A estas herramientas también se les suele llamar firewalls. Aunque en realidad son utilidades que nos permiten configurar el filtrado de paquetes del núcleo a través de iptables... o algo así, ¿no?. ¿Cómo podríamos llamarles? Tal vez "Herramientas de configuración de firewalls mediante interfaces gráficos de usuario, que usan iptables para aprovechar la capacidad de filtrado de paquetes del kernel". Bueno, mejor llamarles firewalls también. Una de esas herramientas es shorewall, otra es firestarter. Ésta, por lo visto, trae incorporado hasta un monitor gráfico que nos va informando de qué conexiones están abiertas, qué ha rechazado, ... Buena para un pc de escritorio.
    Cuando hemos usado drakfirewall: yo le digo a drakfirewall que tengo un servidor web, éste se lo dice a shorewall, shorewall se lía a escribir scripts que incluyen unas opciones para el ejecutable iptables, con las que éste le dice al núcleo: acepta los paquetes entrantes de tipo tcp que vayan dirigidos al 80, que Apache está ahí escuchando, y luego deja salir los que se generen como respuesta a (relacionados con) esos paquetes entrantes. ¡Qué cadena, qué vértigo!

Ya tengo mi script de firewall

Bien, me he empapado de iptables, he visitado la página de Pello, he leído cómos, manuales, y he estudiado algunos de los scripts que hay en LinuxGuruz. Ya lo tengo: mi_firewall.sh. ¿Ahora qué? A continuación los pasos que doy: parar shorewall y mandi, desactivar su inicio al arrancar, ejecutar el script, ver qué reglas se están efectivamente aplicando, salvar permanentemene y por último asegurarme de que iptables se iniciará con cada arranque:

# chkconfig shorewall off
# chkconfig mandi off
# chkconfig --del shorewall
# chkconfig --del mandi
# sh mi_firewall.sh
# iptables -L -n
# iptables-save > /etc/sysconfig/iptables
# chkconfig --add iptables

Actualmente uso un script partiendo de éste con añadidos interesantes de algunos encontrados en LinuxGuruz. Por supuesto y como siempre, antes de aplicarlo en el Servidor he realizado muchas pruebas de funcionamiento en otra máquina con parecidas características.

En posteriores revisiones me planteo añadir un ejemplo comentado en castellano con cierto detalle.

. : .