2.2. Configuración del núcleo (kernel)

Para ejecutar lo más básico de iptables tienes que configurar las siguientes opciones en el núcleo mientras ejecutas make config o uno de sus comandos relacionados:

CONFIG_PACKET - Esta opción permite que las aplicaciones y las utilidades que lo necesiten puedan trabajar directamente con distintos periféricos de red. Ejemplos de estas utilidades son tcpdump o snort.

Note

En sentido estricto, CONFIG_PACKET no es necesario para que iptables funcione, pero puesto que tiene tantos usos diferentes, he decidido incluirlo. Si crees que no lo necesitas, no lo incluyas.

CONFIG_NETFILTER - Esta opción se requiere cuando vas a utilizar tu ordenador como cortafuegos o como puerta de enlace (gateway) con Internet. En otras palabras, es imprescindible para que funcione cualquier cosa de las que se explican en este tutorial. Entiendo que éso es lo que deseas, ya que estás leyendo el tutorial.

Y, por supuesto, necesitas añadir los controladores (drivers) necesarios para que tus interfases funcionen correctamente, es decir, el adaptador Ethernet y las interfases PPP y SLIP. Todo lo anterior sólo añade un poco de lo más básico de iptables. En realidad no serás capaz de hacer nada realmente productivo, ya que sólo añade la estructura básica al núcleo. Si quieres utilizar las opciones más avanzadas de iptables, tendrás que configurar las opciones necesarias en el núcleo. A continuación te mostraré las opciones disponibles en una versión 2.4.9 básica del núcleo y las explicaré brevemente:

CONFIG_IP_NF_CONNTRACK - Este módulo es necesario para efectuar el seguimiento de las conexiones. El seguimiento de las conexiones lo emplean, entre otros, la traducción de direcciones (NAT) y el enmascaramiento (Masquerading). Si necesitas proteger con un cortafuegos las máquinas de una red local, definitivamente debes marcar esta opción. Por ejemplo, este módulo lo necesita el script rc.firewall.txt para funcionar.

CONFIG_IP_NF_FTP - Este módulo es necesario si quieres hacer seguimiento de conexiones en las conexiones FTP. Puesto que estas conexiones son bastante difíciles de monitorizar en condiciones normales, el conntrack necesita lo que se denomina un asistente y esta opción lo compila en el núcleo. Si no añades este módulo no serás capaz de hacer transferencias FTP correctamente a través del cortafuegos o la puerta de enlace.

CONFIG_IP_NF_IPTABLES - Esta opción es necesaria si quieres realizar algún tipo de filtrado, enmascaramiento (masquerading) o traducción de direcciones (NAT). Añade toda la estructura de identificación de iptables al núcleo. Sin ésto, no serás capaz de hacer nada en absoluto con iptables.

CONFIG_IP_NF_MATCH_LIMIT - Este módulo no es imprescindible, pero se emplea en el ejemplo rc.firewall.txt. Esta opción añade la comparación LIMIT (límite), ofreciendo la posibilidad de controlar el número de paquetes por minuto que se deben comparar, gobernado por la regla adecuada. Por ejemplo, con -m limit --limit 3/minute compararíamos un máximo de 3 paquetes por minuto. Mediante este módulo también podemos evitar ciertos ataques de denegación de servicios (en inglés: Denial of Service attacks, DoS attacks).

CONFIG_IP_NF_MATCH_MAC - Este módulo nos permite comparar paquetes basándonos en las direcciones físicas MAC: cada adaptador de red Ethernet tiene su propia dirección MAC, distinta a la de cualquier otro adaptador, aunque sea de la misma marca y modelo. Así, por ejemplo podremos bloquear paquetes en función de la dirección MAC utilizada y bloquear ordenadores concretos puesto que la dirección MAC de esos ordenadores raramente cambia (ya que raramente se sustituye el adaptador Ethernet por uno nuevo). No se utiliza esta opción ni en el ejemplo rc.firewall.txt ni en ningún otro sitio.

