Documentació alternativa [Linux]

Liberalia Tempus Servicios Informáticos

Configurar un servidor DHCP

PDF Imprimir E-mail

DHCP (Dynamic Host Configuration Protocol) es un protocolo de red en el que el servidor bajo el que está corriendo provee los parámetros de configuración necesarios a las máquinas conectadas a la red que así lo soliciten. Mediante DHCP se asignarán de forma totalmete automática y transparente parámetros como la puerta de enlace, la máscara de subred, la DNS o la propia dirección IP.


Funcionamiento

El protocolo DHCP nace en octubre de 1993 de la mano del Grupo de Trabajo Dynamic Host Configuration del IETF (Internet Engineering Task Force), una organización de voluntarios que define protocolos para su uso en internet) y sus características quedan definidas por el estándar RFC 2131 y RFC 2132. Dicho protocolo cubría la necesidad de control que empezaban a requerir ciertas redes de tamaño bastante abultado, donde la administración de las mismas se hacía bastante complicada, ya fuera por el número de equipos instalados o por la longitud física de la misma (proveedores de acceso a internet). Sin el protocolo DHCP, cada ordenador de una red ha de recibir su configuración manualmente, con el inconveniente que esto supone a la hora de reasignar direcciones a ordenadores que cambian frecuentemente su conexión, el cambio eventual de un servidor de DNS externo o la puerta de enlace de salida al exterior. El control de todos estos parámetros es absoluto desde un servidor de DHCP.

El protocolo admite tres tipos de asignación de direcciones IP, que pueden combinarse entre sí:

  • Manual / Estática - La asignación se realiza a partir de la lectura de una tabla de direcciones introducida manualmente por el administrador del servidor. Habitualmente, la máquina que recibe la asignación estática tiene igualmente configurada una dirección MAC que no debería repetirse en toda la red. De esta forma, dicha máquina recibe siempre la misma dirección IP, independientemente de dónde y cuándo se realice la conexión.
  • Automática e ilimitada - Una vez que el administrador ha determinado un rango de direcciones disponibles, la asignación se realiza de forma permanente hacia el cliente que la solicita y hasta que éste la libera.
  • Dinámica y limitada - Cada cliente obtiene su dirección al iniciar el interfaz de red. Mediante este método, las direcciones dentro del rango elegido por el administrador se reutilizan con cada máquina y durante un tiempo determinado. Con esta asignación se facilita enormemente la entrada de nuevas máquinas a la red de forma dinámica.

Básicamente, DHCP se dividirá en dos partes bien diferenciadas: un protocolo encargado de intercambiar los parámetros de red específicos para cada cliente y un mecanismo encargado de la asignación de las direcciones. Por otra parte, y de forma habitual, el servidor de DHCP se estructurará a partir de dos bases de datos: una estática, al uso de BOOTP, protocolo anterior a DHCP y compatible con éste y otra con una pila de direcciones disponibles, que será la encargada de facilitar los datos en una asignación automática o dinámica.

El funcionamiento sobre el papel de DHCP es bastante simple: el servidor DHCP recibe una petición del cliente y se chequea la base de datos estática en busca de alguna dirección asignada a la máquina que realiza la petición. Si existe una entrada para la dirección física que realiza la petición, se devuelve la dirección almacenada que corresponda. Si no se encuentra nada, el servidor selecciona una dirección disponible de la base de datos dinámica y se asigna de forma temporal a la máquina que lo solicita.

Repasemos las opciones más importantes que un servidor DHCP puede asignar/proveer a cualquier cliente que lo solicite. Dado que este es un artículo sobre un protocolo determinado, no se explicará el cometido de cada una de estas opciones:

  • Dirección del servidor de DNS.
  • Nombre de DNS.
  • Puerta de enlace de la dirección IP.
  • Dirección IP.
  • Máscara de subred.
  • Tiempo máximo de espera de ARP (Addres Resolution Protocol).
  • MTU (Maximun Transfer Unit) para cada máquina.
  • Servidores NIS.
  • Dominios NIS.
  • Servidores NTP (Network Time Protocol).
  • Servidores POP3 (Post Office Protocol)
  • Servidor SMTP (Simple Mail Transport Agent).
  • Servidor TFTP (Trivial File Transfer Protocol).
  • Nombre del servidor WINS (Windows Internet Naming Service).

Instalación del software DHCP en un servidor linux

