# DHCP con Ubuntu

Vamos a montar una práctica donde dos máquinas virtuales, una servidor y otra cliente se den servicio de DHCP la una a la otra.

### Requisitos previos

* Dos MV:
  * Una con Ubuntu Desktop 22.04 y un adaptador de red:
    * red NAT sin DHCP
  * Otra con Sistema operativo cliente y un adaptador de red:
    * Red interna

## Actualizar e instalar paquetes&#x20;

Actualizamos los repositorios de nuestro sistema:

```bash
sudo apt update
```

Una vez hecho esto, procedemos  a instalar el paquete isc-dhcp-server:

```bash
sudo apt install isc-dhcp-server
```

En caso de error prueba con un `sudo apt upgrade`

## Configurar DHCP

Planificaremos para nuestra configuración una máquina Ubuntu server con la siguiente información:

```
Red: 10.0.0.0/24
Máscara: 255.255.255.0
IP server: 10.0.0.5
Rango de Ips: 10.0.0.10 10.0.0.50
DNS: 10.0.0.5
Gateway: 10.0.0.1 //el GW de salida de la red NAT
Broadcast: 10.0.0.255 
Tiempo de arrendamiento (lease-time): 600s
```

Primero revisemos que adaptadores de red tenemos disponibles en nuestra MV, aparecen tres:

* **lo**: dirección de loopback 127.0.0.1/8
* **enp0s3**: actualmente asignado mediante red NAT pero lo cambiaremos a IP fija.

### Configuración de servicio DHCP

Edita el archivo de configuración de la interfaz de red en `/etc/default/isc-dhcp-server` para especificar en qué interfaz debe escuchar el servidor DHCP. Abre el archivo en un editor de texto:

```bash
sudo nano /etc/default/isc-dhcp-server
```

Asegúrate de que la línea `INTERFACESv4` esté configurada para la interfaz que estás utilizando. Por ejemplo:

```bash
INTERFACESv4="enp0s3"
```

## Configuración de una red en DHCP

La información antes mencionada la dispondremos dentro de los archivos de configuración del servicio, para editar el fichero de configuración de nuestro servidor DHCP:

Antes de editar el archivo procedemos a realizar una copia de seguridad:

```bash
sudo cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.BKP
```

Para luego editar el archivo con <mark style="color:blue;">`nano`</mark><mark style="color:blue;">:</mark>

```bash
sudo nano /etc/dhcp/dhcpd.conf
```

Una vez dentro lo escribiremos de tal forma:

```bash
#Para tener una referencia
option domain-name "alexdns.local";
option domain-name-servers ns1.alexdns.local;

default-lease-time 600;
max-lease-time 7200;

authoritative;

subnet 10.0.0.0 netmask 255.255.255.0 {
range 10.0.0.10 10.0.0.50;
option routers 10.0.0.1; #con la Ip de GW de antes
option broadcast-address 10.0.0.255; #lo mismo con el broadcast
option domain-name-servers 10.0.0.5; #lo dejaremos configurado para poder usarlo como DNS

}
```

Si quiere asegurarte que el archivo de configuración del servidor DHCP (`/etc/dhcp/dhcpd.conf`) está correctamente configurado y sin errores de sintaxis puedes verificar la sintaxis del archivo con el siguiente comando:

```bash
sudo dhcpd -t
```

## Configuración de varias subredes

El Objetivo ahora es configurar el servidor DHCP para manejar múltiples subredes, útil en redes grandes con diferentes segmentos, para ello seguiremos los mismos pasos que antes pero modificaremos el archivo `/etc/dhcp/dhcpd.conf`

```
#Vamos a trabajar con la siguiente configuración:
IP server/DNS: 10.0.0.5
Máscara: 255.255.255.224

    Subred1 (La subred del servidor)
    IP red: 10.0.0.0/27
    Rango: 10.0.0.1 -- 10.0.0.30
    Broadcast: 10.0.0.31
    
    Subred2
    IP red: 10.0.0.32/27
    Rango: 10.0.0.33 -- 10.0.0.62
    Broadcast: 10.0.0.63
    
    Subred3
    IP red: 10.0.0.64/27
    Rango: 10.0.0.65 -- 10.0.0.94
    Broadcast: 10.0.0.95
```

En el archivo `/etc/dhcp/dhcpd.conf`, agrega configuraciones para varias subredes:

```bash
subnet 10.0.0.32 netmask 255.255.255.224 {
  range 10.0.0.33 10.0.0.62;
  option routers 10.10.0.34;
  option domain-name-servers 8.8.8.8, 8.8.4.4;
}

subnet 10.0.0.64 netmask 255.255.255.224 {
  range 10.0.0.65 10.0.0.94;
  option routers 10.10.0.65;
  option domain-name-servers 1.1.1.1;
}
```

**Ahora debemos c**onfigurar un **DHCP Relay** para reenviar solicitudes DHCP entre subredes cuando el servidor DHCP no está en la misma red que los clientes.

1. Instala el servicio de retransmisión:

   ```bash
   sudo apt install isc-dhcp-relay
   ```
2. Configura el archivo `/etc/default/isc-dhcp-relay` con la dirección del servidor DHCP y las interfaces que se usarán para reenviar las solicitudes:

   ```bash
   SERVERS="10.0.0.5"
   INTERFACES="enp0s3"
   OPTIONS=""
   ```
3. Reinicia el servicio y verifica que las solicitudes DHCP se reenvíen al servidor apropiado desde otra subred.

## :construction: **Configuración de un servidor DHCP failover (alta disponibilidad)**

Vamos a mirar que en caso de fallo de servidor, tener un entorno de alta disponibilidad para DHCP, con dos servidores que puedan operar en modo activo/pasivo.

Primero vayamos a simular la caída del servidor DHCP y luego recuperarlo sin interrumpir a los clientes que ya han recibido una IP:

1. Apaga el servidor DHCP temporalmente:

   ```bash
   sudo systemctl stop isc-dhcp-server
   ```
2. Monitoreamos el comportamiento de los clientes que intentan renovar su IP durante el tiempo de arrendamiento.
3. Reactiva el servidor y verifica que los clientes puedan renovar correctamente sus direcciones IP:

   ```bash
   sudo systemctl start isc-dhcp-server
   ```
4. Ahora sí, configuremos el archivo `/etc/dhcp/dhcpd.conf` en ambos servidores para establecer el modo failover, este código lo pondremos en nuestro servidor primario:

   ```bash
   failover peer "dhcp-failover" {
     primary;  # en el servidor primario
     address 10.0.0.5;
     port 519;
     peer address 10.0.0.50; #Ip del servidor secundario
     peer port 519;
     max-response-delay 60;
     max-unacked-updates 10;
     load balance max seconds 3;
     mclt 3600;
     split 128;
   }
   ```
5. Configura el segundo servidor como secundario con las configuraciones que hemos visto en anteriores puntos.
6. Verifica que ambos servidores puedan compartir el estado de los clientes DHCP simulando el entorno de nuevo.

## Revisar servicios de red

Reinicia el servicio DHCP para aplicar los cambios:

```bash
sudo systemctl restart isc-dhcp-server
sudo service isc-dhcp-server restart
```

Para asegurarte de que el servicio DHCP se inicie automáticamente al arrancar, ejecuta el siguiente comando:

```bash
sudo systemctl enable isc-dhcp-server
```

Además, podemos ver en el servidor si el cliente tiene una dirección DHCP. Esto lo podemos ver en en el archivo de "<mark style="color:blue;">arrendamientos</mark>":

<pre class="language-bash"><code class="lang-bash"><strong>cat /var/lib/dhcp/dhcpd.leases
</strong></code></pre>

### Creación de rangos de exclusiones

Los rangos de exclusión son útiles para, literalmente, excluir IPs de ser ofrecidas, bien por que nos interesa asociarlas a otros dispositivos o bien por que queremos asignarlos a otros pools.

Para hacerlo deberás añadir en el `dhcpd.conf` mediante pool:

<pre class="language-bash"><code class="lang-bash"><strong>#Si esto es la asignación normal:
</strong><strong>subnet 192.168.22.0 netmask 255.255.255.0 {
</strong>    range 192.168.22.100 192.168.22.199;
    range 192.168.22.200 192.168.22.222;
    option routers 192.168.22.1;
    option broadcast-address 192.168.22.255;
    option domain-name-servers 1.1.1.1;

#La regla de exclusión es la siguiente:
pool {
    range 192.168.22.200 192.168.22.222;
    deny all clients;
    }
}
</code></pre>