CONFIG_IP_NF_MATCH_MARK - Nos permite utilizar la comparación MARK. Por ejemplo, podemos utilizar el objetivo MARK para marcar paquetes, de forma que más adelante se puedan comparar y filtrar paquetes dependiendo de si tienen la marca o no. De hecho esta opción es la comparación MARK y más adelante veremos el objetivo MARK.

CONFIG_IP_NF_MATCH_MULTIPORT - Este módulo permite que comparemos paquetes con un amplio rango de puertos de origen o de destino. Normalmente ésto no sería posible, pero con este módulo sí lo es.

CONFIG_IP_NF_MATCH_TOS - Con esta comparación podemos comparar paquetes en base a su campo TOS, es decir, su Tipo de Servicio (Type Of Service). El tipo de servicio se puede establecer mediante determinadas reglas en la tabla mangle y mediante los comandos ip/tc.

CONFIG_IP_NF_MATCH_TCPMSS - Esta opción nos ofrece la posibilidad de comparar los paquetes TCP en función de su campo MSS.

CONFIG_IP_NF_MATCH_STATE - Aquí tenemos una de las mayores novedades respecto a ipchains. Con este módulo podemos realizar comparaciones por flujos de paquetes (stateful matching). Por ejemplo, si en una conexión TCP ya hemos visto tráfico en dos direcciones, los paquetes que les sigan serán considerados como ESTABLISHED (establecido), aplicándoles por éllo las mismas acciones que a los paquetes que iniciaron el flujo. Este módulo se usa ampliamente en el ejemplo rc.firewall.txt.

CONFIG_IP_NF_MATCH_UNCLEAN - Este módulo nos brinda la posibilidad de comparar paquetes IP, TCP, UDP e ICMP que no cumplen con las normas o son inválidos. En condiciones normales se desecharán estos paquetes, pero nunca sabremos si son legítimos o no. Además, ten en cuenta que esta comparación todavía está en fase experimental y puede que no funcione correctamente en todos los casos.

CONFIG_IP_NF_MATCH_OWNER - con esta opción tendremos la oportunidad de comparar en base al propietario de la conexión. Por ejemplo, podremos permitir acceso a Internet únicamente al usuario "root". Este módulo se escribió para mostrar lo que se podía lograr con el nuevo iptables. Ten en cuenta que esta comparación es experimental y puede que no le funcione bien a todo el mundo.

CONFIG_IP_NF_FILTER - este módulo añade la tabla filter básica que permitirá efectuar el filtrado IP. En la tabla filter encontraremos las cadenas INPUT, FORWARD y OUTPUT. Este módulo es necesario si pretendemos hacer algún tipo de filtrado en los paquetes que recibamos y/o enviemos.

CONFIG_IP_NF_TARGET_REJECT - este objetivo nos permite especificar que se debe enviar un mensaje de error ICMP como respuesta a los mensajes entrantes, en lugar de simplemente desecharlos e ignorarlos. Ten en cuenta que las conexiones TCP, al contrario que las ICMP y las UDP, siempre se reinician o rechazan con un paquete TCP RST.

CONFIG_IP_NF_TARGET_MIRROR - sirve para permitir a los paquetes que sean devueltos ("rebotados") al remitente. Por ejemplo, si configuramos un objetivo MIRROR en el puerto de destino HTTP, en nuestra cadena INPUT, y alguien intenta acceder a este puerto, le devolveremos sus paquetes y como resultado probablemente acabará viendo su propia pagina web inicial (homepage).

CONFIG_IP_NF_NAT - este módulo permite que se efectúe la traducción de dirección de red (network address translation), o NAT, en sus diferentes variantes. La opción nos da acceso a la tabla nat en iptables y es necesaria si queremos hacer reenvío a puertos (port forwarding), enmascaramiento (masquerading), etc. Ten en cuenta que esta opción no es imprescindible para el cortafuegos y el enmascaramiento de una LAN, pero deberías tenerlo activo a no ser que seas capaz de asignar direcciones IP únicas para cada uno de los hosts. Así pues, esta opción es necesaria para que el script de ejemplo rc.firewall.txt funcione correctamente, y es ciertamente imprescindible si no puedes asignar direcciones IP únicas a cada host.

