Funcionalidades avanzadas del DHCP

Enviado por Dani Sánchez en Jue, 28/02/2013 - 16:59
Funcionalitats avançades del DHCP

Todos conocemos el servicio de DHCP (Dynamic Host Configuration Protocol) como el protocolo que sirve para asignar dinámicamente la configuracion IP a nuestros equipos, olvidándonos de tener que hacerlo manualmente. Esto es especialmente útil hoy en día, ya que conectamos nuestros portátiles y smartphones por cualquier red que encontremos sin ningún problema. ¿Os imagináis tener que poner a mano la IP de vuestro iPhone?

La funcionalidad básica del DHCP es asignar dinámicamente una IP, una máscara y un gateway a nuestro equipo. Lo que no todo el mundo sabe es que el DHCP tiene toda una serie de extensiones que nos permiten pasarle, en tiempo de arranque montones de parámetros muy interesantes.

Si además, contamos con un servidor avanzado, podemos hacer que nuestro DHCP una herramienta muy potente para gestionar nuestras redes.

En el inLab  usamos, desde hace mucho tiempo, el servidor de DHCP del ISC (Internet Systems Consorcium). Este servidor es tremendamente potente y estable, y cuenta además, entre otras cosas, con un mini lenguaje de programación integrado.

Podemos usar opciones especiales para parámetros especiales tales como:

  • Un fichero de arranque (option filename "BStrap/X86pc/BStrap.0";)
  • El servidor de impresores remoto (option lpr-servers ip-address )
  • El servidor de tiempo  (option ntp-servers ip-address )
  • El servidor de TFTP (option next-server ip-address )

Podéis consultar la lista completa de parámetros predefinidos en el RFC 2132.

Además de las opciones pre-definidas, podemos montar nuestras propias opciones, e incluso estructuras de datos complejas para almacenar información propia.

option inLab-priv-sala  code 1 = text;
option inLab-priv-hw    code 3 = text;
option inLab-priv-es-pc code 2 = {boolean, integer 32, text };
option inLab-priv-rutas code 4 = array of {ip-address,
                                 ip-address,ip-address,integer 8};

Las opciones 1 y 2 contienen simplemente un string. La 3 contiene una tupla formada por un booleano, un número entero y un string. La cuarta opción define  un array de estructuras compuestas por grupo de 3 direcciones IP y un entero. 

Así, por ejemplo, podríamos pasarle a un PC, desde el DHCP, en que sala esta, o una descripción de su hardware.

host  venus {
fixed-address 10.10.43.196;
hardware ethernet 24:BE:05:23:5E:F2;
option netbios-name-servers 147.83.41.111;
option domain-name "fib.upc.es";
option domain-name-servers 147.83.41.104, 147.83.41.36;
option inLab-priv-es-pc false 2011 "portatil de prestec";
option inLab-priv-sala "Campus Nord.B6.S104";
option inLab-priv-hw "ASUS Eee PC 900";
option inLab-priv-rutas 147.83.200.0 255.255.255.0 10.10.43.2 8,
                         88.20.34.0 255.255.0.0 10.10.43.45 8;
}

 

Otra opción muy interesante del DHCP son las las “Vendor Space”. ¿Sabíais que la petición de DHCP incluye un campo “Vendor Identifier” que nos identifica el tipo de cliente ? Por ejemplo, cuando un PC arranca desde la tarjeta de red, el cliente se identifica como PXE. El cliente de Microsoft se identifica como “MSFT”. Además, Windows 98 se identificaba como “MSFT 98”, y los Windows a partir Windows 2000 como “MSFT 5.0”. Así, los fabricantes han ido definiendo campos y estructuras especiales, para sus clientes, como, por ejemplo la versión firmware del equipo, o campos para idenficiar puertos TCP/IP de algunos protocolos.

Aquí podeis ver un par de ejemplos de estructuras predefinidas de algunos fabricantes.

Campos especiales de un cliente Microsoft:

