Introducción al servicio DHCP
El servicio DHCP (Dynamic Host Configuration Protocol) permite que un servidor especifique parámetros de red de manera automática a las máquinas que lo solicitan cuando se conectan a la red. De esta manera se facilita la configuración en red de los ordenadores y su posterior mantenimiento.
En una red TCP/IP cada estación necesita conocer algunos parámetros básicos para poder comunicarse.
Estos parámetros básicos son: su dirección IP y la máscara de red. Si además la estación se quiere comunicar con estaciones de otra red, necesitará conocer la puerta de enlace por defecto y muy posiblemente el servidor DNS a utilizar. Pero el servidor DHCP puede pasar otros parámetros opcionales a las estaciones, por ejemplo:
- Dominio DNS de búsqueda.
- Servidor NTP a utilizar como referencia horaria.
- Otros servicios como: SMTP, TFTP, etc...
En cada estación pueden configurarse estos parámetros de forma estática o dinámica. Cuando se configuran de forma estática la estación guarda su propia configuración por lo que no depende de nadie para conectarse a la red. Cuando se configuran de forma dinámica la estación utiliza el protocolo DHCP para obtener estos parámetros desde de un servidor DHCP.
La configuración de red dinámica permite al administrador de la red ahorrar trabajo pues en lugar de configurar los parámetros de conexión en todas las estaciones puede configurar un servidor DHCP para que configure automáticamente a las estaciones. Además, cuando en el futuro se reorganice la red, sólo será necesario actualizar la configuración del servidor DHCP.
Cliente obteniendo configuración de red mediante DHCP
Cuando una estación quiere obtener una configuración de red válida —normalmente durante el arranque de la máquina— emite una petición DHCP Discover. Cuando esta petición —que se realiza mediante un paquete UDP de broadcast— alcanza a un servidor DHCP se establece una negociación por la que el servidor concede el uso de una IP y otros parámetros de red al cliente por un tiempo determinado. El cliente obtiene una concesión DHCP.
Es importante observar:
- El cliente no necesita tener configurada la interfaz de red para poder emitir una petición DHCP Discover.
- El servidor DHCP debe estar en la misma subred en la que estará el cliente. Si el cliente no tiene configuración de red, no puede alcanzar otras subredes.
- Cuando el servidor DHCP recibe la petición DHCP Discover obtiene la dirección MAC del cliente, lo que puede condicionar la dirección IP que asigna al cliente.
- El servidor DHCP realiza la concesión de una configuración de red al cliente por un tiempo determinado. Antes de llegar al fin del plazo establecido el cliente puede intentar renovar la concesión. Si una concesión prescribe el cliente debe dejar de utilizar la configuración de red.
En las distribuciones actuales de GNU/Linux la red está gestionada por dos servicios alternativos: systemd-networkd en las versiones de servidor y NetworkManager en la versión de escritorio. En Ubuntu se utilizará Netplan para generar la configuración de uno u otro.
A continuación se va a mostrar información sobre el cliente DHCP en tres escenarios diferentes:
- Cuando se utiliza
systemd-networkd
(por ejemplo en Ubuntu Server). - Cuando se utiliza
NetworkManager
(por ejemplo en Ubuntu Desktop). - Cuando se utiliza un cliente tradicional como
dhclient
.
Cliente DHCP con systemd-networkd
Las versiones actuales de Ubuntu Server utilizan systemd-networkd
para controlar la red. Así cuando en la configuración de Netplan se especifica que una interfaz de red se debe configurar automáticamente mediante una concesión DHCP es systemd-networkd
quien actúa como cliente DHCP. En este caso la herramienta utilizada por el administrador será: networkctl
.
Cuando se ejecuta sin argumentos networkctl
mostrará un listado de las interfaces de red. Por ejemplo, en un equipo con dos interfaces de red se puede obtener la siguiente salida:
root@luna:~# networkctl IDX LINK TYPE OPERATIONAL SETUP 1 lo loopback carrier unmanaged 2 enp0s3 ether routable configured 3 enp0s8 ether routable configured 3 links listed. root@luna:~#
Se podrá obtener información sobre el estado de todas las interfaces de red con el parámetro status
:
root@luna:~# networkctl status ● State: routable Address: 192.168.1.202 on enp0s3 10.0.0.100 on enp0s8 2a0c:5a84:360a:8400:a00:27ff:fe61:4815 on enp0s3 fe80::a00:27ff:fe61:4815 on enp0s3 fe80::a00:27ff:fe6b:e86a on enp0s8 Gateway: 10.0.0.1 (PCS Systemtechnik GmbH) on enp0s8 fe80::1 (zte corporation) on enp0s3 DNS: 10.0.0.1 Search Domains: domain.org oct 04 09:50:22 luna systemd[1]: Starting Network Service... oct 04 09:50:23 luna systemd-networkd[967]: enp0s3: Gained IPv6LL oct 04 09:50:23 luna systemd-networkd[967]: Enumeration completed oct 04 09:50:23 luna systemd[1]: Started Network Service. oct 04 09:50:23 luna systemd-networkd[967]: enp0s8: IPv6 successfully enabled oct 04 09:50:23 luna systemd-networkd[967]: enp0s3: IPv6 successfully enabled oct 04 09:50:23 luna systemd-networkd[967]: enp0s8: Link UP oct 04 09:50:23 luna systemd-networkd[967]: enp0s8: Gained carrier oct 04 09:50:24 luna systemd-networkd[967]: enp0s8: DHCPv4 address 10.0.0.100/24 via 10.0.0.1 oct 04 09:50:24 luna systemd-networkd[967]: enp0s8: Gained IPv6LL root@luna:~#
O bien sobre una interfaz concreta indicando su nombre:
root@luna:~# networkctl status enp0s8 ● 3: enp0s8 Link File: /usr/lib/systemd/network/99-default.link Network File: /run/systemd/network/10-netplan-enp0s8.network Type: ether State: routable (configured) Path: pci-0000:00:08.0 Driver: e1000 Vendor: Intel Corporation Model: 82540EM Gigabit Ethernet Controller (PRO/1000 MT Desktop Adapter) HW Address: 08:00:27:6b:e8:6a (PCS Systemtechnik GmbH) MTU: 1500 (min: 46, max: 16110) Queue Length (Tx/Rx): 1/1 Auto negotiation: yes Speed: 1Gbps Duplex: full Port: tp Address: 10.0.0.100 (DHCP4) fe80::a00:27ff:fe6b:e86a Gateway: 10.0.0.1 (PCS Systemtechnik GmbH) DNS: 10.0.0.1 Search Domains: domain.org oct 04 09:50:23 luna systemd-networkd[967]: enp0s8: IPv6 successfully enabled oct 04 09:50:23 luna systemd-networkd[967]: enp0s8: Link UP oct 04 09:50:23 luna systemd-networkd[967]: enp0s8: Gained carrier oct 04 09:50:24 luna systemd-networkd[967]: enp0s8: DHCPv4 address 10.0.0.100/24 via 10.0.0.1 oct 04 09:50:24 luna systemd-networkd[967]: enp0s8: Gained IPv6LL root@luna:~#
Para renovar una concesión de red en una interfaz se podrá utilizar networkctl renew <interfaz>
:
root@luna:~# networkctl renew enp0s8
Y se podrán consultar los detalles sobre las concesiones de red adquiridas en el directorio /run/systemd/netif/leases/
root@luna:~# cd /run/systemd/netif/leases root@luna:/run/systemd/netif/leases# ls 3 root@luna:/run/systemd/netif/leases# cat 3 # This is private data. Do not parse. ADDRESS=10.0.0.100 NETMASK=255.255.255.0 ROUTER=10.0.0.1 SERVER_ADDRESS=10.0.0.1 NEXT_SERVER=10.0.0.1 T1=9390 T2=16433 LIFETIME=18781 DNS=10.0.0.1 DOMAINNAME=domain.org CLIENTID=ffaf818f7d00020000ab115c2a3ce840c96886 root@luna:/run/systemd/netif/leases#
Cliente DHCP con NetworkManager
NetworkManager
suele utilizarse en la versión de escritorio de las distribuciones actuales de GNU/Linux debido a su interfaz gráfica necesaria, por ejemplo, para que el usuario seleccione la red WiFi a utilizar.
La interfaz gráfica de NetworkManager
es tan clara que no necesita ninguna explicación. Pero a NetworkManager le acompaña una completa herramienta para la línea de comandos —nmcli
— que resultará muy práctica para el administrador. Algunas de sus opciones son:
Mostrar la lista de redes WiFi que se detectan: nmcli device wifi list
usuario@laika:~$ nmcli device wifi list IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY 50:78:B3:BF:42:B8 GNU-24G Infra 5 130 Mbit/s 95 ▂▄▆█ WPA1 WPA2 * 50:78:B3:BF:42:B9 GNU Infra 48 270 Mbit/s 74 ▂▄▆_ WPA1 WPA2 usuario@laika:~$
Mostrar información sobre una interfaz de red: nmcli device show <interfaz>
usuario@laika:~$ nmcli device show wlo1 GENERAL.DEVICE: wlo1 GENERAL.TYPE: wifi GENERAL.HWADDR: A0:A4:C5:A0:6A:63 GENERAL.MTU: 1500 GENERAL.STATE: 100 (conectado) GENERAL.CONNECTION: GNU GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/2 IP4.ADDRESS[1]: 192.168.1.144/24 IP4.GATEWAY: 192.168.1.1 IP4.ROUTE[1]: dst = 0.0.0.0/0, nh = 192.168.1.1, mt = 600 IP4.ROUTE[2]: dst = 192.168.1.0/24, nh = 0.0.0.0, mt = 600 IP4.DNS[1]: 100.90.1.1 IP4.DNS[2]: 100.100.1.1 IP4.DNS[3]: 192.168.1.1 IP6.ADDRESS[1]: 2a0c:5a84:360a:8400:38a7:72bc:40d3:d986/64 IP6.ADDRESS[2]: 2a0c:5a84:360a:8400:dddb:6345:3797:7dd4/64 IP6.ADDRESS[3]: fe80::386a:bfda:e041:4ebd/64 IP6.GATEWAY: fe80::1 IP6.ROUTE[1]: dst = 2a0c:5a84:360a:8400::/64, nh = ::, mt = 600 IP6.ROUTE[2]: dst = ::/0, nh = fe80::1, mt = 20600 IP6.ROUTE[3]: dst = ff00::/8, nh = ::, mt = 256, table=255 IP6.ROUTE[4]: dst = fe80::/64, nh = ::, mt = 600 IP6.DNS[1]: 2a0c:5a80:0:2::1 IP6.DNS[2]: 2a0c:5a84:0:2::1 IP6.DNS[3]: fe80::1 usuario@laika:~$
Para volver a pedir una concesión de red será necesario desactivar la conexión (down) y volver a lenvantarla (up). A continuación se puede ver un ejemplo con la conexión 'GNU
':
usuario@laika:~$ nmcli connection
NAME UUID TYPE DEVICE
GNU 09d141a6-fa96-472e-8037-4961d7dce28a wifi wlo1
virbr0 94600a00-e898-4e06-8599-78df6844752e bridge virbr0
Conexión cableada 1 7ebaa372-6de1-3276-a2c7-e43e53ba50e2 ethernet --
GNU-24G c0563c3a-a0aa-45e5-ac3f-03e0c5b136f2 wifi --
usuario@laika:~$ nmcli connection down id 'GNU'
La conexión «GNU» se desactivó correctamente (ruta activa D-Bus: /org/freedesktop/NetworkManager/ActiveConnection/2)
usuario@laika:~$ nmcli connection up id 'GNU'
Conexión activada con éxito (ruta activa D-Bus: /org/freedesktop/NetworkManager/ActiveConnection/4)
usuario@laika:~$
Cliente DHCP tradicional: dhclient
Para realizar una solicitud DHCP se necesita un cliente como dhclient
(nativo de GNU/Linux, en el que existen clientes alternativos como pump
) o el comando ipconfig /renew
(en el caso de Windows). Cuando se obtiene una configuración de red, el cliente pasa a utilizarla.
Ejemplo:
[root@localhost ~]# dhclient -v eth0
Internet Systems Consortium DHCP Client V3.0.3
Copyright 2004-2005 Internet Systems Consortium.
All rights reserved.
For info, please visit http://www.isc.org/products/DHCP
Listening on LPF/eth0/00:c0:26:27:0b:d8
Sending on LPF/eth0/00:c0:26:27:0b:d8
Sending on Socket/fallback
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 6
DHCPOFFER from 192.168.100.1
DHCPREQUEST on eth0 to 255.255.255.255 port 67
DHCPACK from 192.168.100.1
bound to 192.168.100.101 -- renewal in 36616 seconds.
[root@localhost ~]#
En el caso de GNU/Linux, en el directorio /var/lib/dhcp
se guardan los ficheros en los que el cliente DHCP guarda información sobre las concesiones.
[root@localhost ~]# ll /var/lib/dhcp/
total 12
-rw-r--r-- 1 root root 766 may 8 08:41 dhclient-eth0.leases
-rw-r--r-- 1 root root 384 may 8 08:41 dhclient-eth1.leases
-rw-r--r-- 1 root root 772 may 8 10:42 dhclient.leases
[root@localhost ~]# cat /var/lib/dhcp/dhclient.leases
lease {
interface "eth0";
fixed-address 192.168.100.100;
option subnet-mask 255.255.255.0;
option dhcp-lease-time 86400;
option routers 192.168.100.1;
option dhcp-message-type 5;
option dhcp-server-identifier 192.168.100.1;
option domain-name-servers 62.81.16.132,62.81.0.36;
renew 2 2005/12/20 19:43:32;
rebind 3 2005/12/21 06:47:17;
expire 3 2005/12/21 09:47:17;
}
lease {
interface "eth0";
fixed-address 192.168.100.101;
option subnet-mask 255.255.255.0;
option routers 192.168.100.1;
option dhcp-lease-time 86400;
option dhcp-message-type 5;
option domain-name-servers 62.81.16.132,62.81.0.36;
option dhcp-server-identifier 192.168.100.1;
renew 1 2006/5/8 18:52:40;
rebind 2 2006/5/9 05:42:23;
expire 2 2006/5/9 08:42:23;
}
Servidor DHCP: isc-dhcp-server
Internet Systems Consortium desarrolla el servidor DHCP canónico: isc-dhcp-server
.
Se puede configurar un servidor DHCP para que asigne configuraciones de red de tres maneras diferentes:
- Asignación manual: Se asigna una configuración de red en función de la MAC del cliente. El administrador debe escribir la tabla de correspondencias en el servidor. Los clientes con MAC desconocida no se atienden.
- Asignación automática: El administrador define un rango de direcciones IP y el servidor hace concesiones permanentes a los clientes.
- Asignación dinámica: El servidor asigna dinámicamente direcciones libres del rango (o rangos) especificado por el administrador.
Requisitos del servidor
Un servidor DHCP debe tener la interfaz de red que utiliza para atender a los clientes:
- Configurada de forma estática (no puede estar configurada mediante DHCP).
- Con una IP correspondiente a la subred en la que están los clientes.
La configuración más sencilla pasa por tener el servidor en la misma subred que los clientes, si este no es el caso, se puede utilizar:
- La redirección de los puertos UDP 67 y 68 en el router.
- El uso de un servidor DHCP Relay en la subred de los clientes.
Configuración del servidor DHCP
Para instalar el servidor ISC DHCP basta con instalar el paquete isc-dhcp-server
. Una vez instalado el fichero /etc/dhcp/dhpcd.conf
contiene una configuración de muestra.
Se puede consultar el fichero de configuración del servidor DHCP utilizado en el centro en: https://github.com/vcarceler/cirdan-dhcp/blob/master/dhcpd.conf.
Ejemplo: dhcpd.conf
ddns-update-style none;
subnet 192.168.0.0 netmask 255.255.255.0 {
# default gateway
option routers 192.168.0.1;
option subnet-mask 255.255.255.0;
# DNS
option domain-name "domain.org";
option domain-name-servers 192.168.0.10;
# Pool
allow unknown-clients;
range 192.168.13.100 192.168.13.254;
default-lease-time 21600;
max-lease-time 43200;
# IP fija
host ns {
hardware ethernet 12:34:56:78:AB:CD;
fixed-address 192.168.0.10;
}
}
La página de manual del fichero dhcpd.conf
incluye información detallada sobre la sintáxis de dicho fichero.
Fichero de concesiones: /var/lib/dhcp/dhcpd.leases
El servidor DHCP escribe en /var/lib/dhcp/dhcpd.leases
información sobre las concesiones para que la información persista a través de los renicios. Cabe destacar que las horas en este fichero se guardan en la zona horaria UTC.
En el interior de este fichero se puede encontrar información sobre las concesiones de red:
lease 192.168.248.177 { starts 0 2020/10/04 15:05:42; ends 0 2020/10/04 15:15:42; cltt 0 2020/10/04 15:05:42; binding state active; next binding state free; rewind binding state free; hardware ethernet fc:ec:da:b0:02:b7; uid "\001\374\354\332\260\002\267"; set vendor-class-identifier = "ubnt"; client-hostname "Aula41ER5-D5"; } lease 192.168.249.223 { starts 0 2020/10/04 15:05:58; ends 0 2020/10/04 15:15:58; cltt 0 2020/10/04 15:05:58; binding state active; next binding state free; rewind binding state free; hardware ethernet f0:9f:c2:20:a6:4c; uid "\001\360\237\302 \246L"; set vendor-class-identifier = "ubnt"; client-hostname "Cuartodeservidores"; }
Más información:
- Wikipedia: DHCP
- Wikipedia: BOOTP
- Wikipedia: RARP
- Fichero de configuración del servidor DHCP utilizado en el centro
- Ejemplo de fichero dhcpd.conf
- Fichero ipxe-option-space.conf
- NetworkManager: nmcli-examples
- ISC DHCP
- ISC Kea DHCP
- Ubuntu: isc-dhcp-server
- Identificadores de cliente en DHCPv4
- DHCP con Kea