La mayoría de los aspectos de GNU/Linux evolucionan para satisfacer las cada vez mayores demandas de sus usuarios; el cortafuegos de IP no es una excepción. La implementación del cortafuegos de IP tradicional resulta suficiente para la mayoría de las aplicaciones, pero puede resultar engorroso y poco eficiente para configurar en entornos complejos. Para resolver este problema, se desarrolló un nuevo método de configuración del cortafuegos de IP así como nuevas características relacionadas. Este nuevo método fue denominado “Cortafuegos 'IP Chains'[1]” y fue liberado por vez primera para uso general en el núcleo 2.2.0.
El soporte del cortafuegos 'IP Chains' fue desarrollado por Paul Russell y Michael Neuling[2]. Paul es el autor del documento sobre 'IP Chains' IPCHAINS-HOWTO.
El cortafuegos 'IP Chains' le permite desarrollar clases de reglas de cortafuegos a las que puede entonces añadir y quitar 'hosts' o redes. Una consecuencia colateral del encadenamiento de reglas de cortafuegos es que puede mejorar el rendiminento del cortafuegos en aquellas configuraciones en las que haya montones de reglas.
El cortafuegos 'IP Chains' está soportado por las series de núcleos 2.2 y también se encuentran disponibles como un parche para la series de núcleos 2.0.*. El HOWTO describe dónde obtener el parche y proporciona montones de pistas útiles sobre cómo utilizar de forma efectiva la utilidad de configuración ipchains.
Existen dos formas de emplear la utilidad ipchains. La primera forma consiste en utilizar el guión de "shell" ipfwadm-wrapper, que es básicamente un sustituto de la orden ipfwadm y que llama por debajo al programa ipchains. Si esto es lo que desea, no siga leyendo y relea las secciones previas que describen ipchains, poniendo ipfwadm-wrapper en su lugar. Esto funcionará, pero no se garantiza que el guión se mantenga en un futuro, y en ese caso no dispondrá de las características avanzadas que el cortafuegos 'IP Chains' vaya a ofrecer.
La segunda forma de utilizar ipchains consiste en aprender su nueva sintaxis y modificar cualquier configuración existente que exija utilizar la nueva sintaxis en lugar de la antigua. Con algunas consideraciones cuidadosas, se dará cuenta de que puede optimizar su configuración a la vez que realiza la conversión. La sintaxis de ipchains es más fácil de aprender que la de ipfwadm, por lo que resultará una buena opción.
La orden ipfwadm manipulaba tres conjuntos de reglas para el propósito de configurar el cortafuegos. Con el cortafuegos 'IP Chains', podrá crear un número arbitrario de conjuntos de reglas, cada una enlazada con otra, pero siguen estando presentes siempre tres conjuntos de reglas relacionadas con la función del cortafuegos. Los conjuntos de reglas estándares son los directos equivalentes de los utilizados con ipfwadm, exceptuando el hecho de que ahora tiene nombre: input, forward y output.
Veamos primero la sintaxis general de la orden ipchains, después se verá como utilizar ipchains en lugar de ipfwadm sin preocuparse acerca de sus características avanzadas de encadenamiento. Se hará reutilizando nuestros ejemplos anteriores
La sintaxis de la orden ipchains es bastante directa. Se contemplarán los ejemplos más importantes. La sintaxis general de la mayoría de las órdenes de ipchains es:
|| ipchains orden especificación_de_regla opciones ||
Existen diversas formas de manipular las reglas y conjuntos de reglas con la orden ipchains. Las relevantes para la funcionalidad de cortafuegos de IP son:
-A cadena
Añade una o más reglas al final de la cadena especificada. Si se proporciona un nombre de 'host' como origen o destino que se resuelve a más de una dirección IP, entonces se añade una regla por cada una de las direcciones.
-I cadena numero_de_regla
Inserta una o más reglas al principio de la cadena especificada. De nuevo, si se proporciona un nombre de 'host', se añade una regla por cada dirección que se resuelva.
-D cadena
Elimina una o más reglas de la cadena especificada que coincida con la especificación de regla.
-D cadena número_de_regla
Elimina la regla ubicada en la posición número_de_regla de la cadena especificada. Las posiciones de reglas comienzan por uno en la primera regla de la cadena.
-R cadena número_de_regla
Reemplaza la regla ubicada en la posición número_de_regla de la cadena especificada por la especificación de regla proporcionada.
-C cadena
Comprueba el datagrama que se describe con la especificación de la regla contra la cadena especificada. Esta orden devuelve un mensaje que describe cómo se procesará el datagrama por la cadena. Esto resulta muy útil para comprobar la configuración del cortafuegos, por lo que se verán más detalles un poco más adelante.
-L [cadena]
Muestra las reglas de la cadena especificada, o de todas las cadenas si no se especifica ninguna.
-F [cadena]
Elimina todas las reglas de la cadena especificada, o de todas las cadenas si no se especifica ninguna.
-Z [cadena]
Establece a cero los contadores de datagramas y bytes de la cadena especificada, o de todas las cadenas si no se especifica ninguna.
-N cadena
Crea una nueva cadena con el nombre especificado. No puede existir una cadena con el mismo nombre. Así es como se crean las cadenas de usuario.
-X [cadena]
Elimina la cadena de usuario especificada, o todas las cadenas de usuario especificadas si no se especifica ninguna cadena. Para que esta orden tenga éxito, no deben existir referencias de ninguna otra cadena de reglas a la cadena especificada.
-P política_de_cadena
Establece la política por defecto de la cadena especificada a la política especificada. Las políticas de cortafuegos válidas son ACCEPT, DENY, REJECT, REDIR, o RETURN. ACCEPT, DENY, y REJECT tienen los mismo significados que las políticas correspondientes de la implentación tradicional del cortafuegos de IP. REDIR especifica que se debe redirigir de forma transparente el datagrama a un puerto del 'host' del cortafuegos. La política RETURN causa que el código del cortafuegos de IP vuelva a la cadena de cortafuegos que hizo la llamada a la que contiene esta regla y que continúe empezando por la regla situada tras la regla que hizo la llamada.
Ciertos parámetros de ipchains crean una especificación de reglas al determinar qué tipos de paquetes coinciden. Si se omite algunos de esos parámetros de la especificación de una regla, se asumen sus valores por omisión.
-p [!]protocolo
Especifica el protocolo del datagrama que buscar coincidencias coná con esta regla. Los protocolos válidos son: tcp, udp, icmp, o todos. También puede especificarse un número de protocolo para buscar coincidencias con con otros protocolos. Por ejemplo, se puede utilizar el 4 para buscar coincidencias con el protocolo de encapsulamiento ipip. Si se proporciona el signo !, entonces la regla es negativa y el datagrama buscar coincidencias coná con cualquier protocolo que no sea el especificado. Si no se especifica este parámetro, se asumirá por omisión el valor all.
-s [!]dirección[/máscara] [!] [puerto]
Especifica la dirección de origen y el puerto del datagrama que buscar coincidencias coná con este regla. La dirección puede proporcionarse como un nombre de 'host', un nombre de red o una dirección de IP. El argumento opcional máscara es la máscara de red que se utilizará y puede ser proporcionada en la forma tradicional (e.g.,/255.255.255.0) o en la forma moderna (e.g., /24). El argumento opcional puerto especifica el puerto de TCP o UDP, o el tipo de datagrama de ICMP que buscar coincidencias coná. Se puede proporcionar una especificación de puerto sólamente si se ha proporcionado el párametro -p con uno de los protocolos tcp, udp, o icmp. Se puede especificar los puertos en la forma de un rango, especificando los límites inferior y superior con el signo : como delimitador. Por ejemplo, 20:25 describe todos los puertos que van desde el 20 hasta el 25 incluyendo ambos. De nuevo, el signo ! puede utilizarse para negar los valores.
-d [!]dirección[/máscara] [!] [puerto]
Especificar la dirección y el puerto de destino del datagrama que buscar coincidencias coná con esta regla. La codificación de este parámetro es la misma que la del parámetro -s.
-j blanco
Especifica la acción que se tomará cuando se coincida con esta regla. Puede pensarse en este parámetro como con el significado de “salta a.” Los blancos válidos son en principio las políticas ACCEPT, DENY, REJECT, REDIR, y RETURN. Se describieron sus significados más arriba. Sin embargo, también puede proporcionarse el nombre de una cadena de usuario, y será por donde el proceso continuará. Si se omite este parámetro, no se tomará ninguna acción sobre los datagramas coincidentes con la regla exceptuando la actualización de los contadores de datagrams y de bytes.
-i [!]nombre_de_interfaz
Especifica la interfaz por la que se recibió o va a transmitirse el datagrama. De nuevo, el signo ! invierte el resultado de la coincidencia. Si el nombre de la interfaz acaba con un signo + entonces cualquier interfaz que comience con la cadena proporcionada buscar coincidencias coná. Por ejemplo, -i ppp+ buscar coincidencias coná con cualquier dispositivo de red de PPP y -i ! eth+ con todas las interfaces excepto las correspondientes a dispositivos de Ethernet.
[!] -f
Especifica que esta regla se aplica a todo excepto al primer fragmento del un datagrama fragmentado.
Opciones
Las siguientes opciones de ipchains son más generales por naturaleza propia. Algunas de ellas controlan características bastante esotéricas del 'software' de 'IP Chains':
-b
Fuerza a que la orden genere dos reglas. Una ajusta el parámetro proporcionado y la otra regla añadida coincide con los parámetros en el sentido contrario.
-v
Causa que ipchains sea más explícito en su salida. Proporcionará más información.
-n
Causa que ipchains muestre las direcciones de IP y los números de puertos en forma de números sin intentar resoverlos contra sus correspondientes nombres.
-l
Habilita el registro del núcleo de los datagramas coincidentes. Cualquier datagrama que coincida con la regla será registrado por el núcleo utilizando su función printk, con lo que este registro será gestionado habitualmente por el programa sysklogd y escrito a un fichero de registro. Esto resulta muy útil para hacer visibles datagramas poco usuales.
-o[tamaño_máximo]
Causa que el 'software' de 'IP Chains' copie cualquier datagrama coincidente con la regla al dispositivo “netlink” del espacio de usuarios. El argumento de tamaño_máximo limita el número de bytes que se pasarán desde cada datagrama al dispositivo netlink. Esta opción resulta de la mayor utilidad para los desarrolladores de 'software', pero puede que sea aprovechada por paquetes de 'software' en el futuro.
-m valor_de_marca
Causa que los datagramas coincidentes sean marcados con un valor. Los valores de las marcas son números de 32 bits sin signo. En las implementaciones actuales esto no hace nada, pero en algún momento en el futuro puede que sirvan para determinar cómo otro 'software', como un código de encaminamiento, tratará al datagrama. Si un valor de una marca comienza con el signo + o con el signo -, el valor se añade o se substrae del valor actual de la marca.
-t máscara_and máscara_xor
Le permite manipular los bits del “tipo de servicio” de la cabecera de IP de cualquier datagrama que coincida con esta regla. Los bits de tipo de servicio son utilizados por los encaminadores inteligentes para gestionar la prioridad de los datagramas antes de reenviarlos. El software de encaminamiento de GNU/Linux es capaz de realizar este tipo de asignación de prioridades. La máscara_and y la máscara_xor representar máscaras de bits con las que se realizarán respectivamente un AND lógico o un OR lógico con los bits del tipo de servicio del datagrama. Esto constituye una característica avanzada que se discute con más detalle en el IPCHAINS-HOWTO.
-x
Fuerza que los números de salida de ipchains aparezcan con sus valores exactos sin ninguna aproximación.
-y
Causa que la regla coincida con cualquier datagrama de TCP cuyo bit SYN valga 1 y los bits ACK y FIN lleven un valor de 0. Esto se utiliza para filtrar las peticiones de conexión de TCP.