4.4. Módulo firewall

Los módulos firewall necesitan permitir que otros módulos inserten reglas NAT y de filtrado a medida. Tiene un API limitado que permite a los módulos modificar las reglas de filtrado. Por ejemplo, si un módulo necesita conectar a servidores HTTP de internet, llamaría a addOutputRule y el firewall abriría los puertos necesarios.

Sin embargo, este mecanismo no es muy flexible desde que hay módulos con necesidades muy específicas. El módulo squid necesita configurar varias reglas NAT y de filtrado para su funcionar transparentemente.

La clase EBox::FirewallObserver fue creada para estos casos más complejos. Cuando el firewall se reinicia pide a todos los módulos que heredan de EBox::FirewallObserver para ver si necesitan insertar sus propias reglas. Los módulos pueden insertar cualquier regla que quieran, con la sintaxis de iptables. La única cosa que no pueden controlar es donde exactamente son colocadas esas reglas. Los módulos de firewall tienen varios enganches a través de las distintas cadenas y tablas donde ponen estas reglas a medida.

EBox::FirewallObserver define dos funciones:

firewallHelper debería devolver undef (el comportamiento por defecto) o un objeto de tipo EBox::FirewallHelper. Esta clase define varias funciones que deberían devolver reglas que el firewall insertaría en cada uno de los enganches definidos para este propósito.

La sintaxis de las reglas provistas por los módulos es simple: sólo utilizan la misma sintaxis que se usaría en la línea de comandos de iptables, pero excluyendo la cadena, tabla y el comando iptables al principio:

Estas son las funciones definidas en EBox::FirewallHelper, cada uno de ellos para cada tipo distinto de reglas, todos ellos devuelven una referencia a un array que contienen las reglas:

prerouting

Las reglas devueltas por esta función son añadidas a la cadena PREROUTING en la tabla nat. Puedes usarlas para hacer NAT en la dirección de destino de los paquetes.

postrouting

Las reglas devueltas por esta función son añadidas a la cadena POSTROUTING> en la tabla nat. Puedes usarla para hacer NAT en la dirección de origen de los paquetes.

forward

Las reglas devueltas por esta función se añadirán a la cadena FORWARD en la tabla filter. Puedes usarlas para filtrar paquetes a través del firewall.

input

Las reglas devueltas por esta función son añadidas a la cadena INPUT en la tabla filter. Puedes usarlas para filtrar paquetes dirigidos directamente al firewall.

output

Las reglas devueltas por este método son añadidas a la cadena OUTPUT en la tabla filter. Puedes usarlos para filtrar paquetes originados en el propio firewall.

Aviso

Debe ser cauteloso con las reglas del firewall que se escriban, ya que pueden abrir importantes agujeros de seguridad en eBox.

Si necesita más información sobre como iptables y Netfilter trabajan, consulte el Howto de NAT y el Howto de Packet filtering en el sitio web de Netfilter.Ejemplo 4.3 muestra la implementación de la función output en EBox::FirewallHelper definida en el módulo squid.

Ejemplo 4.3. Creando reglas de firewall a medida

sub output
{
        my $self = shift;
        my $sq = EBox::Global->modInstance('squid');
        my @rules = ();
        push(@rules, "-m state --state NEW -p tcp --dport 80 -j ACCEPT");
        push(@rules, "-m state --state NEW -p tcp --dport 443 -j ACCEPT");
        return \@rules;
}

usesPort acepta tres argumentos: protocol, port y network interface. Esta función se usa para preguntar a los módulos si utilizan un puerto tcp o udp concreto. Le permite al firewall conocer si es una buena idea permitir o no la creación de la redirección de un puerto. Devuelve true si el módulo utiliza el puerto dado y undef en otro caso.