lunes, 29 de febrero de 2016

ifstated - OpenBSD



Ifstated es un daemon, para entornos BSD, que puede ejecutar comandos en respuesta a cambios en el estado de las interficies.
El estado de las mismas puede determinarse monitoreando el estado del link o ejecutando comandos externos.
Ifstated tiene definidos 3 estados posibles para un link :

up: la interficie física tiene conexión activa. Para un interficie carp representa el estado master.
down: la interficie física no tiene conexión activa. Para una interficie carp representa el estado backup.
unknown: no se puede determinar el estado de la conexión física. Para una interficie carp representa el estado init.

Esta información por si sola es insuficiente ya que podemos tener link hacia el router, pero este a su vez no tener conexión hacia internet. Necesitamos una herramienta externa para poder verificar esta conexión. Ifstated nos permite ejecutar comandos externos, con los resultados obtenidos podremos determinar el status actual y cargar las reglas de filtrado oportunas.
Para invocar estas herramientas externas, ifstated nos permiter definir en su archivo de configuración /etc/ifstated.conf macros como la siguiente :
adsl1='(“/sbin/ping -q -c 1 -w 66.102.9.147” every 10)'
Estados en ifstated

Ifstated opera con estados y transiciones. Cada estado tiene un bloque de inicio y un cuerpo. El bloque de inicio, se utiliza para inicializar el estado y se ejecuta cada vez que se ingresa en ese estado. El cuerpo del estado solo se ejecuta cuando el estado es el actual y ocurre un evento. Las acciones a tomar dentro de un bloque de estado se especifican con sentecias if . Estas a su vez pueden ejecutar acciones con el comando run o bien disparar una transcion con set-state. Si no se especifica un estado de inicio, ifstated considerará el primer estado del fichero de configuración como tal.

Ejemplo de bloque :
#Falla ADSL1

  state adsl1down {

  init {
   run “/root/auxiliary/adsl2up”
  }
  if (!$asl1 && $adsl2)
   set-state adsldown
  if ($adsl1 && !$adsl2)
   set-state adsl2down
  if (!$adsl1 && !$adsl2)
   set-state bothdown
  }
En el estado de ejemplo se ejecuta un script llamado adsl2up con un comando run. Solo cambiará de estado si se cumple una de las 3 condiciones if. Script adsl2up :
#!/bin/bash

/sbin/pfctl -a ifstated -f /root/auxiliary/adsl2up.rules
link_bal
Este script invoca un fichero llamado adsl2up.rules con reglas que se cargarán en el firewall. Para evitar tener que cargar todas las reglas de nuevo utilizamos el comando :
pfctl -a ifsated -f
Pf (Packet Filter) puede cargar y descargar reglas adicionales en puntos denominados anchors evitando así tener que recargar todo el fichero de configuración. Como paso previo habremos definido anteriormente en el fichero /etc/pf.conf un punto de montaje con un anchor llamado en este caso ifstated. Fichero adsl2up.rules :
ext_if=”fxp0”
int_if=”fxp1”
aux_if=”fxp3”
gw1=”10.0.1.1”

pass in quick on $int_if route-to {($aux_if $gw1)} from any to any keep state
En el archivo de reglas es imprescindible volver a definir las macros que identifican a las interficies físicas. La orden route-to será la que nos permita enrutar hasta la interficie deseada. Su sintaxis es la siguiente :
route-to {(interficie destino   siguiente salto)}
Como herramientas de testeo externo utilizaremos siempre, salvo raras excepciones, el comando ping. Colocaremos siempre el flag de tiempo wait con 1 o 2 segundos : -w 1 Y el flag quiet output -q para recibir unicamente el resumen como respuesta.
ping -q -w 2 216.239.59.103
Jordi Cabrera
pdf

No hay comentarios:

Publicar un comentario en la entrada