En Linux el filtrado de paquetes está construido en el kernel (se
habla con más detalle del núcleo de este sistema operativo en la sección
10.6); en la serie 2.2, para poder utilizar ipchains hemos de
compilar el núcleo con las opciones CONFIG/SMALL>_FIREWALL y CONFIG/SMALL>_IP/SMALL>_FIREWALL activadas, mientras que en las 2.4, para iptables, hemos de activar CONFIG/SMALL>_NETFILTER: es toda la
`instalación' (aparte de las herramientas de gestión de espacio de usuario,
que vienen de serie con Linux) que nuestro firewall va a necesitar, de
ahí que en este caso no dediquemos una subsección específica a la
instalación del cortafuegos.
Cuando ya estamos ejecutando un núcleo con el firewalling activado
utilizaremos las herramientas de espacio de usuario ipchains e iptables para insertar y eliminar reglas de filtrado en él;
al tratarse de información dinámica, cada vez que el sistema se reinicie
las reglas establecidas se perderán, por lo que es recomendable crear un
script que se ejecute al arrancar el sistema y que las vuelva a definir.
Para ello nos pueden resultar útiles un par de shellscripts que
acompañan a las herramientas de espacio de usuario: se trata de ipchains-save e ipchains-restore (núcleos 2.2) y de iptables-save
e iptables-restore (núcleos 2.4); en ambos casos, la primera orden
vuelca en pantalla las reglas definidas en el núcleo y la segunda carga
dichas reglas desde un archivo.
El núcleo de Linux agrupa las diferentes reglas definidas por el
administrador en tres listas denominadas chains: input, output y forward (en mayúsculas para los kernels 2.4); en
función de las características de una trama, Linux aplica las reglas
definidas en cada una de estas listas para decidir qué hacer con el paquete.
En primer lugar, al recibir una trama utiliza las reglas de la chain
input (su nombre es autoexplicativo) para decidir si la acepta o no; si
las reglas definidas en esta lista indican que se ha de aceptar el paquete, se
comprueba a dónde ha de enrutarlo, y en el caso de que el destino sea una
máquina diferente al cortafuegos se aplican las reglas de la lista forward para reenviarlo a su destino. Finalmente, la lista output se
utiliza obviamente antes de enviar un paquete por un interfaz de red, para
decidir si el tráfico de salida se permite o se deniega.
Como hemos dicho, los elementos de cada lista se denominan reglas y definen
- junto a los targets, de los que hablaremos a continuación - qué
hacer con los paquetes que cumplen ciertas características; si un paquete
no cumple ninguna de las reglas de la lista que le corresponde, lo mejor si
queremos un sistema seguro es rechazarlo o denegarlo, para lo cual podemos
definir un tratamiento por defecto. Mediante ipchains e iptables
podemos crear listas, modificarlas y eliminarlas17.1 y, lo realmente importante,
definir las reglas para cada lista; para estudiar las opciones de ambas
órdenes se pueden consultar las páginas ipchains(8), ipfw(4),
ipchains-restore(8), ipchains-save(8) e iptables(8).
Cuando un paquete cumple cumple una determinada regla de una chain
definimos qué hacer con él mediante lo que se denomina
`objetivo' o target (quizás una traducción menos literal pero más
clarificadora sería `acción'). Aunque existen más targets, son
tres los que más se suelen utilizar: ACCEPT permite el paso de un
paquete, DENY lo bloquea, y REJECT también lo bloquea pero a
diferencia del anterior envía al origen una notificación mediante un
mensaje ICMP de tipo DEST/SMALL>_UNREACH (siempre que el paquete
bloqueado no sea también de tipo ICMP). Realmente, aunque REJECT
y DENY nos parezcan igual de seguros - y de hecho en la mayoría de
situaciones lo sean - siempre es más recomendable utilizar DENY, ya
que mediante mensajes ICMP un posible atacante podría conseguir
información sobre nuestro entorno que en ciertos casos puede comprometer
nuestra seguridad, tal y como hemos comentado cuando hablábamos de Firewall-1.
© 2002 Antonio Villalón Huerta