Como instalar y configurar un servidor DHCP con isc-dhcp-server en Debian 12

dhcp

¿Que es isc-dhcp-server?

isc-dhcp-server es un servidor DHCP de código abierto que nos permite asignar a los dispositivos de una red su configuración de red automáticamente.

Requisitos

  • Sistema Debian 12 actualizado.
  • Privilegios de root o sudo.
  • Acceso a internet.

Instalación

Para instalar isc-dhcp-server en Debian 12 ejecutamos el siguiente comando:

root@dhcp:~# apt install isc-dhcp-server -y

Una vez instalado, si comprobamos el estado del servicio mediante systemctl veremos que está en failed. Esto es porque no hemos configurado el servidor DHCP.

root@Dhcp:~# systemctl status isc-dhcp-server.service
x isc-dhcp-server.service - LSB: DHCP server
     Loaded: loaded (/etc/init.d/isc-dhcp-server; generated)
     Active: failed (Result: exit-code) since Sat 2023-09-30 17:19:46 UTC; 20s ago
       Docs: man:systemd-sysv-generator(8)
    Process: 1551 ExecStart=/etc/init.d/isc-dhcp-server start (code=exited, status=1/FAILURE)
        CPU: 13ms

Sep 30 17:19:44 Dhcp dhcpd[1563]: bugs on either our web page at www.isc.org or in the README file
Sep 30 17:19:44 Dhcp dhcpd[1563]: before submitting a bug.  These pages explain the proper
Sep 30 17:19:44 Dhcp dhcpd[1563]: process and the information we find helpful for debugging.
Sep 30 17:19:44 Dhcp dhcpd[1563]:
Sep 30 17:19:44 Dhcp dhcpd[1563]: exiting.
Sep 30 17:19:46 Dhcp isc-dhcp-server[1551]: Starting ISC DHCPv4 server: dhcpdcheck syslog for diagnostics. ... failed!
Sep 30 17:19:46 Dhcp isc-dhcp-server[1551]:  failed!
Sep 30 17:19:46 Dhcp systemd[1]: isc-dhcp-server.service: Control process exited, code=exited, status=1/FAILURE
Sep 30 17:19:46 Dhcp systemd[1]: isc-dhcp-server.service: Failed with result 'exit-code'.
Sep 30 17:19:46 Dhcp systemd[1]: Failed to start isc-dhcp-server.service - LSB: DHCP server.

Configuración

Lo primero que tenemos que hacer es configurar la interfaz de red que usaremos para el servidor DHCP. En mi caso es la interfaz eth1.

root@Dhcp:~# nano /etc/default/isc-dhcp-server

Ponenemos el nombre de la interfaz entre las comillas de la línea INTERFACESv4:

INTERFACESv4="eth1"

Guardamos y cerramos el archivo.

Ahora tenemos que configurar el servidor DHCP. Para ello editamos el archivo /etc/dhcp/dhcpd.conf.

Configurare el servidor DHCP para que asigne direcciones IP a los dispositivos de la red 10.0.2.0/24 y que el rango de direcciones IP que asigne sea de 30 a 50 y la gateway sea 10.0.2.1 y utilizaré los servidores DNS de Google.

root@Dhcp:~# nano /etc/dhcp/dhcpd.conf

Añadimos las siguientes líneas al archivo:

subnet 10.0.2.0 netmask 255.255.255.0 {
  range 10.0.2.30 10.0.2.50;
  option routers 10.0.2.1;
  option broadcast-address 10.0.2.255;
  option domain-name-servers 8.8.8.8;
}

Guardamos y cerramos el archivo.

Reiniciamos el servicio isc-dhcp-server:

root@Dhcp:~# systemctl restart isc-dhcp-server.service

En este escenario tenemos 3 máquinas virtuales con Debian 12:

  • Dhcp (configurado como servidor DHCP)
  • Cli1-dhcp (configurado para obtener la configuración de red automáticamente)
  • Cli2-dhcp (configurado para obtener la configuración de red automáticamente)

Ahora vamos a comprobar que el servidor DHCP funciona correctamente.

Comprobación

Cli1-dhcp

Comprobamos que Cli1-dhcp obtiene la configuración de red automáticamente.

root@cli1-dhcp:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0@if47: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether aa:ea:15:45:78:f7 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.0.2.31/24 brd 10.0.2.255 scope global dynamic eth0
       valid_lft 599sec preferred_lft 599sec
    inet6 fe80::a8ea:15ff:fe45:78f7/64 scope link 
       valid_lft forever preferred_lft forever

