Como instalar y configurar un servidor DHCP con isc-dhcp-server en Debian 12
¿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.