Artículo traducido de: http://michiel.vanbaak.info/page/soekrisobsdcarp.htm
Este documento describe la instalación de un soekris net4801 con OpenBSD como firewall redundante. Primero describiré la instalación básica de OpenBSD en el net4801. Después explicaré como instalar las dos cajas como firewall redundante a prueba de errores. Este no es el único método para hacer este tipo de instalación, pero es el que nos ha funcionado.
Acerca de CARP y pfsync
En la mayoría de las redes, el firewall es un único punto de fallo. Cuando el firewall cae, los usuarios de dentro no pueden navegar por la web, el servidor web queda inaccesible para el resto del mundo, y el email queda parado. Desde la versión 3.5, OpenBSD ha introducido unos cuantos componentes que pueden ser usados para resolver este problema, colocando dos firewalls en paralelo. Todo tráfico pasa por el firewall primario; cuando éste falla el firewall de backup asume la identidad del firewall primario, y continua donde éste lo dejó. Las conexiones existentes son preservadas, y el trafico de la red continúa como si nada hubiera pasado.

Usaremos esto para proteger mejor nuesta plataforma de hosting.
Las herramientas
Los dos componentes principales que ofrece OpenBSD son CARP (the Common Address Redundancy Protocol), que permite a un host backup asumir la identidad del primero, y pfsync, que nos asegura que el estado del firewall está sincronizado para que el backup pueda retomar todo exactamente donde el el maestro dejó y no haya perdida de conexiones.
CARP
El Common Address Redundancy Protocol controla los fallos en la intersección de las capas 2 y 3 del modelo OSI (capa enlace y capa IP).*
El maestro de la dirección manda mensajes de aviso CARP via multicast usando el protocolo CARP (protocolo IP 112) de forma regular, y el host backup escucha estos avisos. Si los avisos se detienen, el host backup es advertido. La frecuencia de los avisos es configurable, y el host advertido más frecuentemente será el que se volverá master en caso de fallo.
pfsync
pfsync transfiere los mensajes de estado de inserciones, actualizaciones y borrados entre los firewalls. Cada firewall envia esos mensajes via multicast por la interfaz especificada, usando el protocolo PFSYNC (protocolo 240 IP). También escuchan en esa interfaz mensajes similares de otros firewalls y los importan en la tabla local de estado.
Para garantizar que pfsync conoce el volumen del paquete y la latencia requerida, la implementación inicial no proporciona autentificación. Un atacante con acceso a la subred local (capa enlace) usada para el tráfico pfsync puede fácilmente, añandir, cambiar o borrar estados de los firewalls. Es posible usar pfsync en una red “real”, pero a causa de los riesgos de seguridad, es altamente recomendable que ésta sea una red dedicada y segura para pfsync. Esto es tan simple como usar un cable cruzado entre interfaces de los dos firewalls.
Instalar OpenBSD 4.0
Vaya a la documentalción de OpenBSD para saber como hacer esto.
Un par de cosas difieren de esa descripción. El soekris funciona con un disco CF. Asi que no necesita partición swap. El instalador no continuará si no tiene partición swap. Así que crearemos una con tamaño 1.
Además todo será montado como solo lectura, asi que necesitamos dividir nuestro disco en unas cuantas particiones. Esta configuración se usarán 3.
# disklabel wd0 # Inside MBR partition 3: type A6 start 63 size 2046177 # /dev/rwd0c: type: ESDI disk: ESDI/IDE disk label: SILICONSYSTEMS I flags: bytes/sector: 512 sectors/track: 63 tracks/cylinder: 16 sectors/cylinder: 1008 cylinders: 2030 total sectors: 2046240 rpm: 3600 interleave: 1 trackskew: 0 cylinderskew: 0 headswitch: 0 # microseconds track-to-track seek: 0 # microseconds drivedata: 0 16 partitions: # size offset fstype [fsize bsize cpg] a: 2016945 63 4.2BSD 2048 16384 328 # Cyl 0*- 2000 b: 1 2017008 swap # Cyl 2001 - 2001* c: 2046240 0 unused 0 0 # Cyl 0 - 2029 d: 29231 2017009 4.2BSD 2048 16384 28 # Cyl 2001*- 2029
La partición d se usa para guardar los archivos de configuración como hostname.if y pf.conf. Es usted libre de dejarlos en /etc pero así es como lo hicimos nosotros.
Cuando se le pregunte que sets instalar, teclee:
-* +bsd +base40.tgz +etc40.tgz done
Cuando todo haya sido instalado el instalador le pedirá que apague el sistema. No intente hacerse listo, hagale caso.
Configuración inicial del sistema
Arranque en single user mode. Cuando el prompt de boot de OpenBSD aparezca escriba boot -s. El sistema arrancará y preguntará por unsa shell. Pulse intro para aceptar el sh por defecto.
Ahora vamos a configurar el sistema de ficheros en memoria. Haremos esto porque la Compact Flash es lenta y fallará a menudo cuando haya muchas escrituras en ella. Primero monte el sistema de ficheros raiz y cree el raiz del sistema de ficheros en memoria:
# mount -o rw / # mkdir /mfs
Ahora modifique /etc/rc para configurar y llenar /mfs. Añadiremos las siguientes lineas después de rm -f /flashboot. La linea 203 en la instalación por defecto de 4.0.
# mfs related stuff echo 'mfs: mounting /mfs...' mount_mfs -s 16384 /dev/wd0b /mfs mkdir -p /mfs/var/run mkdir -p /mfs/var/tmp chmod 1777 /mfs/var/tmp cp -Rp /var/log.template /mfs/var/log cp -Rp /var/spool/mqueue /mfs/mqueue cp -Rp /var/spool/clientmqueue /mfs/clientmqueue cp -Rp /var/mail.template /mfs/mail
Edite /etc/mail/sendmail.cf y /etc/mail/submit.cf y cambie las entradas para clientmqueue y mqueue para que apunten a /mfs/{clientmqueue,mqueue}
Ahora moveremos algunos directorios y crearemos enlaces simbólicos a /mfs.
# mv /var/log /var/log.template # mv /var/mail /var/mail.template # rm -rf /tmp # rm -rf /var/tmp # rm -rf /var/run # ln -s /mfs/var/tmp /tmp # ln -s /mfs/var/tmp /var/tmp # ln -s /mfs/var/log /var/log # ln -s /mfs/var/run /var/run # ln -s /mfs/mail /var/mail
Ahora estamos preparados para reiniciar nuestro sistema.
Una vez que el sistema arranque y todo funcione bien podemos modificar /etc/fstab para montar el sistema de ficheros raiz en modo solo lectura:
/dev/wd0a / ffs ro,noatime 1 1
La proxima vez que arranque el sistema, todo sera sólo lectura excepto /mfs
¿Recuerda la partición d? Se usará para los archivos de configuración que cambien a menudo. Esta pequeña partición se montará como lectura escritura.
# mkdir /mnt/vanbaak # mount /dev/wd0d /mnt/vanbaak # mkdir /mnt/vanbaak/confs # mv /etc/hostname.* /mnt/vanbaak/confs/ # mv /etc/pf.conf /mnt/vanbaak/confs/ # cd /etc # ln -s /mnt/vanbaak/confs/hostname.* # ln -s /mnt/vanbaak/confs/pf.conf
Ahora edite /etc/fstab y añada este punto de montaje. El archivo debería parecerse a esto:
/dev/wd0a / ffs ro,noatime 1 1 /dev/wd0d /mnt/vanbaak ffs rw,nodev,nosuid,noatime 1 2
Reinicie una vez más y su sistema estará listo para ser configurado como un firewall redundante.
Un df -h del sistema instalado debería parecerse a esto:
# df -h Filesystem Size Used Avail Capacity Mounted on /dev/wd0a 967M 171M 748M 19% / /dev/wd0d 13.8M 16.0K 13.1M 0% /mnt/vanbaak mfs:19171 7.7M 150K 7.2M 2% /mfs
Configurar CARP
Antes de que use CARP, debemos habilitarlo en /etc/sysctl.conf. Añada las siguientes lineas:
net.inet.carp.allow=1 net.inet.carp.preempt=1
Ahora puede reiniciar para activarlo o ejecutar los siguientes comandos:
# sysctl -w net.inet.carp.allow=1 # sysctl -w net.inet.carp.preempt=1
Ahora necesitamos reescribir la configuración de la red. El soekris viene con 3 interfaces: sis0, sis1 y sis2.
- sis0 será conectada al mundo exterior.
- sis1 será conectada a la red interna.
- sis2 será usada para compartir la información de estado. Vea Configurar pfsync.
Las ips virtuales serán puestas por CARP. Las dos, la parte interna y la parte externa necesitan una ip virtual asi que configuraremos dos interfaces CARP.
- carp1 en el exterior usando sis0 como interfaz física.
- carp2 en el interior usando sis1 como interfaz física.
Para crear una interfaz carp puede usar ifconfig para configurarla en un sistema arrancado. Después veremos que ficheros debemos crear para configurar CARP durante el arranque del sistema.
Una interfaz CARP se crea de la siguiente manera:
# ifconfig sis0 ip.address netmask some.mask # ifconfig carp1 create # ifconfig carp1 vhid 1 carpdev sis0 pass somepass virtual.ip.address netmask some.mask
En el segundo, el host backup, los comandos serían:
# ifconfig sis0 ip.address+1 netmask some.mask # ifconfig carp1 create # ifconfig carp1 vhid 1 carpdev sis0 pass somepass advskew 100 virtual.ip.address netmask some.mask
La palabra clave es advskew. Cuanto más alto sea, menor prioridad tiene el firewall. La maquina con el advskew mas bajo será el firewall maestro.
Para nuestra configuración tomaré las siguientes direcciones ip. Notese que son usadas para pruebas. Reemplace la información de las ips con su información real.
+----| WAN/Internet |----+
| |
sis0| |sis0
+------------+ +------------+
| soekris001 |-sis2--------sis2-| soekris002 |
+------------+ +------------+
sis1| |sis1
| |
---+-------Shared LAN-------+---
Soekris001 es el firewall maestro.
Soekris002 es el firewall de backup a prueba de fallos.
- soekris001 sis0: 192.168.2.14
- soekris001 sis1: 10.0.0.14
- soekris001 sis2: 172.16.0.14
- soekris002 sis0: 192.168.2.15
- soekris002 sis1: 10.0.0.15
- soekris002 sis2: 172.16.0.15
- Ip compartida externa: 192.168.2.13
- Ip compartida interna: 10.0.0.13
Configuración en el soekris001:
# ifconfig sis0 192.168.2.14 netmask 255.255.255.0 up # ifconfig sis1 10.0.0.14 netmask 255.255.255.0 up # ifconfig sis2 172.14.0.14 netmask 255.255.255.0 up # ifconfig carp1 create # ifconfig carp1 vhid 1 carpdev sis0 pass somethingsecret 192.168.2.13 netmask 255.255.255.0 # ifconfig carp2 create # ifconfig carp2 vhid 2 carpdev sis1 pass somethingother 10.0.0.13 netmask 255.255.255.0
Asegurese de poner lo siguiente en la parte superior de su /etc/pf.conf.
pass out on { sis0, sis1 } proto carp keep state
Configuración en el soekris002:
# ifconfig sis0 192.168.2.15 netmask 255.255.255.0 up # ifconfig sis1 10.0.0.15 netmask 255.255.255.0 up # ifconfig sis2 172.14.0.15 netmask 255.255.255.0 up # ifconfig carp1 create # ifconfig carp1 vhid 1 carpdev sis0 pass somethingsecret advskew 100 192.168.2.13 netmask 255.255.255.0 # ifconfig carp2 create # ifconfig carp2 vhid 2 carpdev sis1 pass somethingother advskew 100 10.0.0.13 netmask 255.255.255.0
Asegurese de poner lo siguiente en la parte superior de su /etc/pf.conf.
Todo debería funcionar ahora. Haga ssh a 192.168.2.13 y ejecute hostname. Debería mostrar soekris001. Si desconecta la corriente y hace ssh a 192.168.2.13 otra vez deberia mostrar soekris002.
Para mantener esta configuración siempre que la maquine se inicie, necesitamos crear/editar algunos ficheros.
- hostname.sis0
- hostname.sis1
- hostnmae.sis2
- hostname.carp1
- hostname.carp2
En el soekris001:
# cat /etc/hostname.sis0 inet 192.168.2.14 255.255.255.0 192.168.2.255 media 100baseTX mediaopt full-duplex description External # cat /etc/hostname.sis1 inet 10.0.0.14 255.255.255.0 192.168.2.255 media 100baseTX mediaopt full-duplex description Internal # cat /etc/hostname.sis2 inet 172.14.0.14 255.255.255.0 192.168.2.255 media 100baseTX mediaopt full-duplex description pfsync # cat /etc/hostname.carp1 inet 192.168.2.13 255.255.255.0 192.168.2.255 vhid 1 carpdev sis0 pass somethingsecret # cat /etc/hostname.carp2 inet 10.0.0.13 255.255.255.0 10.0.0.255 vhid 2 carpdev sis1 pass somethingother
En el soekris002:
# cat /etc/hostname.sis0 inet 192.168.2.15 255.255.255.0 192.168.2.255 media 100baseTX mediaopt full-duplex description External # cat /etc/hostname.sis1 inet 10.0.0.15 255.255.255.0 192.168.2.255 media 100baseTX mediaopt full-duplex description Internal # cat /etc/hostname.sis2 inet 172.14.0.15 255.255.255.0 192.168.2.255 media 100baseTX mediaopt full-duplex description pfsync # cat /etc/hostname.carp1 inet 192.168.2.13 255.255.255.0 192.168.2.255 vhid 1 carpdev sis0 pass somethingsecret advskew 100 # cat /etc/hostname.carp2 inet 10.0.0.13 255.255.255.0 10.0.0.255 vhid 2 carpdev sis1 pass somethingother advskew 100
Ahora el soekris002 tomará el control si el soekris001 muere. Lo único molesto es que las conexiones establecidas se perderán. Para ello viene pfsync al rescate.
Configurar pfsync
pfsync syncroniza los estados de pf entre las dos maquinas soekris. De esta manera las conexiones establecidas continuarán en caso de fallo.
Vamos a usar sis2 para esto. Esta interfaz ya tiene una dirección IP. Todo lo que debemos hacer es crear la interfaz pfsync0 y adjuntarla a sis2.
En las dos máquinas:
ifconfig pfsync0 syncdev sis2
Para establecer esta configuración cuando la maquina arranque, deberemos crear el fichero /etc/hostname.pfsync0:
# cat /etc/hostname.pfsync0 up syncdev sis2
Asegurese de poner esto en la parte superior de su /etc/pf.conf.
pass on sis2 proto pfsync
Consejos /etc/pf.conf
Recuerde: el filtrado tiene lugar en la interfaz física, no en la interfaz virtual carpX. De todas formas la interfaz virtual se puede usar combinada con direcciones:
pass in on sis0 from any to carp1 port ssh
Reemplazando sis0 por carp1 no funcionará.
Referencias
Visite las siguientes direcciones para más información:
Copyright (c) 2006 Michiel van Baak.
Permission is granted to copy, distribute and/or modify this document under the terms of the
GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included in the section entitled “GNU Free Documentation License”.










![Validate my RSS feed [Valid RSS]](http://validator.w3.org/feed/images/valid-rss.png)
leida y meneada, seguiré estudiando…
Salu2
Ese modelo de Soekris sabes si soporta VLAN? Sabes si hay otro modelo más económico que lo soporte? Agradecería que me contestases al correo si no es mucha molestia.
Un saludo.
Buenas Gura! Este es un modelo bastante básico de soekris, pero al fin y al cabo no es más que un ordenador con 3 tarjetas de red. Si quieres implementar VLANs tendrás que hacerlo mendiante el OpenBSD (que tiene muy buen soporte) o el sistema operativo que decidas instalarle.
Que tal, yo hice Carp en Soekris con VLAN pero tengo problemas en lado de las Vlan ya que el enlace del Carp no lo hice con sis0 si no que lo hice sobre Vlan0.
Ahora en la red local cada vez que sale no sale por el gateway si no que por la IP de la Vlan.
Alguna idea?
Pero como logro cargar la imagen del OpenBsd en la Soekris?, considerando que el disco duro de la máquina es sólo una flash.
Agradecería mucho me pudieses ayudar.
Adicionalmente me gustaria me indicaras donde puedo encontrar un listado de comandos para utilizar.
Muchas gracias