Para nuestra instalación, vamos a utilizar una implementación del protocolo DHCP programada y mantenida por el ISC (Internet Systems Consortium). El software puede descargarse de su página web, aunque la gran mayoría de las distribuciones de linux han compilado un paquete que incluye la versión de DHCP del ISC. En nuestro caso, instalaremos DHCP desde la herramienta de paquetería YUM, aunque podemos usar la herramienta que creamos más conveniente:

[root@anna ~]# yum install dhcp
Installing: dhcp ################ [1/1]
Installed: dhcp.i386 10:3.0.2-34.FC4
Complete!

Con este paso, el software que implementará el protocolo en nuestro servidor quedará totalmente instalado. No se necesitan más programas adicionales y tan sólo habrá que configurar el servidor para que arranque de manera predeterminada con el inicio del sistema. En sistemas con Fedora Core, dicha configuración se implantaría de la siguiente manera:

# /sbin/chkconfig dhcpd on
# /sbin/service dhcpd start


Configuración del servidor

La instalación del servidor deja un fichero de configuración en la ruta /etc/dhcp.conf. Este fichero será leído durante la carga del protocolo DHCP y en él se configuran todas las opciones del mismo. Cualquier modificación realizada sobre este fichero será tenida en cuenta cada vez que el demonio de DHCP se inicie. Veamos un ejemplo de dicho fichero:

authoritative;
ddns-updates on;
ddns-update-style ad-hoc;
option domain-name-servers 10.0.0.1, 202.188.0.133, 202.188.1.5;
option subnet-mask 255.255.255.0;
option routers 10.0.0.1;

subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.201 192.168.1.220;
default-lease-time 86400;
max-lease-time 86400;
option routers 192.168.1.1;
option ip-forwarding off;
option broadcast-address 192.168.1.255;
option subnet-mask 255.255.255.0;
option domain-name-servers 192.168.1.100;
option nntp-server 192.168.1.100;
option netbios-name-servers 192.168.1.100;
}

subnet 10.0.0.0 netmask 255.255.255.0 {
ddns-updates on;
range 10.0.0.60 10.0.0.150;
}

group {
host 001_1 {
ddns-updates on;
hardware ethernet 00:50:8b:aa:f3:24;
fixed-address 10.0.0.50;
}

host 001_2 {
ddns-updates on;
hardware ethernet 00:50:8b:aa:f3:24;
fixed-address 10.0.0.50;
}

host cosh {
hardware ethernet 00:30:6e:28:5c:3f;
fixed-address 10.0.0.9;
}
}