option space Microsoft;
vendor-option-space Microsoft;
option Microsoft.disable-netbios-over-tcpip     code 1   = unsigned integer 32;
option Microsoft.release-dhcp-lease-on-shutdown code 2   = unsigned integer 8;
option Microsoft.default-router-metric-base     code 3   = unsigned integer 8;
option Microsoft.proxy-autodiscovery            code 252 = string

Campos especiales de un cliente PXE:

option space PXE;
option PXE.mtftp-ip             code 1   = ip-address;
option PXE.mtftp-cport          code 2   = unsigned integer 16;
option PXE.mtftp-sport          code 3   = unsigned integer 16;
option PXE.mtftp-tmout          code 4   = unsigned integer 8;
option PXE.mtftp-delay          code 5   = unsigned integer 8;
option PXE.discovery-control    code 6   = unsigned integer 8;
option PXE.discover-maddr       code 7   = ip-address;
option PXE.rembo-servers        code 8   = { unsigned integer 16, 
  unsigned integer 8, array of ip-address};
option PXE.boot-server-menu     code 9   = { unsigned integer 16, 
  unsigned integer 8, string};
option PXE.menu-prompt          code 10  = { unsigned integer 16, 
  unsigned integer 8 };
option PXE.vendor-specific-info code 43  = string;
option PXE.class-identifier     code 60  = string;
option PXE.pxe-server-name      code 66  = string;
option PXE.filename             code 67  = string;
option PXE.pxe-ip-address       code 150 = string;

Gracias a estos campos, y la potencia del servidor DHCP del ISC, podemos hacer cosas tales como:

class "PXE" {
 match if substring(option vendor-class-identifier,0,9) = "PXEClient";
 vendor-option-space PXE;
}

class "Microsoft" {
 match if substring(option vendor-class-identifier,0,4) = "MSFT";
 option vendor-class-identifier = "Microsoft";
 vendor-option-space Microsoft;
}

Estas definiciones nos asignan un vendor-option-space, es decir una estructura, y en la variable vendor-class-identifier tenemos una descripción homogeneizada del vendor. Así, podemos asignar valores especiales para cada una de las opciones.  Por ejemplo:

host astro {
 fixed-address 147.83.88.22;
 hardware ethernet 6C:62:6D:81:22:32;
 option PXE.discovery-control 11;
 option PXE.rembo-servers 43690 01 147.83.41.200;
 option Microsoft.rembo-servers 2231 01 147.83.58.34;
 next-server 147.83.41.200;
}

Imaginad que quereis que vuestros equipos tengan servidores de DNS diferentes en función del sistema operativo que arranquen en cada momentos. ¿Cómo lo podemos hacer automáticamente? Utilizando la información que nos pasa el cliente DHCP:

host astro {

fixed-address 147.83.58.58;
hardware ethernet 6C:62:6D:81:22:32;
if (vendor-class-identifier = "Microsoft") {
         option domain-name-servers 8.8.8.8 ;
} else if (vendor-class-identifier = "PXE") {
        option domain-name-servers 88.34.23.7 ;
} else {
        option domain-name-servers 4.4.4.4 ;
}
}

En ese ejemplo, asignamos el servidor DNS en función del cliente que hace la petición de DHCP. En el arranque inicial de PXE, le asignaríamos el servidor 88.34.23.7, y luego, una vez arrancado, al Windows le daríamos como servidor de DNS la 8.8.8.8. En otros casos, por ejemplo arrancando de un cliente Linux, le dariamos el servidor 4.4.4.4.

Lo que el manual no explica:

Algunas de las funcionalidades aquí expuestas las da el serviddor del ISC, la parte del servidor de DHCP, pero muhcas de estas mejoras solo pueden usarse si en cliente de DHCP es capaz de leerlas, interpretarlas, y pasarlas al sistema operativo. El servidor de DHCP del ISC, incluye un cliente de DHCP capaz de manejar todas estas opciones. Es muy recomendable usar este cliente en vez de los clientes sencillos que suelen llevar las distribuciones de Linux más comunes. Por el contrario, el cliente de Microsoft, solo maneja unas pocas opciones implementadas en su servidor DHCP.

Síguenos en

Els nostres articles del bloc d'inLab FIB

         
         

inLab FIB incorpora esCert

Icona ESCERT

inLab es miembro de