Cli2-dhcp

Comprobamos que Cli2-dhcp obtiene la configuración de red automáticamente.

root@cli2-dhcp:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0@if51: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 22:87:e9:ec:1b:a5 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.0.2.33/24 brd 10.0.2.255 scope global dynamic eth0
       valid_lft 476sec preferred_lft 476sec
    inet 10.0.2.30/24 brd 10.0.2.255 scope global secondary dynamic eth0
       valid_lft 381sec preferred_lft 381sec
    inet6 fe80::2087:e9ff:feec:1ba5/64 scope link 
       valid_lft forever preferred_lft forever

Como acabamos de ver, Cli1-dhcp y Cli2-dhcp obtienen la configuración de red automáticamente del servidor DHCP dentro del rango de direcciones IP que hemos configurado.

Dhcp

Tambien podemos comprobar desde el servidor DHCP las concediones de direcciones IP que ha realizado.

Podemos comprobar las concesiones de direcciones IP utilizando el comando cat con el archivo /var/lib/dhcp/dhcpd.leases:

root@dhcp:~# cat /var/lib/dhcp/dhcpd.leases

lease 10.0.2.31 {
  starts 6 2023/09/30 18:06:17;
  ends 6 2023/09/30 18:16:17;
  cltt 6 2023/09/30 18:06:17;
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet aa:ea:15:45:78:f7;
  uid "\377\025Ex\367\000\001\000\001,\244B\340\252\352\025Ex\367";
  client-hostname "cli1-dhcp";
}
lease 10.0.2.33 {
  starts 6 2023/09/30 18:07:25;
  ends 6 2023/09/30 18:17:25;
  cltt 6 2023/09/30 18:07:25;
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet 22:87:e9:ec:1b:a5;
  client-hostname "cli2-dhcp";
}

o utilizando el comando dhcp-lease-list:

root@Dhcp:~# dhcp-lease-list
To get manufacturer names please download http://standards-oui.ieee.org/oui.txt to /usr/local/etc/oui.txt
Reading leases from /var/lib/dhcp/dhcpd.leases
MAC                IP              hostname       valid until         manufacturer
===============================================================================================
22:87:e9:ec:1b:a5  10.0.2.33       cli2-dhcp      2023-09-30 18:08:51 -NA-
aa:ea:15:45:78:f7  10.0.2.31       cli1-dhcp      2023-09-30 18:11:47 -NA-

Como podemos ver, el servidor DHCP ha concedido las direcciones IP.

Reserva de direcciones IP

Tambien podemos configurar el servidor DHCP para que asigne siempre la misma dirección IP a un dispositivo concreto. Esto se conoce como reserva de direcciones IP.

Para configurar una reserva de direcciones IP, tenemos que añadir las siguientes líneas al archivo /etc/dhcp/dhcpd.conf:

En esta prueba vamos a configurar una reserva de IP para el dispositivo cli1-dhcp con la dirección IP 10.0.2.40.

host cli1-dhcp {
  hardware ethernet aa:ea:15:45:78:f7;
  fixed-address 10.0.2.40;
}

Reiniciamos el servicio isc-dhcp-server:

root@Dhcp:~# systemctl restart isc-dhcp-server.service

En el cliente cli1-dhcp ejecutamos los siguientes comandos para que libere la dirección IP que tiene asignada y la vuelva a solicitar al servidor DHCP:

root@cli1-dhcp:~# dhclient -r
root@cli1-dhcp:~# dhclient

Comprobamos que cli1-dhcp tiene la dirección IP

root@cli1-dhcp:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0@if47: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether aa:ea:15:45:78:f7 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.0.2.40/24 brd 10.0.2.255 scope global dynamic eth0
       valid_lft 604799sec preferred_lft 604799sec
    inet6 fe80::a8ea:15ff:fe45:78f7/64 scope link 
       valid_lft forever preferred_lft forever

Como podemos ver, cli1-dhcp tiene la dirección IP que hemos configurado en la reserva. Ahora cada vez que cli1-dhcp solicite una dirección IP al servidor DHCP le asignará la dirección IP que hemos configurado en la reserva. Hasta que no eliminemos la reserva, cli1-dhcp siempre tendrá la misma dirección IP. Con esto ya tenemos hecha la reserva de direcciones IP.

Dhcp de multiples subredes

Tambien podemos configurar el servidor DHCP para que asigne direcciones IP a dispositivos de multiples subredes.