Como podemos observar, cada órden o parámetro termina con un punto y coma (;), a excepción de las opciones que necesitan de varios parámetros, que se agrupan entre llaves ({...}). Repasemos a continuación las opciones y parámetros más importantes a nuestra disposición (para un detalle completo de todos los comandos accederemos al manual de configuración dhcp.conf(5) y dhcp-options(5)):

  • authoritative - La configuración correcta para la red es la definida en el servidor DHCP. Poner este parámetro al comienzo del archivo de configuración supone que el servidor DHCP reasignará direcciones a los clientes mal configurados por el motivo que sea, incluída una configuración nueva del servidor.
  • not authoritative - La función de este parámetro es justo la contraria del anterior. Es decir: la configuración del servidor de DHCP no es concluyente y los clientes mal configurados que sean detectados por el servidor, seguirán con su configuración intacta.
  • ignore|allow client-updates - Permite la actualización de las asignaciones (allow) de un cliente a requerimiento de este, o bien las asignaciones se actualizan cuando el servidor así lo requiera (ignore).
  • ddns-hostname <nombre> - Por defecto, el servidor DHCP utiliza como nombre para la solicitud el nombre que el cliente tiene asignado a su máquina. Mediante este parámetro se asigna un nombre concreto a una máquina o a todas en general. Por ejemplo, para asignar un nombre a una dirección MAC concreta, utilizaremos el código siguiente:

    host "nada" {
    hardware ethernet 00:60:30:3f:2d:4a;
    ddns-hostname "nombre_del_host";
    }


    Y para asignar, por ejemplo, la dirección MAC como parte del nombre del cliente, podemos usar lo siguiente:

    ddns-hostname = binary-to-ascii (16,
    8, "-", substring (hardware, 1, 6));


    Que devolverá algo como 0-50-56-b-b-b.dhcp.nombre.com.
  • ddns-domainname <nombre> - Mediante el uso de este parámetro, se añadirá <nombre> al final del nombre de la máquina cliente, para formar un nombre de dominio totalmente cualificado (FQDN).
  • ddns-update-style <tipo> - Define el método de actualización automática de las DNS. Los valores pueden ser ad-hoc, interim y none.
  • ddns-updates <on|off> - Activa la actualización DNS mediante los valores asignados por DHCP.
  • default-lease-time <duración> - Especifica la cantidad de tiempo, en segundos, que será mantenida una asignación de direcciones, siempre y cuando el cliente no haya especificado algo concreto.
  • fixed-address <direcciones> - Esta opción aparece únicamente en una declaración de host. Define las direcciones estática a asignar a un host determinado.
  • group - Inicia la declaración de Grupo.
  • hardware <tipo dirección> - Especifica el hardware de un cliente BOOTP para que éste sea reconocido por el servidor de DHCP. tipo puede ser ethernet o token-ring y dirección será una serie de octetos hexadecimales inequívocos de la tarjeta (por ejemplo, hardware ethernet 00:50:b3:c5:60:23).
  • max-lease-time <duración> - Especifica la cantidad máxima de tiempo, en segundos, que será mantenida una asignación de direcciones. No está sujeta a esta especificación la asignación dinámica BOOTP.
  • min-lease-time <duración> - Especifica la cantidad mínima de tiempo, en segundos, que será mantenida una asignación de direcciones.
  • one-lease-per-client <on|off> - Cuando la opción se iguala a on y un cliente solicita una asignación de dirección (DHCPREQUEST), el servidor libera de forma automática cualquier otra asignación asociada a dicho cliente. Con esto se supone que si el cliente solicita una nueva asignación es porque ha olvidado que tuviera alguna, luego tiene un sólo interfaz de red. No dándose esta situación entre los clientes no es muy aconsejable el uso de esta opción.
  • range ip-menor ip-mayor - En una declaración de subred, este parámetro define el rango de direcciones que serán asignadas. Pueden darse dos instrucciones range seguidas del modo:

    range 192.168.0.11 192.168.0.100;
    range 192.168.0.125 192.168.0.210;

  • server-identifier <IP> - Identifica la máquina donde se aloja el servidor de DHCP. Su uso se aplica cuando la máquina en cuestión tiene varias direcciones asignadas en un mismo interfaz de red.
  • server-name <nombre> - Nombre del servidor que será suministrado al cliente que solicita la asignación.
  • shared-network - Declaración de Subred compartida.
  • subnet - Declaración de Subred.
  • option domain-name <nombre> - Nombre de dominio que usará el cliente en una resolución de nombres vía DNS. Normalmente, será el nombre de dominio que se añadirá al host que realiza la petición de asignación.
  • option domain-name-servers <IP, [IP ...]> - Define el nombre de los servidores DNS.
  • option finger-server - Define el nombre de los servidores Finger disponibles para el cliente.
  • option host-name <nombre> - Especifica el nombre del cliente. Puede ser un nombre cualificado o no, aunque se recomienda que el nombre del dominio se asigne mediante option domain-name. Sólo se asignará el nombre al cliente en el caso de no tener éste asignado ninguno.
  • option irc-server <IP, [IP ...]> - Define el nombre de los servidores de IRC disponibles para el cliente.
  • option lpr-servers <IP, [IP ...]> - Define una lista de servidores de impresión LPR conforme al estándar RFC 1179. Se listan por orden de preferencia.
  • option nds-servers <IP, [IP ...]> - Define una lista de servidores NDS disponibles para el cliente. Se usa en conjunción de option nds-context <nombre>, que establece el nombre de inicio de la red Netware y option-nds-tree-name <nombre>, que especifica el nombre del árbol a usar por el cliente solicitante.
  • option netbios-name-servers <IP, [IP ...]> - Especifica un listado con los servidores WINS disponibles para los clientes.
  • option nis-servers <IP, [IP ...]> - Define la lista de servidores NIS (Sun Network Information Server) disponibles. Los servidores se listan en orden de preferencia. Para establecer el nombre del dominio NIS, se usará option nis-domain <nombre>.
  • option ntp-server <IP, [IP ...]> - Define los servidores horarios de NTP disponibles. Se listan en oreden de preferencia.
  • option pop-server <IP, [IP ...]> - Define los servidores de POP3 disponibles, listados en orden de preferencia.
  • option routers <IP, [IP ...]> - Se definen una serie de routers (en la práctica, puertas de enlace), listadas en orden de preferencia, disponibles para el acceso al exterior por parte del cliente.
  • option smtp-server <IP, [IP ...]> - Define la lista de servidores SMTP disponibles, listados en orden de preferencia.
  • option subnet-mask <IP> - Definición de la máscara de subred general.

