Product SiteDocumentation Site

14.2. Firewall o el filtrado de paquetes

Un firewall es una puerta de enlace de la red con filtro y sólo es eficaz en aquellos paquetes que deben pasar a través de ella. Por lo tanto, sólo puede ser eficaz cuando la única ruta para estos paquetes es a través del firewall.
La falta de una configuración estándar (y el lema «proceso, no producto») explica la falta de una solución preconfigurada. Hay, sin embargo, herramientas que facilitan la configuración del firewall netfilter, con una representación gráfica de las reglas de filtrado. fwbuilder es sin duda uno de los mejores de ellos.
El núcleo Linux incorpora el firewall netfilter. Puede controlarlo desde el espacio de usuario con los programas iptables e ip6tables. La diferencia entre estos dos programas es que el primero actúa sobre la red IPv4, mientras que el segundo actúa sobre IPv6. Debido a que ambas pilas de protocolos de red probablemente continuarán con nosotors durante muchos años, ambas herramientas son necesarias y deberán ser utilizadas en paralelo.

14.2.1. Comportamiento de netfilter

netfilter utiliza cuatro tablas distintas que almacenan las reglas que regulan tres tipos de operaciones sobre los paquetes:
  • filter se refiere a las reglas de filtrado (aceptar, rechazar o ignorar un paquete);
  • nat se refiere a la traducción de las direcciones de origen o destino y puertos de los paquetes;
  • mangle se refiere a otros cambios en los paquetes IP (incluyendo el campo ToS — tipo de servicio: «Type of Service» — y opciones);
  • raw permite otras modificaciones manuales en los paquetes antes de que lleguen al sistema de seguimiento de conexiones.
Cada tabla contiene listas de reglas llamadas cadenas. El firewall utiliza cadenas estándar para manejar paquetes en función de circunstancias predefinidas. El administrador puede crear otras cadenas, que sólo se utilizarán cuando una cadena estándar haga referencia a ellas (ya sea directa o indirectamente).
La tabla filter tiene tres cadenas estándar:
  • INPUT: se refiere a paquetes cuyo destino es el propio firewall;
  • OUTPUT: se refiere a los paquetes que emite el firewall;
  • FORWARD: se refiere a los paquetes que transitan a través del firewall (que no es ni su origen ni su destino).
La tabla nat también tiene tres cadenas estándar:
  • PREROUTING: para modificar los paquetes tan pronto como llegan;
  • POSTROUTING: para modificar los paquetes cuando están listos para seguir su camino;
  • OUTPUT: para modificar los paquetes generados por el propio firewall.
Cómo llamar a las cadenas de netfilter

Figura 14.1. Cómo llamar a las cadenas de netfilter

