{"id":597,"date":"2015-03-18T16:15:09","date_gmt":"2015-03-18T19:15:09","guid":{"rendered":"http:\/\/www.jeremiaspalazzesi.com.ar\/blog\/?p=597"},"modified":"2015-03-18T16:22:01","modified_gmt":"2015-03-18T19:22:01","slug":"dhcp-failover-en-linux","status":"publish","type":"post","link":"https:\/\/www.nerdadas.com\/blog\/dhcp-failover-en-linux\/","title":{"rendered":"DHCP Failover en Linux"},"content":{"rendered":"<p>De golpe y porrazo te encontr\u00e1s en una empresa donde poseen dos datacenters en el mismo predio (1km de distancia&#8230; puff) y dos centros de trabajo funcionando a pleno. <strong>Redund\u00e1s en backbones<\/strong> de fibra, un <strong>radio enlace de backup<\/strong>&#8230; <strong>pero no es suficiente<\/strong>. Que decid\u00eds?. <strong>Hagamos failovers de servicios. Am\u00e9n!.<\/strong> As\u00ed fue. Y el \u00faltimo servicio que me faltaba era el DHCP que hac\u00eda ya un tiempo ten\u00eda funcionando en un maravilloso Linux Debian 6.<\/p>\n<p>Us\u00e9 isc-dhcp-server (#<em>apt-get install dhcp3<\/em> \/\/ el dhcp por defecto en linux) y <strong>ten\u00eda reservaciones para las ips conocidas<\/strong>. <strong>Es hora!.<\/strong><\/p>\n<p>Me hab\u00eda asustado la idea pero es bien sencilla. Solo hay que agregarle una declaraci\u00f3n de failover y especificarle el peer. Obvio, obtuve<strong> bonus extras!<\/strong>.(Balanceo por ejemplo)<\/p>\n<h3><strong>La receta:<\/strong><\/h3>\n<p>Vamos a la configuraci\u00f3n del primario. Les comento un poco la configuraci\u00f3n. El DHCP primario tendr\u00e1 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\u00e9nes les daremos ips espec\u00edficas cuando nos digan su MAC Address. \u00a0Si se fijan bien se dar\u00e1n cuenta que uso una m\u00e1scara de 22 bits (255.255.252.0)&#8230; 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\u00e1s grande (1022 hosts utilizables).<\/p>\n<h4><strong>en Root mode!<\/strong><\/h4>\n<pre><span style=\"color: #999999;\">#nano \/etc\/dhcp\/dhcpd.conf<\/span><\/pre>\n<pre>-------------------------------------------------<\/pre>\n<pre><span style=\"color: #999999;\">authoritative;<\/span>\r\n<span style=\"color: #999999;\"># option local-pac-server code 252 = text; #Para distribuir un proxy, en la pr\u00f3xima lo explico<\/span>\r\n<span style=\"color: #999999;\"># option local-pac-server \"http:\/\/10.10.8.1\/wpad\/wpad.pac\\n\";\u00a0#Las opciones para el proxy. Ya les voy a contar. Dejo estas opciones a modo de spoiler<\/span><\/pre>\n<pre><span style=\"color: #999999;\">#Ac\u00e1 empieza el FailOver Declaration!<\/span><\/pre>\n<pre><span style=\"color: #999999;\">failover peer \"dhcp-failover\" {<\/span>\r\n<span style=\"color: #999999;\"> primary; \u00a0#Declaro el primario!. Esteeeee!<\/span>\r\n<span style=\"color: #999999;\"> address 10.10.8.1;\u00a0<\/span>\r\n<span style=\"color: #999999;\"> port 647; #El puerto que voy a usar para que se comuniquen... debo abrirlo en el firewall si existe uno en el medio.<\/span><\/pre>\n<pre><span style=\"color: #999999;\">#Ac\u00e1 le digo cu\u00e1l es el secundario!<\/span>\r\n<span style=\"color: #999999;\"> peer address 10.10.8.2;<\/span>\r\n<span style=\"color: #999999;\"> peer port 647;\u00a0#El puerto que voy a usar para que se comuniquen... debo abrirlo en el firewall si existe uno en el medio.<\/span>\r\n<span style=\"color: #999999;\"> max-response-delay 30;\u00a0#Tiempo de respuesta<\/span>\r\n<span style=\"color: #999999;\"> max-unacked-updates 10;<\/span>\r\n<span style=\"color: #999999;\"> load balance max seconds 3;\u00a0#Balanceoooo, esaaa!<\/span>\r\n<span style=\"color: #999999;\"> mclt 1800;<\/span>\r\n<span style=\"color: #999999;\"> split 128;<\/span>\r\n<span style=\"color: #999999;\">}<\/span><\/pre>\n<pre><span style=\"color: #999999;\">subnet 10.10.8.0 netmask 255.255.252.0 {<\/span>\r\n<span style=\"color: #999999;\"> interface eth0;\u00a0#Interface d\u00f3nde trabaja mi dhcp<\/span>\r\n<span style=\"color: #999999;\"> option domain-name-servers 10.10.8.4, 10.10.8.5;\u00a0#Servidores de DNS en la red (o afuera)<\/span>\r\n<span style=\"color: #999999;\"> option domain-name \"nerdadas.com.ar\";<\/span>\r\n<span style=\"color: #999999;\"> option routers 10.10.8.254;\u00a0#El Gateway!!! (La puerta de enlace que propago)<\/span>\r\n<span style=\"color: #999999;\"> option broadcast-address 10.10.11.255;<\/span>\r\n<span style=\"color: #999999;\">option ntp-servers 10.10.8.13;\u00a0#Mi servidor horario.<\/span>\r\n<span style=\"color: #999999;\"> option time-offset -10800;<\/span>\r\n<span style=\"color: #999999;\"> default-lease-time 86400;<\/span>\r\n<span style=\"color: #999999;\">#Ac\u00e1 declaro el pool<\/span>\r\n<span style=\"color: #999999;\">pool{<\/span>\r\n<span style=\"color: #999999;\">\u00a0 \u00a0 \u00a0 \u00a0 failover peer \"dhcp-failover\";\u00a0#Si falla usar\u00e9 mi hermano!<\/span>\r\n<span style=\"color: #999999;\">\u00a0 \u00a0 \u00a0 \u00a0 range 10.10.10.4 10.10.10.100; #Estas ips la entrego a qui\u00e9n venga por primera vez.<\/span>\r\n<span style=\"color: #999999;\">\u00a0 \u00a0 \u00a0 \u00a0 max-lease-time 172800;\u00a0#Cuanto tiempo te doy una ip<\/span>\r\n<span style=\"color: #999999;\"> }<\/span>\r\n<span style=\"color: #999999;\">}<\/span>\r\n<span style=\"color: #808080;\">#Y ac\u00e1 viene lo bueno J\u00f3venes!. Incluyo el archivo d\u00f3nde hago la reservaciones de ip.\r\n<\/span><span style=\"color: #999999;\">include \"\/etc\/dhcp\/reservaciones.conf\";<\/span><\/pre>\n<p>El archivo de reservaciones contiene algo como&#8230;<\/p>\n<pre><span style=\"color: #999999;\"> #Equipo1\r\n host equipo1\u00a0{\r\n hardware ethernet d8:75:33:0d:3b:a7;\r\n fixed-address 10.10.10.180;\r\n }\r\n #Equipo2\r\n host equipo2{\r\n hardware ethernet 58:a2:b5:c6:9e:0a;\r\n fixed-address 10.10.10.181;\r\n }<\/span>\r\n\r\n<\/pre>\n<p>Y Listo. Ya tenemos primer equipo configurado.<br \/>\nQu\u00e9 configuramos en el segundo?. De la misma forma:<\/p>\n<pre><span style=\"color: #999999;\">#authoritative;<\/span>\r\n<span style=\"color: #999999;\"> # option local-pac-server code 252 = text;<\/span>\r\n<span style=\"color: #999999;\"> # option local-pac-server \"http:\/\/10.10.8.1\/wpad\/wpad.pac\\n\";<\/span><\/pre>\n<pre><span style=\"color: #999999;\">failover peer \"dhcp-failover\" {<\/span>\r\n<span style=\"color: #999999;\"> secondary;<em> #Declaro claramente que este es el servidor secundario!<\/em><\/span>\r\n<span style=\"color: #999999;\"> address 10.10.8.2; #Esta es mi ip<\/span>\r\n<span style=\"color: #999999;\"> port 647;<\/span>\r\n<span style=\"color: #999999;\"> #Ac\u00e1 le digo cu\u00e1l es el primario.<\/span>\r\n<span style=\"color: #999999;\"> peer address 10.10.8.1;<\/span>\r\n<span style=\"color: #999999;\"> peer port 647;<\/span>\r\n<span style=\"color: #999999;\"> max-response-delay 30;<\/span>\r\n<span style=\"color: #999999;\"> max-unacked-updates 10;<\/span>\r\n<span style=\"color: #999999;\"> load balance max seconds 3;<\/span>\r\n<span style=\"color: #999999;\"> }<\/span>\r\n<span style=\"color: #999999;\"> subnet 10.10.8.0 netmask 255.255.252.0 {<\/span>\r\n<span style=\"color: #999999;\"> interface eth0;<\/span>\r\n<span style=\"color: #999999;\"> option domain-name-servers 10.10.8.4, 10.10.8.5;<\/span>\r\n<span style=\"color: #999999;\"> option domain-name \"nerdadas.com.ar\";<\/span>\r\n<span style=\"color: #999999;\"> option routers 10.10.8.254;<\/span>\r\n<span style=\"color: #999999;\"> option broadcast-address 10.10.11.255;<\/span>\r\n<span style=\"color: #999999;\"> option ntp-servers 10.10.8.13;<\/span>\r\n<span style=\"color: #999999;\"> option time-offset -10800;<\/span>\r\n<span style=\"color: #999999;\"> default-lease-time 86400;<\/span>\r\n<span style=\"color: #999999;\"> pool{<\/span>\r\n<span style=\"color: #999999;\"> failover peer \"dhcp-failover\";<\/span>\r\n<span style=\"color: #999999;\"> range 10.10.10.4 10.10.10.100;<\/span>\r\n<span style=\"color: #999999;\"> max-lease-time 172800;<\/span>\r\n<span style=\"color: #999999;\"> }<\/span>\r\n<span style=\"color: #999999;\"> }<\/span>\r\n<span style=\"color: #999999;\"> include \"\/etc\/dhcp\/reservaciones.conf\";<\/span><\/pre>\n<p>Qu\u00e9 hacemos con las reservaciones?. Bueno, a fin de que las reservaciones sean iguales en los dos lados hice un script que las env\u00eda desde el primario al secundario y refresca. Obvio, primero tuve que lograr que el ssh\/scp no me pida password.<\/p>\n<p>En el servidor primario hac\u00e9s:<\/p>\n<pre><span style=\"color: #999999;\">#Genero mi certificado, solo dar\u00e9 enter cada vez que pregunte.<\/span>\r\n<span style=\"color: #999999;\">ssh-keygen -b 4096 -t rsa<\/span><\/pre>\n<pre><span style=\"color: #999999;\">#Luego copio mi certificado al servidor de DHCP secundario<\/span>\r\n<span style=\"color: #999999;\">#me pedir\u00e1 password de root y listo, solucionado:<\/span>\r\n<span style=\"color: #999999;\">ssh-copy-id root@10.10.8.2<\/span><\/pre>\n<pre>Una vez completado hago mi propio cron que cada 5 minutos copie la configuraci\u00f3n en el servidor secundario:\r\n<span style=\"color: #999999;\">#Edito mi tabla cron<\/span>\r\n<span style=\"color: #999999;\">crontab -e<\/span>\r\n<span style=\"color: #999999;\">#y al final de todo el archivo agrego lo siguiente:<\/span>\r\n<span style=\"color: #999999;\">*\/5 * * * * scp \/etc\/dhcp\/reservaciones.conf root@10.10.8.2:\/etc\/dhcp\/ &amp;&amp; ssh root@10.10.8.2 \/etc\/init.d\/isc-dhcp-server restart<\/span>\r\n<span style=\"color: #999999;\">#Esto enviar\u00e1 primero el archivo de reservaciones al servidor secundario y luego (&amp;&amp;) si todo sali\u00f3 ok recargar\u00e1 la configuraci\u00f3n del DHCP secundario.<\/span><\/pre>\n<p>Me pas\u00f3 tambi\u00e9n que quer\u00eda hacerlo manualmente. Para eso cree un archivo con permiso de ejecuci\u00f3n que hace todo esto manualmente.<\/p>\n<pre><span style=\"color: #999999;\">nano \/usr\/bin\/actualizadhcp.sh<\/span>\r\n<span style=\"color: #999999;\"> #Dentro escribo lo siguiente<\/span>\r\n<span style=\"color: #999999;\"> echo -e \"* Refrescando configuracion DHCP Local\"<\/span>\r\n<span style=\"color: #999999;\"> \/etc\/init.d\/isc-dhcp-server restart<\/span>\r\n<span style=\"color: #999999;\"> echo -e \"* Enviando archivo de configuracion\"<\/span>\r\n<span style=\"color: #999999;\"> echo -e \"* Refrescando configuracion DHCP Remoto\"<\/span>\r\n<span style=\"color: #999999;\"> scp \/etc\/dhcp\/reservaciones.conf root@10.10.8.2:\/etc\/dhcp\/ &amp;&amp; ssh root@10.10.8.2 \/etc\/init.d\/isc-dhcp-server restart<\/span><\/pre>\n<pre style=\"text-align: left;\"><span style=\"color: #999999;\">#Cierro y guardo el archivo, luego le doy permisos de ejecuci\u00f3n:<\/span>\r\n<span style=\"color: #999999;\"> chmod +x \/usr\/bin\/actualizadhcp.sh<\/span><\/pre>\n<pre>Listo, ahora modifico las reservaciones en el servidor DHCP primario a mano o con <a title=\"http:\/\/www.webmin.com\/\" href=\"http:\/\/www.webmin.com\/\">Webmin<\/a>\u00a0y luego actualizo los dos servidores haciendo:\r\n <span style=\"color: #999999;\">#actualizadhcp.sh<\/span><\/pre>\n<p style=\"text-align: left;\"><strong>Listo, FailOver funcionando correctamente!.<\/strong><\/p>\n<h3>\u00a0Recomendaciones:<\/h3>\n<ul>\n<li><strong>DHCP es muy sensible a las diferencias horarias<\/strong> as\u00ed que recomiendo sincronizar primero los servidores contra el mismo <strong>NTP.<\/strong> (<em>#apt-get install ntp<\/em> y luego <em>#ntpq -p<\/em> , esto nos dar\u00e1 los servidores contra los que sincronizo. Cuidar la zona horaria) La hora la veo con: <em>#date<\/em><\/li>\n<li>Si se fijaron bien el rango de ips que entrega es el mismo en los dos servidores, esto es porque hace<strong> balanceo de carga<\/strong>. As\u00ed 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!.<\/li>\n<li>OJO si un equipo no toma la ip reservada, es probable que el archivo de reservaciones no se est\u00e9 sincronizando y el <strong>DHCP<\/strong> secundario le est\u00e9 dando una ip que nada que ver porque todav\u00eda no lo conoce.<\/li>\n<li>Hagan las pruebas parando un servicio en un servidor, luego en el otro, luego los dos&#8230; <strong>TODO EN HORARIO NO LABORAL<\/strong> para que nadie se queje.<\/li>\n<\/ul>\n<p>Obvio, no olviden contarme como les fu\u00e9!. Saludos!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>De golpe y porrazo te encontr\u00e1s en una empresa donde poseen dos datacenters en el mismo predio (1km de distancia&#8230; puff) y dos centros de trabajo funcionando a pleno. Redund\u00e1s en backbones de fibra, un radio enlace de backup&#8230; pero no es suficiente. Que decid\u00eds?. Hagamos failovers de servicios. Am\u00e9n!. As\u00ed fue. Y el \u00faltimo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":598,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[607,3,161,17,804],"tags":[840,233,837,835,836,827,831,667,823,825,830,829,581,130,832,826,582,838,828,37,841,842,833,834,844,845,843,824,839,390],"class_list":["post-597","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aventura-2","category-programacion","category-seguridad","category-tecnologia","category-ti","tag-a","tag-admin","tag-apt","tag-apt-get","tag-aptitude","tag-centos","tag-config","tag-configuracion","tag-debian","tag-dhcp","tag-dhcp3-server","tag-dhcpd3","tag-error","tag-errores","tag-fail","tag-failover","tag-falla","tag-install","tag-isc-dhcp-server","tag-linux","tag-ntp","tag-ntpupdate","tag-over","tag-root","tag-rsync","tag-scp","tag-sincronizar","tag-ssh","tag-tolerancia","tag-upgrade"],"_links":{"self":[{"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/posts\/597","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/comments?post=597"}],"version-history":[{"count":3,"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/posts\/597\/revisions"}],"predecessor-version":[{"id":601,"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/posts\/597\/revisions\/601"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/media\/598"}],"wp:attachment":[{"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/media?parent=597"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/categories?post=597"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/tags?post=597"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}