DHCP - Dynamic Host Configuration Protocol
Sergio González González
Universidad de León, España
sergio.gonzalez@hispalinux.es
 En este documento encontrarás una guía de como instalar y configurar el servidor DHCP de ISC (Internet Software Consortium) en la distribución Debian GNU/Linux. 
Introducción
 La elección del servidor DHCP del consorcio ISC (http://www.isc.org/) ha sido por varias razones: la primera es que viene en casi todas las distribuciones de GNU/Linux, de forma que no tendremos problemas para conseguirlo. Otra de las razones es consorcio que lo desarrolla, ISC, cuyo software cumple con los estándares y desarrolla un software de calidad. Muestra de esto, son programas como BIND (http://www.isc.org/products/BIND/), el servidor DNS más utilizado en Internet, e INN (http://www.isc.org/products/INN/), un servidor de news muy completo. 
 Se ha elegido la versión 2 de este servidor 1. Algunas características que ofrece este servidor son: 
•	Alto nivel de configuración
•	Verificación antes de la asignación de una IP (para evitar problemas con equipos cuya IP haya sido secuestrada)
•	Soporte de BOOTP
•	Soporte para varias interfaces de red
Instalación
 Sólo necesitamos instalar un paquete para tener el servidor DHCP listo para ser configurado. El paquete en cuestión es dhcp. La forma de instalarlo será la siguiente: 
# apt-get install dhcp
Una vez que se ha instalado correctamente el servidor DHCP, pasamos a configurarlo.
Organización de las redes de la Unidad de Imagen y del Laboratorio F1
 Antes de explicar la configuración del DHCP, vamos a ver como están organizadas las redes sobre las que se van a basar los ejemplos. 
Red de la Unidad de Imagen
 En esta red, todos los equipos comparten el mismo rango de direcciones IP, 192.168.1.0. La distribución de IP's es la siguiente: 
•	 Las IP's comprendidas entre la 192.168.1.1 y la 192.168.1.10, están reservadas para servidores y equipos con IP's fijas 
•	 Las IP's comprendidas entre la 192.168.1.11 y la 192.168.1.29, están reservadas para la asignación dinámica 
 En la siguiente figura se puede apreciar como está organizada la Red de la Unidad de Imagen: 

Red del Laboratorio F1
 Esta red está dividida en 3 subredes y su distribución se verá a continuación: 
•	 192.168.2.0: red destinada a los clientes del laboratorio, las IP's serán asignadas de forma dinámica 
•	 192.168.3.0: red desmilitarizada de servidores, las IP's que asigne el servidor DHCP serán fijas 
•	 192.168.4.0: red para proyectos, las IP's que asigne el servidor DHCP serán fijas 
 En la siguiente figura se puede apreciar como está organizada la Red del Laboratorio F1: 

Configuración
 Para configurar el servidor DHCP, tendremos que editar los siguientes ficheros: 
•	/etc/dhcpd.conf
•	/etc/init.d/dhcp
 A continuación veremos unos apuntes de cada uno de los archivos. 
/etc/dhcpd.conf
 Este es el archivo donde reside la configuración del DHCP y es el primero que debemos editar. Se divide en bloques2, dentro de los cuales se pueden definir otros bloques y así sucesivamente. Cada bloque posee una zona de configuración global, que se aplica a todos los bloques definidos dentro de este. Podemos considerar una zona de definición local3, definida en los bloques que dependen de otros bloques. Siempre prevalecerá la configuración del último bloque definido (el más interno, dentro de un conjunto de bloques). 
 Como una imágen vale más que mil palabras, a continuación se muestra gráficamente la explicación anterior: 

 Partiendo del concepto de bloque, descrito anteriormente, paso a definir ahora la estructura de los archivos de configuración que se han empleado para configurar el servidor DHCP. Se ha optado por dividir la configuración del DHCP en subredes, de forma que cada “bloque subred” contiene toda la configuración de la red a la que representa. 
 La parte global del “bloque subred” sería suficiente para configurar una red en la cual todos los equipos tuvisen IP's dinámicas. Si, como es nuestro caso, necesitamos asignar IP's fijas a determinados equipos, hemos de añadir el bloque group, dentro del cual se definirán los distintos hosts cuya IP sea fija. 
 Veamos esta estructura en la siguiente imagen: 

 A continuación veremos las partes más importantes de un fichero de configuración. Una subred quedaría definida de la siguiente forma: 

subnet 192.168.1.0 netmask 255.255.255.0 {

}
Importante: A partir de ahora, las opciones, irán dentro de las llaves del bloque subnet
 El rango de direcciones dinámicas se define con la siguiente opción, que como se puede observar, comprende todas las direcciones IP entre la 192.168.1.100 y la 192.168.1.200 (ambas incluidas): 

range 192.168.1.100 192.168.1.200;
 Un acpecto muy importante en la configuración de la red, son los servidores DNS y el router. Esto se configura de la siguiente manera: 

option domain-name-servers 192.168.1.1, 193.146.96.2, 193.146.96.3;
option routers 192.168.1.1;
 Más datos que hay que suministrar, a la hora de configurar una red, son la máscara de subred y la dirección de broadcast: 

option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
 El tiempo, medido en segundos, que va a tener un determinado host la configuración suministrada por el DHCP, se controla gracias a las siguientes opciones4: 

default-lease-time 86400;
max-lease-time 172800;
 Si necesitamos equipos con IP's fijas, se ha de definir un nuevo bloque en el “bloque subred”. group es el nombre el nuevo bloque, y dentro de este podremos definir algunas opciones específicas para los host con IP fija, como vemos a continuación: 

group {
   default-lease-time 604800;
   max-lease-time 691200;
}
 Pero esto no es suficiente para tener un host con una IP fija. Para ello debemos añadir un bloque host dentro del “bloque group”. Como se ve en el ejemplo de abajo, es necesario introducir la MAC del equipo al que le queremos asignar la dirección fija: 

host nombre-del-equipo {
   hardware ethernet 00:10:5a:f1:35:87;
   fixed-address 192.168.1.3;
}
/etc/init.d/dhcp
 Una vez que ya tenemos configurado el DHCP, hemos de ejecutarlo. Pero para ello, antes hemos de editar el fichero /etc/init.d/dhcp. En este fichero le diremos al servidor DHCP sobre que interfaces de red ha de aplicar la configuración. Para ello crearemos la siguiente variable: 

ARGS="-cf /etc/dhcpd.conf eth1 eth2"
 Una vez definida la variable y colocada en la sección de parámetros del script de inicio que estamos editando, le indicaremos al DHCP que ya estamos listos para que se ejecute. Para hacer esto, le daremos el valor 1 a la variable run_dhcpd: 

run_dhcpd=1
Ejemplo de fichero de configuración de DHCP
 A continuación se presentarán los archivos de configuración y los scripts de inicio usados en la red de la Unidad de Imagen y en el Laboratorio F1. 
Unidad de Imagen
 Archivo de configuración del DHCP: /etc/dhcpd.conf 

# dhcpd.conf
#
# Configuración de la red de la Unidad de Imagen.
#
#
# El rango de direcciones 192.168.1.1-10 está reservada
# para los servidores y ordenadores con IP fija.
#

subnet 192.168.1.0 netmask 255.255.255.0 {

  range 192.168.1.11 192.168.1.29;

  option domain-name-servers 192.168.1.1, 193.146.96.2, 193.146.96.3;
  option domain-name "uimagen.iaf";
  option routers 192.168.1.1;
  option subnet-mask 255.255.255.0;
  option broadcast-address 192.168.1.255;

  default-lease-time 86400;
  max-lease-time 172800;

  group {

     default-lease-time 604800;
     max-lease-time 691200;

     host apache {
         hardware ethernet 00:10:5a:f1:35:87;
         fixed-address 192.168.1.3;
     }

  }
}
 Script de inicio del DHCP: /etc/init.d/dhcp 

#! /bin/sh
#
# Script de inicio del servicio DHCP
#

DAEMON="/usr/sbin/dhcpd"
ARGS="eth0"
DHCPDPID=/var/run/dhcpd.pid

test -x ${DAEMON} || exit 0

# Asigna el valor 1 a la variable run_dhcpd para poder arrancar el dhcpd al inicio
# o el valor 0 para desabilitarlo.
run_dhcpd=1

if [ $run_dhcpd = 0 ]; then
  cat <<EOF

EOF
  exit 0
fi

case "$1" in
  start)
    start-stop-daemon --start --quiet --pidfile $DHCPDPID \
      --exec ${DAEMON} -- ${ARGS}
    ;;
  stop)
    start-stop-daemon --stop --quiet --pidfile $DHCPDPID
    ;;
  restart | force-reload)
    start-stop-daemon --stop --quiet --pidfile $DHCPDPID
    sleep 2
    start-stop-daemon --start --quiet --pidfile $DHCPDPID \
      --exec {$DAEMON} -- ${ARGS}
    ;;
  *)
    echo "Usage: /etc/init.d/dhcp {start|stop|restart|force-reload}"
    exit 1
