DHCP: Identificadores de cliente en DHCPv4

per Victor Carceler darrera modificació 2023-01-06T12:50:40+02:00

https://commons.wikimedia.org/wiki/File:DHCP_session_en.svgCuando un cliente DHCPv4 solicita una concesión de red debe identificarse ante el servidor. Tradicionalmente el servidor ha utilizado el paquete DHCP DISCOVERY que recibe del cliente para obtener la dirección MAC del cliente y, por tanto, identificar al cliente a través de su dirección física.

Sin embargo cuando se utiliza el protocolo DHCPv6 los clientes se identifican mediante un DUID DHCP Unique Identifier— tal y como se especifica en el RFC 3315. Donde se especifica que los DUID deben permanecer inalterables para los dispositivos y no deben cambiar cuando se reemplaza una interfaz de red.

Y ¿qué tiene que ver todo esto con DHCPv4? Pues que en DHCPv4 los clientes también pueden utilizar un DUID para identificarse ante el servidor tal y como especifica el RFC 4361. La intención declarada es facilitar la transición de IPv4 a IPv6 permitiendo que los clientes se identifiquen de manera consistente en las dos versiones del protocolo. Y aún más, que se identifiquen de manera consistente aunque cambien el adaptador de red utilizado (WiFi o cable) o se reemplace físicamente el adaptador de red por otro.

Cliente DHCP con systemd-networkd

La mayoría de las distribuciones GNU/Linux de servidor utilizan systemd-networkd para gestionar la red. Así lo hace Ubuntu 20.04 server donde el front-end es Netplan pero la red está gestionada por systemd-networkd.

Cuando se utiliza el cliente DHCP de systemd-networkd se envía un DUID en el paquete DHCP DISCOVERY que hace que el servidor ISC DHCP —con la configuración por defecto— identifique al cliente basándose en el DUID y no en la dirección MAC.

Se puede utilizar el comando tcpdump en el servidor para inspeccionar el paquete DHCP DISCOVERY.

17:12:28.047888 IP (tos 0xc0, ttl 64, id 0, offset 0, flags [none], proto UDP (17), length 316)
    0.0.0.0.bootpc > 255.255.255.255.bootps: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:a3:57:a7 (oui Unknown), length 288, xid 0x27ffaa9c, secs 1, Flags [none] (0x0000)
	  Client-Ethernet-Address 08:00:27:a3:57:a7 (oui Unknown)
	  Vendor-rfc1048 Extensions
	    Magic Cookie 0x63825363
	    DHCP-Message Option 53, length 1: Discover
	    Client-ID Option 61, length 19: hardware-type 255, e2:34:3f:3e:00:02:00:00:ab:11:5c:2a:3c:e8:40:c9:68:86
	    Parameter-Request Option 55, length 11: 
	      Subnet-Mask, Default-Gateway, Hostname, Domain-Name
	      Domain-Name-Server, MTU, Static-Route, Classless-Static-Route
	      Option 119, NTP, Option 120
	    MSZ Option 57, length 2: 576
	    Hostname Option 12, length 4: "luna"
	    END Option 255, length 0

Esto tiene el curioso efecto de que cuando un profesor prepara una máquina virtual para sus alumnos y estos arrancan múltiples instancias de la MV con la interfaz de red en modo puente el servidor DHCP confunda a todos los clientes como uno solo aunque los alumnos hayan reiniciado la MAC al importar o clonar la MV.

Pero hay dos alternativas para que el cliente DHCP utilice la MAC como identificador o parte del identificador:

Directiva dhcp-identifier: mac en la configuración de Netplan

Añadiendo la directiva dhcp-identifier: mac en la configuración de Netplan se consigue que el cliente utilice la dirección MAC como identificación.

usuario@luna:~$ cat /etc/netplan/00-installer-config.yaml 
# This is the network config written by 'subiquity'
network:
  ethernets:
    enp0s3:
      dhcp4: true
      dhcp-identifier: mac
  version: 2
usuario@luna:~$ 

Se puede observar en la petición DHCP DISCOVERY que el campo Client-ID está formado por la MAC del cliente.

19:35:18.313020 IP (tos 0xc0, ttl 64, id 0, offset 0, flags [none], proto UDP (17), length 304)
    0.0.0.0.bootpc > 255.255.255.255.bootps: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:d6:b1:a7 (oui Unknown), length 276, xid 0x259a1108, secs 1, Flags [none] (0x0000)
	  Client-Ethernet-Address 08:00:27:d6:b1:a7 (oui Unknown)
	  Vendor-rfc1048 Extensions
	    Magic Cookie 0x63825363
	    DHCP-Message Option 53, length 1: Discover
	    Client-ID Option 61, length 7: ether 08:00:27:d6:b1:a7
	    Parameter-Request Option 55, length 11: 
	      Subnet-Mask, Default-Gateway, Hostname, Domain-Name
	      Domain-Name-Server, MTU, Static-Route, Classless-Static-Route
	      Option 119, NTP, Option 120
	    MSZ Option 57, length 2: 576
	    Hostname Option 12, length 4: "luna"
	    END Option 255, length 0

Más información: Documentación de referencia de Netplan.

Cambio en /etc/systemd/networkd.conf

Es posible modificar el fichero de configuración /etc/systemd/networkd.conf descomentando la línea DUIDType (que por defecto tiene el valor vendor) para que tome el valor link-layer:

root@luna:/home/usuario# cat /etc/systemd/networkd.conf 
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See networkd.conf(5) for details

[Network]
#SpeedMeter=no
#SpeedMeterIntervalSec=10sec

[DHCP]
DUIDType=link-layer
#DUIDRawData=
root@luna:/home/usuario#

De este modo para componer el DUID se utilizará la dirección MAC de la interfaz y así el servidor DHCP del aula ya no confundirá a las MVs de los alumnos. Curiosamente en este caso el paquete DHCP DISCOVERY transportará un valor de Client-ID que estará compuesto por un valor derivado de /etc/machine-id y la MAC del equipo, pero cumplirá su función siempre que se reinicie la MAC.

19:49:21.978493 IP (tos 0xc0, ttl 64, id 0, offset 0, flags [none], proto UDP (17), length 312)
    0.0.0.0.bootpc > 255.255.255.255.bootps: [udp sum ok] BOOTP/DHCP, Request from 08:00:27:d6:b1:a7 (oui Unknown), length 284, xid 0x568f0a9d, secs 1, Flags [none] (0x0000)
	  Client-Ethernet-Address 08:00:27:d6:b1:a7 (oui Unknown)
	  Vendor-rfc1048 Extensions
	    Magic Cookie 0x63825363
	    DHCP-Message Option 53, length 1: Discover
	    Client-ID Option 61, length 15: hardware-type 255, e2:34:3f:3e:00:03:00:01:08:00:27:d6:b1:a7
	    Parameter-Request Option 55, length 11: 
	      Subnet-Mask, Default-Gateway, Hostname, Domain-Name
	      Domain-Name-Server, MTU, Static-Route, Classless-Static-Route
	      Option 119, NTP, Option 120
	    MSZ Option 57, length 2: 576
	    Hostname Option 12, length 4: "luna"
	    END Option 255, length 0

Más información: man networkd.conf.