Introducción al servicio DHCP

per admin darrera modificació 2021-01-23T14:51:50+02:00

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:


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

https://commons.wikimedia.org/wiki/File:DHCP_session_en.svgCuando 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:

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: