Cuando se implementa un firewall utilizando ipfw en sistemas FreeBSD, ocurre que se cierran todas las conexiones establecidas cada vez que se reinicia el firewall. Esto se debe a que el servicio ejecuta ipfw flush, eliminando así todas las reglas existentes, para luego crearlas nuevamente.

El inconveniente al ejecutar ipfw flush sobre una sesión SSH, es que la conexión se cierra inmediatamente, provocando la desconexión con el servidor.

Sin embargo es posible evitar esto de forma simple pues ipfw cuenta con un ruleset especial. Todas las reglas pertenecientes al set 31 son ignoradas por el subcomando flush.

De acuerdo al manual de ipfw:

Set 31 is special in that it cannot be disabled, and rules in set
31 are not deleted by the ipfw flush command (but you can delete
them with the ipfw delete set 31 command).  Set 31 is also used
for the default rule.

Entonces, si al momento de crear las reglas que permiten el tráfico SSH entrante, éstas se asignan al set 31, no serán borradas cuando se ejecute ipfw flush, por ende las sesiones SSH no serán cerradas.

Ahora bien, si se desea evitar acumular reglas repetidas cada vez que se reiniciae el firewall (service ipfw restart), es posible verificar que la regla no exista antes de crearla, utilizando un simple condicional:

ipfw list | grep 'dst-port 2222 out' > /dev/null 2>&1
if [ $? -ne 0 ] ; then
   ipfw -q add 00666 set 31 allow tcp from any to any 2222 out via em0 setup keep-state
fi

Cabe destacar que para que la redirección de la standard error (2>&1) funcione correctamente es necesario utilizar la shell sh:

#!/bin/sh

Referencias

man ipfw


Tal vez pueda interesarte


Compartí este artículo