Cada cadena es una lista de reglas, cada regla es un conjunto de condiciones y una acción que se ejecutará cuando se cumplan las condiciones. Cuando se procesa un paquete, el firewall examina la cadena apropiada, una regla tras otra; cuando se cumplen las condiciones de una regla «salta» (de ahí la opción -j en las órdenes) a la acción especificada para continuar el procesamiento. Los comportamientos más comunes están estandarizados y existen acciones dedicadas para ellos. Tomar una de estas acciones estándar interrumpe el procesamiento de la cadena ya que el destino del paquete ya está sellado (salvo una excepción que se menciona a continuación):
  • ACCEPT: permitir al paquete seguir su camino;
  • REJECT: rechazar el paquete con un paquete de error ICMP (la opcion --reject-with tipo de iptables permite seleccionar el tipo de error);
  • DROP: borrar (ignorar) el paquete;
  • LOG: registrar (a través de syslogd) un mensaje con una descripción del paquete; tenga en cuenta que esta acción no interrumpe el procesamiento y la ejecución de la cadena continúa con la regla siguiente, razón por la que registrar los paquetes rechazados necesita una regla LOG y una regla REJECT/DROP;
  • ULOG: registrar un mensaje a través de ulogd, que puede adaptarse mejor y más eficientemente que syslogd para manejar de grandes cantidades de mensajes; tenga en cuenta que esta acción, al igual que LOG, también continúa el procesamiento de la siguiente regla en la cadena que la llamó;
  • nombre_de_cadena: saltar a la cadena dada y evaluar sus reglas;
  • RETURN: interrumpir el procesamiento de la cadena actual y regresar a la cadena que la llamó; en el caso de que la cadena actual sea una estándar no hay cadena que la haya llamado, por lo que en su lugar se ejecutará la acción predeterminada (definida con la opción -P de iptables);
  • SNAT (unicamente en la tabla nat: aplicar NAT de origen (las opciones adicionales describen los cambios exactos que se aplicarán);
  • DNAT (unicamente en la tabla nat): aplicar NAT de destino (las opciones adicionales describen los cambios exactos que se aplicarán);
  • MASQUERADE (unicamente en la tabla nat: aplicar enmascaramiento (un caso especial de NAT de origen);
  • REDIRECT (unicamente en la tabla nat: redirigir un paquete a un puerto determinado del mismo firewall, puede utilizar esto para configurar un proxy web transparente que funciona sin ninguna configuración en el lado del cliente, dado que el cliente piensa que se conecta con el destinatario mientras que las comunicaciones realmente pasan por el proxy.
Otras acciones, en particular las relativas a la tabla mangle, están fuera del alcance de este texto. Podrá encontrar una lista completa en iptables(8) y ip6tables(8).

14.2.2. Sintaxis de iptables e ip6tables

Los programas iptables e ip6tables permiten manipular las tablas, cadenas y reglas. Su opción -t tabla indica en qué tabla operar (la tabla filter de forma predeterminada).

14.2.2.1. Órdenes

La opción -N cadena crea una nueva cadena. La opción -X cadena elimina una cadena vacía y sin uso. La opción -A cadena regla añade una regla al final de la cadena dada. La opción -I cadena número_regla regla inserta una regla antes de la regla con número número_regla. La opción -D cadena número_regla (o -D cadena regla) elimina una regla en una cadena, la primera sintaxis identifica la regla que se desea eliminar por su número, mientras que la segunda la identifica por su contenido. La opción -F cadena vacía una cadena (borra todas sus reglas), si no menciona ninguna cadena, eliminará todas las reglas de la tabla. La opción -L cadena muestra las reglas de la cadena. Por último, la opción -P cadena acción define la acción predeterminada o «política» para una cadena dada; tenga en cuenta que sólo las cadenas estándar puede tener dicha política.

14.2.2.2. Reglas

Cada regla es expresada como condiciones -j acción opciones_acción. Si describe varias condiciones en la misma regla, entonces el criterio es la conjunción (y lógico) de las condiciones, que son al menos tan restrictivas como cada condición individual.
La condición -p protocolo coincide con el campo de protocolo del paquete IP. Los valores más comunes son tcp, udp, icmp e icmpv6. Anteponer la condición con un signo de exclamación niega la condición, la cual se coincidirá con «todos los paquetes con un protocolo distinto al especificado». Este mecanismo de negación no es específico de la opción -p y se puede aplicar a todas las otras condiciones también.
La condición -s dirección o -s red/máscara coincide con la dirección de origen del paquete. Correspondientemente, -d dirección o -dred/máscara coincide con la dirección de destino.
La condición -i interfaz selecciona los paquetes procedentes de la interfaz de red dada. -o interfaz selecciona los paquetes que salen a través de una interfaz específica.
Hay condiciones más específicas, dependiendo de las condiciones genéricas descriptas anteriormente. Por ejemplo, puede completementar la condición -p tcp con condiciones sobre los puertos TCP, cláusulas como --source-port puerto y --destination-port puerto.
La condición --state estado coincide con el estado de un paquete en una conexión (necesitará el modulo de núcleo ipt_conntrack para el seguimiento de conexiones). El estado NEW describe un paquete que inicia una nueva conexión; ESTABLISHED coincide con paquetes pertenecientes a una conexión ya existente y RELATED coincide con paquetes iniciando una nueva conexión relacionada con una ya existente (lo cual es útil para las conexiones ftp-data en el modo «activo» del protocolo FTP).
En la sección anterior se enumeran las acciones disponibles, pero no sus opciones respectivas. Por ejemplo, la acción LOG tiene las siguientes opciones:
  • --log-priority, con un valor predeterminado de warning, indica la severidad de los mensajes syslog;
  • --log-prefix permite especificar un prefijo de texto para diferenciar los mensajes registrados;
  • --log-tcp-sequence, --log-tcp-options y --log-ip-options indican datos adicionales que se integrarán en el mensaje: el número de secuencia TCP, opciones TCP y las opciones IP, respectivamente.
La acción DNAT ofrece la opción --to-destination dirección:puerto para indicar la nueva dirección IP y/o puerto de destino. De manera similar, SNAT proporciona --to-source dirección:puerto para indicar la nueva dirección IP y/o puerto de origen.
La acción REDIRECT (sólo disponible is NAT está dispnible) ofrece la opción --to-ports puerto(s) para indicar el puerto o rango de puertos al que debe redirigir los paquetes.

14.2.3. Creación de reglas

Cada creación de una regla requiere una invocación de iptables/ip6tables. Escribir estas órdenes de forma manual puede ser tedioso, por lo que las llamadas se suelen almacenar en un script para definir la misma configuración automáticamente cada vez que arranque la máquina. Puede escribir este script a mano, pero también puede ser interesante prepararlo con una herramienta de alto nivel como fwbuilder.
# apt install fwbuilder
El principio es simple. En el primer paso, es necesario describir todos los elementos que intervendrán en las reglas:
  • el propio firewall, con sus interfaces de red;
  • las redes, con sus rangos de direcciones IP correspondientes;
  • los servidores;
  • los puertos pertenecientes a los servicios alojados en los servidores.
Luego puede crear las reglas simplemente arrastrando y soltando acciones en los objetos. Unos cuantos menús contextuales pueden cambiar la condición (negarla, por ejemplo). A continuación, deberá elegir la acción y configurarla.
En cuanto a IPv6, puede crear dos conjuntos de reglas diferentes para IPv4 e IPv6, o crear sólo una y dejar que fwbuilder traduzca las reglas según las direcciones asignadas a los objetos.
Ventana principal de fwbuilder

Figura 14.2. Ventana principal de fwbuilder

Luego fwbuilder puede generar un script de configuración del firewall según las reglas que definió. Su arquitectura modular le da la capacidad para generar scripts dirigidos a diferentes sistemas (iptables para Linux, ipf para FreeBSD y pf para OpenBSD).

14.2.4. Instalación de las reglas en cada arranque

En otros casos, la forma recomendada es registrar el script de configuración en una directiva up del archivo /etc/network/interfaces. En el siguiente ejemplo, el script está guardado como /usr/local/etc/arrakis.fw.

Ejemplo 14.1. archivo interfaces llamando al script del firewall

auto eth0
iface eth0 inet static
    address 192.168.0.1
    network 192.168.0.0
    netmask 255.255.255.0
    broadcast 192.168.0.255
    up /usr/local/etc/arrakis.fw
Esto obviamente asume que se está utilizando ifupdown para configurar las interfaces de red. Si se está utilizando alguna otra cosa (como NetworkManager o systemd-networkd), entonces se debe consultar la documentación respectiva para averiguar cómo ejecutar un script después de que se levante la interfaz de red.