Así, tal y como hemos visto en el archivo de configuración de ejemplo, primero se escriben una serie de opciones gernerales (authoritative, ignore client-updates, etc.), para seguidamente definir una red compartida (shared-network) con todas sus opciones específicas. Dicha red incluye tres definiciones: una subred (subnet) y dos hosts específicos (host). Se puede advertir igualmente que las direcciones de estos dos hosts no tienen por qué incluirse dentro del rango de la red general.


Ejemplos de configuración

Las opciones a nuestra disposición para configurar un servidor de DHCP son casi interminables. A continuación vamos a detallar con varios ejemplos las declaraciones más importantes que podemos usar en un fichero de configuración.

  • Declaración de Subred

Debe incluir una declaración subnet para cada subred en su red. Si no es así, el servidor DHCP no arrancará.
En este ejemplo, hay opciones globales para cada cliente DHCP en la subred y un range declarado. A los clientes se les asignará una dirección IP dentro de las IP declaradas en range.

subnet 192.168.1.0 netmask 255.255.255.0 {
option routers 192.168.1.254;
option subnet_mask 255.255.255.0;

option domain_name "example.com";
option domain_name_servers 192.168.1.1;

option time_offset _18000;
range 192.168.1.10 192.168.1.100;
}

  • Declaración de shared-network, o red compartida

Todas las subredes que comparten la misma red física deben especificarse dentro de una declaración shared_network. Los parámetros dentro de shared_network pero fuera del cerco de las declaraciones subnet se consideran parámetros globales. El nombre de shared_network debe ser el título descriptivo de la red, como, por ejemplo, mi_red_local. Dicho nombre puede ser igualmente una dirección IP.

shared_network mi_red_local {
option domain_name "test.fedora.com";
option domain_name_servers ns1.fedora.com, ns2.fedora.com;
option routers 192.168.1.254;
---Declaración de subredes específicas---
subnet 192.168.1.0 netmask 255.255.255.0 {
parameters for subnet
range 192.168.1.1 192.168.1.31;
}
subnet 192.168.1.32 netmask 255.255.255.0 {
parameters for subnet
range 192.168.1.33 192.168.1.63;
}
}

  • Declaración de Grupo

La declaración group puede utilizarse para aplicar parámetros globales a un grupo de declaraciones. Puede agrupar redes compartidas, subredes, hosts u otros grupos.

group {
option routers 192.168.1.254;
option subnet_mask 255.255.255.0;

option domain_name "example.com";
option domain_name_servers 192.168.1.1;

option time_offset _18000;

host apex {
option host_name "apex.example.com";
hardware ethernet 00:A0:78:8E:9E:AA;
fixed_address 192.168.1.4;
}

host raleigh {
option host_name "raleigh.example.com";
hardware ethernet 00:A1:DD:74:C3:F2;
fixed_address 192.168.1.6;
}
}


Consideraciones de seguridad

El servidor de DHCP utiliza el puerto 67 y 68 a través de UDP para recibir y enviar datos a los clientes. Es por esto que lo primero que deberemos retocar serán las reglas de nuestro cortafuegos, si es que este existe y si es que el servidor de DHCP comparte con él la misma máquina. Suponiendo que tenemos instalado iptables, la regla a introducir en el fichero de configuración será la siguiente:

$IPTABLES -I INPUT -i $LAN_IFACE -p udp --dport 67:68 --sport \
67:68 -j ACCEPT

Con esta regla se permite el tráfico hacia y desde los puertos UDP 67 y 68, lo cual nos deja abierto un pequeño agujero en el cortafuegos que permite el funcionamiento del servidor de DHCP.

En el caso de tener varios dispositivos de red configurados en la misma máquina, habrá que asegurarse de que nuestro servidor de DHCP sólo se ejecuta sobre el que tiene acceso a la red a la que va a proveer de servicio. En un sistema con Fedora Core, tenemos a nuestra disposición un fichero de configuración en la ruta /etc/sysconfig/dhcpd. Agregaremos lo siguiente a dicho fichero:

DHCPDARGS=eth0

eth0 se cambiará por el interfaz usado por DHCP.