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
usesPort
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:
preroutingLas 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.
postroutingLas 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.
forwardLas 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.
inputLas 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.
outputLas 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.
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.