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.
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;
}
}
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.
|