esac

exit 0
Laboratorio F1
 Archivo de configuración del DHCP: /etc/dhcpd.conf 

# dhcpd.conf
#
# Configuración de la red del laboratorio F1
#

# RED DE PROYECTOS
#
# El rango 192.168.4.1-19 está reservado para direcciones
# fijas (servidores, por ejemplo).
#
# El rango 192.168.4.20-100 está reservado para equipos
# con ip's dinámicas.
#

subnet 192.168.4.0 netmask 255.255.255.0 {

  range 192.168.4.20 192.168.4.100;

  option domain-name-servers 192.168.4.1, 193.146.96.2, 193.146.96.3;
  option domain-name "sinformaticos.local";
  option routers 192.168.4.1;
  option subnet-mask 255.255.255.0;
  option broadcast-address 192.168.4.255;

  default-lease-time 86400;
  max-lease-time 129600;

  group {

      option domain-name "sistemasop.ui";
      default-lease-time 604800;
      max-lease-time 691200;

      host potasio {
          hardware ethernet 00:04:76:0B:D8:C6;
          fixed-address 192.168.4.2;
    }
  }
}

# RED DESMILITARIZADA DE SERVIDORES
#
# El rango 192.168.3.1-19 está reservado para servidores
# fijos.
#
# El rango 192.168.3.20-100 está reservado para equipos
# con ip's dinámicas.
#