CONFIG_IP_NF_TARGET_MASQUERADE - este módulo añade el objetivo MASQUERADE. Por ejemplo, si no sabemos qué dirección IP tenemos para conectar a Internet, ésta será la forma ideal de conseguir la IP en vez de utilizar DNAT o SNAT. En otras palabras, si utilizamos DHCP, PPP, SLIP o cualquier otra conexión que nos asigne una IP, necesitamos utilizar este objetivo en lugar de SNAT. El enmascaramiento produce una carga en el sistema algo mayor que NAT, pero funcionará sin que necesitemos conocer previamente la dirección IP.

CONFIG_IP_NF_TARGET_REDIRECT - este objetivo es útil al emplearlo junto a proxies de aplicación, por ejemplo. En vez de dejar simplemente que el paquete pase, lo remapeamos para que se dirija a nuestra máquina local. En otras palabras, de esta forma tenemos la posibilidad de crear un proxy transparente.

CONFIG_IP_NF_TARGET_LOG - esta opción añade el objetivo LOG y su funcionalidad a iptables. Podemos utilizar este módulo para registrar determinados paquetes en el syslogd y así ver qué les está pasando. Ésto sólo ya es inestimable de cara a las auditorías de seguridad, forenses o de depuración de errores del script que estés escribiendo.

CONFIG_IP_NF_TARGET_TCPMSS - esta opción se puede emplear para evitar a los Proveedores de Servicios de Internet (ISPs) y a los servidores que bloquean los paquetes "ICMP Fragmentation Needed". Los efectos de esta acción pueden ser páginas web que no lleguen, pequeños correos que sí lleguen mientras que los grandes no lo consigan, las conexiones ssh funcionan pero las conexiones scp se pierden ("mueren") tras el saludo inicial, ... En estos casos podemos utilizar el objetivo TCPMSS para superar el problema ajustando nuestro MSS (tamaño máximo de segmento) al PMTU (Path Maximum Transmit Unit, unidad máxima de transmisión). De esta forma seremos capaces de trabajar con lo que los autores de Netfilter llaman (en la ayuda para la configuración del kernel) "criminally brain-dead ISPs or servers", algo así como "servidores o ISPs absolutamente descerebrados".

CONFIG_IP_NF_COMPAT_IPCHAINS - añade un modo de compatibilidad con el obsoleto ipchains. No confíes en este módulo como solución a largo plazo para resolver la migración de los núcleos 2.2 a los 2.4, ya que es probable que desaparezca con la llegada del núcleo 2.6.

CONFIG_IP_NF_COMPAT_IPFWADM - módulo de compatibilidad con el obsoleto ipfwadm. Ni se te ocurra recurrir a este módulo como solución a largo plazo.

Como puedes observar hay un buen puñado de opciones. Acabo de explicar brevemente los tipos de comportamiento extras que puedes esperar con cada módulo, aunque sólo se trata de las opciones disponibles en un núcleo 2.4.9 simple, sin ningún extra. Si quieres ver más opciones, te recomiendo que mires las funciones existentes en el "patch-o-matic" (POM) de la zona de usuario de Netfilter, pues encontrarás montones de opciones extras para el núcleo. Los parches del POM son opciones extra que supuestamente se añadirán al núcleo en el futuro, pero que todavía no se han desarrollado lo suficiente como para añadírselos. Las razones pueden ser variadas, como que el parche todavía no sea estable, o que Linus Torvalds no pueda mantenerlo, o incluso que no quiera introducir el parche en el desarrollo del núcleo por ser todavía experimental.

Necesitarás tener compiladas en el núcleo las opciones siguientes, o bien tenerlas como módulos, para que el script rc.firewall.txt pueda funcionar. Si necesitas ayuda acerca del resto de opciones necesarias para los otros scripts, léete el capítulo sobre los scripts de ejemplo.

Como mínimo necesitarás lo anterior para utilizar el script rc.firewall.txt. Para el resto de scripts explicaré lo que necesitan en sus respectivas secciones. Por el momento intentemos centrarnos en el ejemplo principal.