Esta pagina se ve mejor con JavaScript habilitado

Alta disponibilidad VIP mediante CARP en FreeBSD

 ·  🎃 kr0m

En entornos de alta disponibilidad es imprescindible el uso de ips flotantes, estas se caracterizan por poder migrar de un servidor a otro de forma transparente consiguiendo de este modo seguir proveyendo de servicio en caso de caída de uno de los servidores.

En esta ocasión vamos a utilizar CARP que es la implementación de VRRP por parte del equipo de OpenBSD , el código está totalmente integrado en FreeBSD así que toda la configuración se realizará empleando las herramientas propias del sistema sin necesidad de instalar ningún paquete adicional.

Para mostar el funcionamiento de CARP dispondremos de dos servidores cada uno con su ip independiente, compartiendo una VIP entre ellos:

  • VIP: 192.168.69.40
  • PeanutBrain01: 192.168.69.41
  • PeanutBrain02: 192.168.69.42

Cargamos el módulo carp en ambos servidores:

kldload carp

Indicamos al sistema operativo que lo cargue en el arranque:

vi /boot/loader.conf

carp_load="YES"

Si estamos utilizando un custom kernel tendremos que habilitar la siguiente opción en la compilación del mismo:

device	carp

En CARP existen dos roles MASTER/BACKUP, dicho role se decide en base al peso asignado en la configuración, el servidor con menor peso será MASTER.

En mi caso voy a asignar los siguientes pesos:

MASTER: PeanutBrain01 -> advskew 0(por defecto)
BACKUP: PeanutBrain02 -> advskew 100

Realizamos la configuración en PeanutBrain01:

vi /etc/rc.conf

ifconfig_em0_alias0="inet vhid 1 pass testpass alias 192.168.69.40/32"

Realizamos la configuración en PeanutBrain02:

vi /etc/rc.conf

ifconfig_em0_alias0="inet vhid 1 advskew 100 pass testpass alias 192.168.69.40/24"

Reniciamos la red en ambos servidores:

service netif restart
service routing restart

Podemos ver en la salida de ifconfig una ip adicional en cada servidor, donde se indica el role de la VIP y el peso.

PeanutBrain01:

root@PeanutBrain01:~ # ifconfig em0
em0: flags=8963<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=481009b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,VLAN_HWFILTER,NOMAP>
	ether 08:00:27:42:4c:a5
	inet 192.168.69.41 netmask 0xffffff00 broadcast 192.168.69.255
	inet 192.168.69.40 netmask 0xffffff00 broadcast 192.168.69.40 vhid 1
	carp: MASTER vhid 1 advbase 1 advskew 0
	media: Ethernet autoselect (1000baseT <full-duplex>)
	status: active
	nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

PeanutBrain02:

root@PeanutBrain02:~ # ifconfig em0
em0: flags=8963<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=481009b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,VLAN_HWFILTER,NOMAP>
	ether 08:00:27:37:5f:f2
	inet 192.168.69.42 netmask 0xffffff00 broadcast 192.168.69.255
	inet 192.168.69.40 netmask 0xffffff00 broadcast 192.168.69.40 vhid 1
	carp: BACKUP vhid 1 advbase 1 advskew 100
	media: Ethernet autoselect (1000baseT <full-duplex>)
	status: active
	nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

La forma mas sencilla de comprobar en que servidor está la VIP es poner a la escucha un socket mediante netcat , dependiendo del servidor que tenga activa la VIP en ese momento veremos la salida en un servidor u otro.

Instalamos netcat en ambos servidores:

pkg install netcat

Ahora ponemos a la escucha el socket en ambos servidores:

nc -l 7777

Desde nuestro pc realizamos una conexión a la VIP:

nc 192.168.69.40 7777

Podemos ver como PeanutBrain01 recibe la conexión:

Garrus $ ~> nc 192.168.69.40 7777
111111
root@PeanutBrain01:~ # nc -l 7777
111111

Si reiniciamos PeanutBrain01 veremos en PeanutBrain02 que ahora es MASTER:

root@PeanutBrain02:~ # ifconfig em0
em0: flags=8963<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=481009b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,VLAN_HWFILTER,NOMAP>
	ether 08:00:27:37:5f:f2
	inet 192.168.69.42 netmask 0xffffff00 broadcast 192.168.69.255
	inet 192.168.69.40 netmask 0xffffff00 broadcast 192.168.69.40 vhid 1
	carp: MASTER vhid 1 advbase 1 advskew 100
	media: Ethernet autoselect (1000baseT <full-duplex>)
	status: active
	nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

Si volvemos a realizar la conexión esta es recibida PeanutBrain02:

Garrus $ ~> nc 192.168.69.40 7777
222222
root@PeanutBrain02:~ # nc -l 7777
222222

Debemos tener en cuenta que si el BACKUP toma la VIP esta NO volverá al MASTER cuando este se recupere, si queremos que esto ocurra de forma automática tendremos que habilitar el parámetro sysctl net.inet.carp.preempt en ambos servidores:

sysctl net.inet.carp.preempt=1

Si queremos hacerlo permanente:

vi /etc/sysctl.conf

net.inet.carp.preempt=1

También podemos forzar el cambio manualmente ejecutando en el servidor de BACKUP:

ifconfig em0 vhid 1 state backup

Si te ha gustado el artículo puedes invitarme a un RedBull aquí