Configuración DHCP

Una guía básica

Pedro Pablo Fábrega Martínez

DHCP

Qué es DHCP

Una herramienta que puede hacer más agradable la vida de los administradores de una red local. Me explico: DHCP don las iniciales de Dynamic Host Configuration Protocol, un protocolo que instalado en un servidor de una red local, permite la configuración automática del protocolo TCP/IP de todos los clientes de dicha red. Nos permite evitar el tedioso trabajo de tener que configurar el protocolo TCP/IP cada vez que agregamos una nueva máquina a la red, por ejemplo, dirección IP, servidores DNS, gateway, WINS y alguna que otra cosa más muy interesante también. Con un servidor DHCP tendremos una red con máquinas "plug-and-play", con sólo contectarlas podrá dialogar con red.

La ventaja no es sólo esta, además podremos modificar la configuración de todos los equipos de la red con sólo modificar los datos del servidor.

Teniendo esta herramienta, ¿qué administrador irá cliente por cliente configurándolo de forma independiente?

 

 

El servidor DHCP viene prácticamente con todas las distribuciones de GNU/Linux. En cualquier caso, se puede encontrar en Internet Software Consortium (ISC -- http://www.isc.org/products/DHCP/) si queremos compilar nosotros mismos el programa. Además también incluye el cliente DHCP.


Funcionamiento del servidor DHCP

La configuración de DHCP se basa en un fichero de texto, /etc/dhcp.conf que el proceso servidor lee en el inicio. La lectura del fichero de configuración sólo se realiza durante el inicio, nunca cuando ya está en ejecución, por tanto cualquier modificación requiere detener el servicio DHCP y volverlo a iniciar. En este fichero se especifican las características de comportamiento como son el rango de direcciones asignadas, el tiempo de asignación de direcciones, el nombre del dominio, los gateways, etc. DHCP almacena en memoria la lista de direcciones de cada sured que está sirviendo. Cuando se arranca un cliente DHCP le solicita una dirección al servidor, éste busca una dirección disponible y se la asigna. En caso de necesidad, el servidor DHCP también puede asignar direcciones fijas a determinados equipos de la red.

La asignación de los datos TCP/IP al cliente se realiza para un determinado espacio de tiempo que se define en la configuración del servidor. Si no se especifica otro valor, la asignación predeterminada es por un día. También los clientes pueden solicitar datos de una duración especificada, aunque para evitar que un cliente tenga una dirección fija se puede prefijar un tiempo máximo de asignación.

Si tenermos varias subredes en nuestra instalación, también se pueden diferenciar las asignaciones que otorga el servidor DHCP según el interfaz en el que se realice.

Como el servidor DHCP puede pararse y reiniciarse, necesita mantener la lista de direcciones asignadas. El fichero /var/lib/dhcp/dhcpd.leases o /var/state/dhcp/dhcpd.leases mantiene esta lista de asignaciones. Cuando se inicia el servidor, primero lee el fichero de configuración dhcpd.conf, después el fichero dhcpd.leases y marca qué sistemas tienen asignaciones activas.



Protocolo de intercambio de mensajes

Cuando el cliente DHCP arranca resulta evidente que ignora la configuración de red por lo que necesita realizar las primeras comunicaciones mediante mensajes de difusión o broadcast. Esta difusión y el resto de las comunicaciones se basa en 8 tipos de mensajes en DHCP:

DHCPDISCOVER: El cliente envía un mensaje de difusión para localizar a los servidores DHCP activos.

DHCPOFFER: El servidor responde al cliente con una oferta de parámetros de configuración conforme a la situación del cliente.

DHCPREQUEST: Respuesta del cliente solicitando los parámetros ofertados, en caso de que el mensaje del servidor haya sido aceptado, rechazando la oferta, si el mensaje del servidor ha sido desestimado o confirmando la solicitud de una dirección IP obtenida anteriormente.

DHCPACK: Mensaje de confirmación y cierre desde el servidor hacia el cliente indicando los parámetros definitivos.

DHCPNACK: Mensaje que informa desde el servidor al cliente de que la dirección IP que solicita no es válida para la subred en la que se encuentra o la dirección IP ya no la puede asignar porque está asignada a otro equipo.

DHCPDECLINE: El cliente informa al servidor de que la dirección está en uso, normalmente porque otro usuario ha asignado esa dirección manualmente.

DHCPRELEASE: El cliente informa al servidor de que ha finalizado el uso de la dirección IP.

DHCPINFORM: El cliente consulta al servidor la configuración local. El cliente ya está configurado cuando envía este mensaje.



Configuración del servidor DHCP

La configuración del servidor DHCP, como hemos visto anteriormente, se realiza en el fichero /etc/dhcpd.conf. Es un fichero de texto, donde cada línea que comience por # indica un comentario y no se tiene en cuenta. Las distintas entradas de este fichero terminan en ;. Si una entrada de configuración necesita distintos parámetros los podemos agrupar mediante { y }. Ver el siguiente ejemplo de cofiguración.

Este fichero contendrá línea de configuración de la forma

parámetro valor;

y línea de la forma:

option parámetro valor;

El valor dependerá del parámetro que queramos configurar; podrá ser un valor lógico (on u off, por ejemplo), una dirección, un nombre predefinido u otro valor según el caso.

En este fichero también se definen las subredes en las que actúa el servidor DHCP y qué rangos de direcciones puede asignar. Existe unos parámetros que pueden ser globales o se pueden especificar dentro de una declaración de subred. Cualquier parámetro especificado en una subred tiene preferencia en esta subred sobre los establecidos de forma global.

Primero vemos un ejemplo de configuración y posteriormente veremos una descripción de las línea que contiene y otras que podría contener:

authoritative;
one-lease-per-client on;
server-identifier ppfm.atenea.dom;
default-lease-time 604800;
max-lease-time 604800;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
option routers 192.168.1.10;
option domain-name-servers 192.168.1.10;
option domain-name "atenea.dom";
ddns-domainname "atenea.dom";
ddns-update-style ad-hoc;
ddns-updates on;
option netbios-name-servers 192.168.1.10;
  subnet 192.168.1.0 netmask 255.255.255.0 {
     range 192.168.1.7 192.168.1.9;
     range 192.168.1.90 192.168.1.150;
 }

En una vista rápida para impacientes:

authoritative; Supone que la configuración correcta para la red es la definida en el servidor DHCP y tratará de reasignar datos a los clientes mal configurados. Este parámetro puede ser global o asigando a una declaración de subred. Los cambios realizados en en servidor marcado como authoritative tienen una rápida propagación en la subred ya que se reconfigura cualquier cliente con la antigua configuración.

not authoritative; tiene el significado opuesto al anterior parámetro.

one-lease-per-client on; cuando esta opción está en "on" y un cliente solicita una asignación, el servidor libera automáticamente cualquier otra asignación que tenga ese cliente. Se supone que si el cliente hace una solicitud es porque ha olvidado que tuviera alguna, es decir tiene un solo interfaz de red. Si no se da esta situación en los clientes hay que usar este parámetro con precaución.

server-identifier 192.168.1.10; este parámetro identifica el nodo que alberga el servicio DHCP. Sólo se deber usar cuando el nodo tenga más de una dirección IP asignada al interfaz.

default-lease-time 604800; indica el tiempo de asignación en segundos.

max-lease-time 604800; indica el tiempo máximo de asignación en segundos.

ddns-updates on; activa la actualización DNS con los valores asignados mediante DHCP.

ddns-domainname "atenea.dom"; indica el dominio en el que se actualizan los DNS

ddns-update-style interim; esta línea indica el método de actualización DNS automática con los valores de la IP asignados por DHCP. Más adelante veremos como hay que modificar las zonas en el fichero /etc/named.conf para permtir la actualización.

option subnet-mask 255.255.255.0; definimos la máscara general de red que vamos a utilizar.

option broadcast-address 192.168.1.255; definimos la dirección de difusión de la red.

option routers 192.168.1.10; definimos el gatewaye de la red.

option domain-name-servers 192.168.1.10; definimos la dirección del servidor DNS de la red.

option domain-name "atenea.dom"; definimos el nombre del dominio DNS que se añade a los nombres de host.

option netbios-name-servers 192.168.1.10; definimos ls dirección del servidor WINS para NetBios.

  subnet 192.168.1.0 netmask 255.255.255.0 {
     range 192.168.1.7 192.168.1.9;
     range 192.168.1.90 192.168.1.150;
 }

y por último definimos la red en la que queremos hacer asignaciones y los rangos de direcciones que puede asignar el servidor DHCP.

Una vez vista la descripcíón preliminar de la configuración DHCP vamos a entrar en más detalles.

Podíamos haber definido una descripción de subred más simple si sólo tuviéramos un rango de asignaciones:

subnet 192.168.1.0 netmask 255.255.0.0 
range 192.168.1.100 192.168.1.200;

Nota: En cualquier red serán necesarios distintos host con dirección IP fija, por ejemplo los servidores DNS o gateways. Habrá que tener cuidado con la asignación de estas direcciones y definir los rangos correctamente para no llevarnos sorpresas. También se pueden configurar equipos concretos mediante el parámetro host.


Otras opciones disponibles

fixed-address lista_direcciones_ip; define direcciones estáticas para asignar a un host

group comienza una declaración de grupo.

hardware tipo_hardware dirección; se utiliza para indicar el tipo de hardware, Ethernet o token ring. por ejemplo: hardware ethernet 00:50:b3:c5:60:05;

host comienza una declaración de host. Por ejemplo:

host cli004 {
   hardware ethernet 00:50:b3:c5:60:23;
   fixed-address 192.168.1.122;
}

fixed-address direccion-ip; dirección fija para asignar a un host, como vemos en el ejemplo anterior.

host-name nombre; nombre para asignar al host solicitado.

max-lease-time segundos; Máximo tiempo de asignación de la asignación. Esta parámetro lo podemos utilizar para evitar que los clientes tomen una dirección IP por tiempo indefinido.

netbios-name-servers lista_IP; Lista de IP de servidores WINS.

range ip-menot ip-mayor; el rango de diecciones que se asignarán en la correspondiente subred.

routers lista_IP; Lista de IP de gateways.

subnet comienza un declaración de subred.

subnet-mask máscara; mascara de red

shared-network define unadeclaración de subred compartida.

Alguna veces es necesario especificar opciones para cierto número de máquinas de la red sin tener que tratarlas como una subred separada. Por ejemplo, se puede definir una subred para un grupo de equipos y entonces aplicarle unas opciones específicas a esa subred. Esto significa que tendremos que especificarle todas las opciones de configuración necesarias.

Por ejemplo:

shared-network 192.168.2.253 {
        subnet 192.168.2.0 netmask 255.255.255.0 {
                option routers 192.168.2.253;
                option subnet-mask 255.255.255.0;
                option broadcast-address 192.168.2.255;
                option domain-name-servers ns.atenea.dom, ns2.atenea.dom;
                pool {
                        default-lease-time 400;
                        max-lease-time 400;
                        range 192.168.2.100 192.168.2.200;
                        ddns-domainname "atenea.dom";
                        ddns-rev-domainname "in-addr.arpa";
                        }
        }
}
shared-network 192.168.3.253 {
        subnet 192.168.3.0 netmask 255.255.255.0 {
                option routers 192.168.3.253;
                option subnet-mask 255.255.255.0;
                option broadcast-address 192.168.3.255;
                option domain-name-servers ns.atenea.dom, ns2.atenea.dom;
                pool {
                        default-lease-time 400;
                        max-lease-time 400;
                        range 192.168.3.100 192.168.3.200;
                        ddns-domainname "atenea.dom";
                        ddns-rev-domainname "in-addr.arpa";
                        }
        }
}


DHCP y DNS

Como hemos visto, las opciones que tenemos que incluir eln el fichero /etc/dhcpd.conf para asegurar la comunicación entre DHCP Y DNS son:

ddns-updates on; activa la actualización DNS con los valores asignados mediante DHCP.

ddns-domainname "atenea.dom"; indica el dominio en el que se actualizan los DNS

ddns-update-style interim; esta línea indica el método de actualización DNS automática con los valores de la IP asignados por DHCP.

Ahora cada zona DNS en la que queramos que se actualicen automáticamente los datos asignados tendremos que indicarlo con la opción allow-uptates en el fichero /etc/named.conf. Por ejemplo:

zone "atenea.dom" in{
        type master;
        file "atenea.dom";
        notify no;
        allow-update{
                127.0.0.1;
                192.168.1.10;
        };
};
zone "1.168.192.IN-ADDR.ARPA" in{
        type master;
        file "192.168.1.0";
        notify no;
        allow-update{
                127.0.0.1;
                192.168.1.10;
        };
};

También tendremos que asegurarnos que el usuario que ejecuta named (también llamado named normalmente) tiene permiso de escritura sobre los ficheros de zona, /var/named/atenea.dom y /var/named/192.168.1.0 en el ejemplo anterior.



El fichero /var/state/dhcp/dhcpd.leases

Como hemos visto, este fichero contiene las direcciones asignadas. Su conternido es similar al siguiente:

# All times in this file are in UTC (GMT), not your local timezone.   This is
# not a bug, so please don't ask about it.   There is no portable way to
# store leases in the local timezone, so please don't request this as a
# feature.   If this is inconvenient or confusing to you, we sincerely
# apologize.   Seriously, though - don't ask.
# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-V3.0pl1
lease 192.168.1.90 {
  starts 5 2003/04/11 16:29:27;
  ends 5 2003/04/18 16:29:27;
  binding state active;
  next binding state free;
  hardware ethernet 00:10:4b:54:41:85;
  uid "\001\000\020KTA\205";
  set ddns-rev-name = "90.1.168.192.in-addr.arpa";
  set ddns-txt = "31070ea7b3f1e83949c8096766b1f5eee9";
  set ddns-fwd-name = "JULIA.atenea.dom";
  client-hostname "JULIA";
}
lease 192.168.1.7 {
  starts 5 2003/04/11 16:29:35;
  ends 5 2003/04/18 16:29:35;
  binding state active;
  next binding state free;
  hardware ethernet 48:54:e8:6c:a6:3f;
  uid "\001HT\350l\246?";
  set ddns-rev-name = "7.1.168.192.in-addr.arpa";
  set ddns-txt = "31006d63529f9d904ffdb884baa1923c39";
  set ddns-fwd-name = "msrr.atenea.dom";
  client-hostname "msrr";
}


Configuración de los clientes DHCP


Win32

Es muy simple, en Entorno de Red ->TCP/IP seleccionaremos "Obtener dirección IP automáticamente", o texto similar dependiendo de la versión.


Linux

Dependiendo de la distribución usamos el programa de configuración de red y asignamos al interfaz correspondiente obtener dirección IP por DHCP. Por ejemplo, en una distribución RedHat y similares, tendremos en el fichero /etc/sysconfig/networking/devices/ifcfg-eth0

DEVICE=eth0
USERCTL=no
ONBOOT=yes
BOOTPROTO=dhcp
NETMASK=255.255.255.0
IPADDR=192.168.1.11
IPXPRIMARY_802_2="no"
IPXACTIVE_802_2="no"
IPXPRIMARY_802_3="no"
IPXACTIVE_802_3="no"
IPXPRIMARY_ETHERII="no"
IPXACTIVE_ETHERII="no"
IPXPRIMARY_SNAP="no"
IPXACTIVE_SNAP="no"
BROADCAST=192.168.1.255
NETWORK=192.168.1.0
PEERDNS=no
TYPE=Ethernet

Observamos como la variable BOOTPROTO toma el valor dhcp.