subnet 192.168.3.0 netmask 255.255.255.0 {

  range 192.168.3.20 192.168.3.100;

  option domain-name-servers 192.168.3.1, 193.146.96.2, 193.146.96.3;
  option domain-name "sinformaticos.local";
  option routers 192.168.3.1;
  option subnet-mask 255.255.255.0;
  option broadcast-address 192.168.3.255;

  default-lease-time 86400;
  max-lease-time 129600;

  group {

      option domain-name "sistemasop.ui";
      default-lease-time 604800;
      max-lease-time 691200;

      host hidrogeno {
          hardware ethernet 00:04:76:0B:D6:F8;
          fixed-address 192.168.3.1 ;
      }

      host litio {
          hardware ethernet 00:04:76:0B:D8:80;
          fixed-address 192.168.3.2;
      }

      host sodio {
          hardware ethernet;
          fixed-address 192.168.3.3;
      }
      host armitage {
          hardware ethernet 08:00:69:0e:97:a7;
          fixed-address 192.168.3.4;
      }

      host switch {
          hardware ethernet 00:30:c1:aa:8b:80;
          fixed-address 192.168.3.10;
     }
  }
}

# RED DE CLIENTES
#
# El rango 192.168.2.1-39 está reservado para equipos
# con ip's fijas.
#
# El rango 192.168.2.40-100 está reservado para equipos
# clientes con ip's dinámicas.
#

subnet 192.168.2.0 netmask 255.255.255.0 {

  range 192.168.2.40 192.168.2.100;

  option domain-name-servers 192.168.2.1, 193.146.96.2, 193.146.96.3;
  option domain-name "sinformaticos.local";
  option routers 192.168.2.1;
  option subnet-mask 255.255.255.0;
  option broadcast-address 192.168.2.255;

  default-lease-time 86400;
  max-lease-time 129600;

  group {

      default-lease-time 604800;
      max-lease-time 691200;

      host si-server {
          hardware ethernet 00:04:76:0B:D8:C9;
          fixed-address 192.168.2.4;
      }

      host si-bdc {
          hardware ethernet 00:04:76:0B:D8:DF;
          fixed-address 192.168.2.5;
      }

      host cluster1 {
          hardware ethernet 00:04:76:0B:D8:78;
          fixed-address 192.168.2.11;
          option domain-name "sistemasop.ui";
      }

      host cluster2 {
          hardware ethernet 00:04:76:0B:D8:83;
          fixed-address 192.168.2.12;
          option domain-name "sistemasop.ui";
      }

##
## Configuración para el programa FAI
##

##    host equipo-12 {
##
##      # dhcpd.conf for fai
##      # replace FAISERVER with the name of your install server
##
##      #deny unknown-clients;
##      #option dhcp-max-message-size 2048;
##      #use-host-decl-names on;
##      #always-reply-rfc1048 on;
##
##        option option-170 "hidrogeno:/usr/local/share/fai";   # FAI_LOCATION
##        option option-171 "sysinfo";                         # FAI_ACTION
##        option option-172 "verbose sshd";                    # FAI_FLAGS
##        option root-path "/usr/lib/fai/nfsroot";
##
##            option routers 192.168.2.1;
##            option domain-name "sistemasop.ui";
##          option domain-name-servers 192.168.2.1,193.146.96.2,193.146.96.3;
##          #   option time-servers hidrogeno;
##          #   option ntp-servers time.rrz.uni-koeln.de,time2.rrz.uni-koeln.de;
##            server-name "hidrogeno";
##
##      hardware ethernet 00:04:76:0b:d8:87;
##          filename "/boot/equipo-12";
##            fixed-address 192.168.2.200;
##            option option-171 "sysinfo";    }
  }
}
 Script de inicio del DHCP: /etc/init.d/dhcp 

#! /bin/sh
#
# Script de inicio del servicio DHCP
#

DAEMON="/usr/sbin/dhcpd"
ARGS="-cf /etc/dhcpd.conf eth1 eth2"
DHCPDPID=/var/run/dhcpd.pid

test -x ${DAEMON} || exit 0

# Asigna el valor 1 a la variable run_dhcpd para poder arrancar el dhcpd al inicio
# o el valor 0 para desabilitarlo.
run_dhcpd=1

if [ $run_dhcpd = 0 ]; then
  cat <<EOF

EOF
  exit 0
fi

case "$1" in
  start)
    start-stop-daemon --start --quiet --pidfile $DHCPDPID \
      --exec ${DAEMON} -- ${ARGS}
    ;;
  stop)
    start-stop-daemon --stop --quiet --pidfile $DHCPDPID
    ;;
  restart | force-reload)
    start-stop-daemon --stop --quiet --pidfile $DHCPDPID
    sleep 2
    start-stop-daemon --start --quiet --pidfile $DHCPDPID \
      --exec {$DAEMON} -- ${ARGS}
    ;;
  *)
    echo "Usage: /etc/init.d/dhcp {start|stop|restart|force-reload}"
    exit 1
esac

exit 0
Prueba
 Ahora que ya tenemos configurado el servidor DHCP, lo arrancaremos con el comando: 

# /etc/init.d/dhcp restart

 Si no obtenemos ningún error y comprobamos que el servidor está ejecutándose: 

# netstat -patu | grep dhcpd
udp   0   0 *:bootps      *:*      1270/dhcpd-2.2.x

 Enhorabuena ya tienes servidor DHCP nuevo ;-) 
Más información
 Si se quiere profundizar más sobre este tema, se recomienda la lectura de las páginas del manual que acompañan al programa, así como los archivos de configuración de ejemplo. También se recomienda la lectura de los rfc's: 
•	 rfc951 (http://www.ietf.org/rfc/rfc951.txt) 
•	 rfc2131 (http://www.ietf.org/rfc/rfc2131.txt) 
•	 rfc2132 (http://www.ietf.org/rfc/rfc2132.txt) 
Sobre este documento
 Se otorga permiso para copiar, distribuir y/o modificar este documento bajo los términos de la Licencia de Documentación Libre GNU, versión 1.1 o cualquier versión posterior publicada por la Free Software Foundation. Puedes consultar una copia de la licencia en http://www.gnu.org/copyleft/fdl.html (http://www.gnu.org/copyleft/fdl.html) 
 Este documento ha sido escrito en formato XML utilizando la DTD de DocBook (http://www.docbook.org). Mediante este sistema, puede ser fácilmente transformado a múltiples formatos (HTML, TXT, PDF, PostScript, LaTeX, DVI, ...). Se recomienda su utilización como herramienta de documentación potente y libre. 
Notas
1. 	Era la versión estable en el momento de su instalación
2. 	Los bloques están encerrados entre llaves
3. 	Esto no es necesariamente cierto, ya que cada bloque sólo se puede configurar en su sección global, pero si tenemos un bloque del que no dependan otros bloques, la podemos considerar como local
4. 	Dependiendo de si se están haciendo pruebas en la red o no, conviene definir un tiempo mayor o menor en esta opción