En esta prueba le he añadido otra interfaz de red al servidor dhcp con la dirección IP 10.0.3.1/24.

La máquina cli1-dhcp estará conectado a la interfaz eth1 del servidor dhcp (red 10.0.2.0/24) y la máquina cli2-dhcp estará conectado a la interfaz eth2 del servidor dhcp (red 10.0.3.0/24).

La primero que tenemos que hacer en el servidor dhcp es añadir la interfaz eth2 al archivo /etc/default/isc-dhcp-server:

root@dhcp:~# nano /etc/default/isc-dhcp-server

INTERFACESv4="eth1 eth2"

Guardamos y cerramos el archivo.

Ahora tenemos que configurar el servidor DHCP para que asigne direcciones IP a los dispositivos de la red.

Modificamos el archivo /etc/dhcp/dhcpd.conf:

root@dhcp:~# nano /etc/dhcp/dhcpd.conf

Incluyendo la configuración de las dos subredes quedaría de la siguiente forma:

subnet 10.0.2.0 netmask 255.255.255.0 {
  range 10.0.2.30 10.0.2.50;
  option routers 10.0.2.1;
  option broadcast-address 10.0.2.255;
  option domain-name-servers 8.8.8.8;
}

subnet 10.0.3.0 netmask 255.255.255.0 {
  range 10.0.3.35 10.0.3.55;
  option routers 10.0.3.1;
  option broadcast-address 10.0.3.255;
  option domain-name-servers 8.8.8.8;
}

Guardamos y cerramos el archivo.

Reiniciamos el servicio isc-dhcp-server:

root@dhcp:~# systemctl restart isc-dhcp-server.service

Prueba de conectividad

Comprobamos que Cli1-dhcp obtiene la configuración de red automáticamente
root@cli1-dhcp:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0@if125: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether aa:ea:15:45:78:f7 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.0.2.31/24 brd 10.0.2.255 scope global dynamic eth0
       valid_lft 604177sec preferred_lft 604177sec
    inet6 fe80::a8ea:15ff:fe45:78f7/64 scope link 
       valid_lft forever preferred_lft forever
Comprobamos que Cli2-dhcp obtiene la configuración de red automáticamente
root@cli2-dhcp:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0@if129: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 22:87:e9:ec:1b:a5 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.0.3.35/24 brd 10.0.3.255 scope global dynamic eth0
       valid_lft 604153sec preferred_lft 604153sec
    inet6 fe80::2087:e9ff:feec:1ba5/64 scope link 
       valid_lft forever preferred_lft forever

Como acabamos de ver, Cli1-dhcp y Cli2-dhcp obtienen la configuración de red automáticamente del servidor DHCP dentro del rango de direcciones IP que hemos configurado.

Comprobamos la conectividad desde el servidor DHCP a los clientes

Vamos a comprobar que podemos hacer ping desde el servidor dhcp a Cli1-dhcp y Cli2-dhcp.

Ping a Cli1-dhcp:

root@Dhcp:~# ping 10.0.2.31
PING 10.0.2.31 (10.0.2.31) 56(84) bytes of data.
64 bytes from 10.0.2.31: icmp_seq=1 ttl=64 time=0.061 ms
64 bytes from 10.0.2.31: icmp_seq=2 ttl=64 time=0.037 ms
64 bytes from 10.0.2.31: icmp_seq=3 ttl=64 time=0.054 ms
64 bytes from 10.0.2.31: icmp_seq=4 ttl=64 time=0.051 ms
^C
--- 10.0.2.31 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3075ms
rtt min/avg/max/mdev = 0.037/0.050/0.061/0.008 ms

Ping a Cli2-dhcp:

root@Dhcp:~# ping 10.0.3.35
PING 10.0.3.35 (10.0.3.35) 56(84) bytes of data.
64 bytes from 10.0.3.35: icmp_seq=1 ttl=64 time=0.063 ms
64 bytes from 10.0.3.35: icmp_seq=2 ttl=64 time=0.055 ms
64 bytes from 10.0.3.35: icmp_seq=3 ttl=64 time=0.054 ms
64 bytes from 10.0.3.35: icmp_seq=4 ttl=64 time=0.037 ms
^C
--- 10.0.3.35 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3075ms
rtt min/avg/max/mdev = 0.037/0.052/0.063/0.009 ms

Como podemos ver, el servidor DHCP tiene conectividad con Cli1-dhcp y Cli2-dhcp. Con esto ya tenemos configurado el servidor DHCP de multiples subredes.