DataCenterDataCenter

De golpe y porrazo te encontrás en una empresa donde poseen dos datacenters en el mismo predio (1km de distancia… puff) y dos centros de trabajo funcionando a pleno. Redundás en backbones de fibra, un radio enlace de backuppero no es suficiente. Que decidís?. Hagamos failovers de servicios. Amén!. Así fue. Y el último servicio que me faltaba era el DHCP que hacía ya un tiempo tenía funcionando en un maravilloso Linux Debian 6.

Usé isc-dhcp-server (#apt-get install dhcp3 // el dhcp por defecto en linux) y tenía reservaciones para las ips conocidas. Es hora!.

Me había asustado la idea pero es bien sencilla. Solo hay que agregarle una declaración de failover y especificarle el peer. Obvio, obtuve bonus extras!.(Balanceo por ejemplo)

La receta:

Vamos a la configuración del primario. Les comento un poco la configuración. El DHCP primario tendrá como ip: 10.10.8.1 y el secundario la ip: 10.10.8.2. Tenemos dos servidores de DNS locales: 10.10.8.4 y 10.10.8.5 y agregaremos dos equipos a quiénes les daremos ips específicas cuando nos digan su MAC Address.  Si se fijan bien se darán cuenta que uso una máscara de 22 bits (255.255.252.0)… o sea.. tenemos host en 10.10.8.0/10.10.9.0/10.10.10.0/10.10.11.0. No se asusten, es solo una red más grande (1022 hosts utilizables).

en Root mode!

#nano /etc/dhcp/dhcpd.conf
-------------------------------------------------
authoritative;
# option local-pac-server code 252 = text; #Para distribuir un proxy, en la próxima lo explico
# option local-pac-server "http://10.10.8.1/wpad/wpad.pac\n"; #Las opciones para el proxy. Ya les voy a contar. Dejo estas opciones a modo de spoiler
#Acá empieza el FailOver Declaration!
failover peer "dhcp-failover" {
 primary;  #Declaro el primario!. Esteeeee!
 address 10.10.8.1; 
 port 647; #El puerto que voy a usar para que se comuniquen... debo abrirlo en el firewall si existe uno en el medio.
#Acá le digo cuál es el secundario!
 peer address 10.10.8.2;
 peer port 647; #El puerto que voy a usar para que se comuniquen... debo abrirlo en el firewall si existe uno en el medio.
 max-response-delay 30; #Tiempo de respuesta
 max-unacked-updates 10;
 load balance max seconds 3; #Balanceoooo, esaaa!
 mclt 1800;
 split 128;
}
subnet 10.10.8.0 netmask 255.255.252.0 {
 interface eth0; #Interface dónde trabaja mi dhcp
 option domain-name-servers 10.10.8.4, 10.10.8.5; #Servidores de DNS en la red (o afuera)
 option domain-name "nerdadas.com.ar";
 option routers 10.10.8.254; #El Gateway!!! (La puerta de enlace que propago)
 option broadcast-address 10.10.11.255;
option ntp-servers 10.10.8.13; #Mi servidor horario.
 option time-offset -10800;
 default-lease-time 86400;
#Acá declaro el pool
pool{
        failover peer "dhcp-failover"; #Si falla usaré mi hermano!
        range 10.10.10.4 10.10.10.100; #Estas ips la entrego a quién venga por primera vez.
        max-lease-time 172800; #Cuanto tiempo te doy una ip
 }
}
#Y acá viene lo bueno Jóvenes!. Incluyo el archivo dónde hago la reservaciones de ip.
include "/etc/dhcp/reservaciones.conf";

El archivo de reservaciones contiene algo como…

 #Equipo1
 host equipo1 {
 hardware ethernet d8:75:33:0d:3b:a7;
 fixed-address 10.10.10.180;
 }
 #Equipo2
 host equipo2{
 hardware ethernet 58:a2:b5:c6:9e:0a;
 fixed-address 10.10.10.181;
 }

Y Listo. Ya tenemos primer equipo configurado.
Qué configuramos en el segundo?. De la misma forma:

#authoritative;
 # option local-pac-server code 252 = text;
 # option local-pac-server "http://10.10.8.1/wpad/wpad.pac\n";
failover peer "dhcp-failover" {
 secondary; #Declaro claramente que este es el servidor secundario!
 address 10.10.8.2; #Esta es mi ip
 port 647;
 #Acá le digo cuál es el primario.
 peer address 10.10.8.1;
 peer port 647;
 max-response-delay 30;
 max-unacked-updates 10;
 load balance max seconds 3;
 }
 subnet 10.10.8.0 netmask 255.255.252.0 {
 interface eth0;
 option domain-name-servers 10.10.8.4, 10.10.8.5;
 option domain-name "nerdadas.com.ar";
 option routers 10.10.8.254;
 option broadcast-address 10.10.11.255;
 option ntp-servers 10.10.8.13;
 option time-offset -10800;
 default-lease-time 86400;
 pool{
 failover peer "dhcp-failover";
 range 10.10.10.4 10.10.10.100;
 max-lease-time 172800;
 }
 }
 include "/etc/dhcp/reservaciones.conf";

Qué hacemos con las reservaciones?. Bueno, a fin de que las reservaciones sean iguales en los dos lados hice un script que las envía desde el primario al secundario y refresca. Obvio, primero tuve que lograr que el ssh/scp no me pida password.

En el servidor primario hacés:

#Genero mi certificado, solo daré enter cada vez que pregunte.
ssh-keygen -b 4096 -t rsa
#Luego copio mi certificado al servidor de DHCP secundario
#me pedirá password de root y listo, solucionado:
ssh-copy-id root@10.10.8.2
Una vez completado hago mi propio cron que cada 5 minutos copie la configuración en el servidor secundario:
#Edito mi tabla cron
crontab -e
#y al final de todo el archivo agrego lo siguiente:
*/5 * * * * scp /etc/dhcp/reservaciones.conf root@10.10.8.2:/etc/dhcp/ && ssh root@10.10.8.2 /etc/init.d/isc-dhcp-server restart
#Esto enviará primero el archivo de reservaciones al servidor secundario y luego (&&) si todo salió ok recargará la configuración del DHCP secundario.

Me pasó también que quería hacerlo manualmente. Para eso cree un archivo con permiso de ejecución que hace todo esto manualmente.

nano /usr/bin/actualizadhcp.sh
 #Dentro escribo lo siguiente
 echo -e "* Refrescando configuracion DHCP Local"
 /etc/init.d/isc-dhcp-server restart
 echo -e "* Enviando archivo de configuracion"
 echo -e "* Refrescando configuracion DHCP Remoto"
 scp /etc/dhcp/reservaciones.conf root@10.10.8.2:/etc/dhcp/ && ssh root@10.10.8.2 /etc/init.d/isc-dhcp-server restart
#Cierro y guardo el archivo, luego le doy permisos de ejecución:
 chmod +x /usr/bin/actualizadhcp.sh
Listo, ahora modifico las reservaciones en el servidor DHCP primario a mano o con Webmin y luego actualizo los dos servidores haciendo:
 #actualizadhcp.sh

Listo, FailOver funcionando correctamente!.

 Recomendaciones:

  • DHCP es muy sensible a las diferencias horarias así que recomiendo sincronizar primero los servidores contra el mismo NTP. (#apt-get install ntp y luego #ntpq -p , esto nos dará los servidores contra los que sincronizo. Cuidar la zona horaria) La hora la veo con: #date
  • Si se fijaron bien el rango de ips que entrega es el mismo en los dos servidores, esto es porque hace balanceo de carga. Así que algunos equipos recibiran ips del primario y otros del secundario. A no asustarse, no se cruzan, cada cual sabe su lugar. Este es un plus extra!.
  • OJO si un equipo no toma la ip reservada, es probable que el archivo de reservaciones no se esté sincronizando y el DHCP secundario le esté dando una ip que nada que ver porque todavía no lo conoce.
  • Hagan las pruebas parando un servicio en un servidor, luego en el otro, luego los dos… TODO EN HORARIO NO LABORAL para que nadie se queje.

Obvio, no olviden contarme como les fué!. Saludos!

Por Jeremías Palazzesi

Solucionador de Problemas Senior!. No podés con algo?, probá conmigo!

2 comentarios en «DHCP Failover en Linux»
  1. Hey dude!, Gracias por el post como hago un third Fail over es decir tengo los nodos A, B, C, El A hace failover con el B y este con el A, pero como hago para que el B haga Fail over con C? Es decir con la finalidad que los tres nodos estén permanente sincronizados y si falla uno los otros dos asuman, si fallan dos uno quede asumiendo la carga de despacho IP. Agradezco su respuesta.

    1. Mirá, nunca lo armé así. Supongo que deberás implementar HA. Podés optar por configurar los linux como HA. Dos equipos, exactamente iguales para el primario y con un heartbeat cada cierto tiempo. Ante la caída de uno levantar el otro. Salís del esquema de balanceo de carga, pero obtenes un tercer «Failover» como tal.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *