viernes, 17 de noviembre de 2017

DHCP script para crear dhcpd.conf a partir de la db dhcpd.leases

Se me ha presentado el siguiente escenario: Tengo un servidor ubuntu que distribuye y rutea vlans y estoy en el medio de la elaboración de un plan de contingencia en el cual están comprendidos los router y los switch del MDF.
el BCP (Business Continuity Plan) esta pensado para una situación donde desaparece momentáneamente la topología lógica de Vlan. En el plan de continuidad permanece la subdivisión de redes pero esta ves por la asignación de los datos de configuración directamente por el isc-dhcp-server. Para ello el plan contempla dos tipos de incidentes:
1) fallas en el servidor distribuidor de vlans.
2) fallas en el switch principal con TRUNKs vlan.

 Para esto, configuré un servidor clon del distribuidor de vlans y me ví en la necesidad de crear un script que me permita obtener los datos de los hosts existentes conectados o apagados para asignarle estáticamente su pertenencia a la sub red.
De ello surge el script que explico a continuación.
En Ubuntu la base de datos del servidor dhcp esta en: /var/lib/dhcp/dhcpd.leases
y su configuración en:  /etc/dhcp/dhcpd.conf

el contenido de dhcpd.conf puede ser parecido a este:



y el contenido de dhcpd.leases:



Primero vamos a generar un archivo csv con el script explicado aqui:
http://jaskolowski.com.ar/2017/11/script-para-parsear-dhcpdlease.html

que es este:



nos genera un archivo con un contenido parecido a este:



ese archivo lo vamos a procesar con el siguiente script:



dejo el texto a continuación por si les resulta más fácil copy&paste:

#!/bin/bash
# script para crear dhcpd.conf a partir de la DB dhcpd.leases
#
# Creamos variables para obtener IP, MAC y Gateway de hosts
IP=(`cat lease.csv |cut -f1 -d";"`)
MAC=(`cat lease.csv |cut -f2 -d";"`)
GW=(`cat lease.csv |cut -f1 -d";"|sed 's:[^.]*$:1:'`)

# iniciamos el encabezado de dhcpd.conf

echo "ddns-update-style none;">dhcpd.conf
echo "Authoritative;">>dhcpd.conf
echo "ignore client-updates;">>dhcpd.conf


#creacion de un arreglo
for i in "${!IP[@]}"
do

# creamos cada lease por host
echo "# PC-${IP[$i]}">>dhcpd.conf
echo "Host PC-${IP[$i]} {">>dhcpd.conf
echo "        hardware ethernet               ${MAC[$i]};">>dhcpd.conf
echo "        fixed-address                   ${IP[$i]};">>dhcpd.conf
echo "        option subnet-mask              255.255.255.224;">>dhcpd.conf
echo "        option domain-name-servers      8.8.8.8,208.67.222.222;">>dhcp.conf
echo "        option routers                  ${GW[$i]};">>dhcpd.conf
echo "        default-lease-time -1;">>dhcpd.conf
echo "        max-lease-time -1;">>dhcpd.conf
echo "}">>dhcpd.conf
done
 Y eso nos da como resultado un archivo de configuración de dhcp server que va a asignar a cada host que tiene registrado por su mac la ip correspondiente a la sub red a la que pertenecía en un entorno vlan.

Adicionalmente se puede configurar una sub red para 30 ó 62 hosts que no hayan sido registrados en dhcpd.leases y aunque no esten en la sub red de su vlan, al menos tengan conexión hasta que se concluya el DRP.