# Servidor DHCP

**Mòdul:** 0227 - Serveis de xarxa / 0375 - Serveis de xarxa i Internet

**Nivell:** SMX / ASIX

**Sistema operatiu:** Ubuntu Server 24.04

# 1. Introducció

El protocol **DHCP** (*Dynamic Host Configuration Protocol*) permet assignar automàticament paràmetres de xarxa als clients: adreça IP, màscara de subxarxa, porta d'enllaç predeterminada, servidors DNS, etc.

Sense DHCP, cada dispositiu de la xarxa hauria de tenir la seva adreça IP configurada manualment. En xarxes grans, això és inviable i propens a errors (conflictes d'IP, errors tipogràfics, etc.).

## Com funciona DHCP: el procés DORA

![Seqüència DORA](https://proferamon.com/tic/imatges/dhcp/dhcp01.png)

| Pas | Missatge | Descripció |
|-----|----------|------------|
| 1 | **DISCOVER** | El client fa un broadcast cercant servidors DHCP |
| 2 | **OFFER** | El servidor ofereix una adreça IP disponible |
| 3 | **REQUEST** | El client sol·licita formalment l'adreça oferta |
| 4 | **ACK** | El servidor confirma i lliura la configuració |

# 2. Escenari de pràctica

En aquest document configurarem el servidor DHCP per a la xarxa següent:

![Escenari](https://proferamon.com/tic/imatges/dhcp/dhcp02.png)

| Paràmetre | Valor |
|-----------|-------|
| Xarxa | `192.168.10.0/24` |
| Màscara | `255.255.255.0` |
| Rang d'adreces dinàmiques | `192.168.10.100` – `192.168.10.200` |
| Porta d'enllaç (*gateway*) | `192.168.10.1` |
| Servidor DNS primari | `8.8.8.8` |
| Servidor DNS secundari | `8.8.4.4` |
| Nom de domini | `smx.local` |
| Temps de concessió (*lease*) | 24 hores |

# 3. Requisits previs

Abans de començar, cal tenir:

- Ubuntu Server 24.04 LTS instal·lat i actualitzat
- Accés com a usuari amb privilegis `sudo`
- La interfície de xarxa correctament identificada (`ip a` o `ip link`)
- Connexió a Internet per descarregar paquets (durant la instal·lació)

## 3.1. Identifica la interfície de xarxa

```bash
ip link show
```

Exemple de sortida:

```ini
1: lo: <LOOPBACK,UP,LOWER_UP> ...
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
```

En aquest document utilitzarem `enp0s8` com a interfície de la xarxa LAN.

> [!NOTE]
> Els noms de les interfícies varien segons el maquinari i la configuració del sistema. Substitueix `enp0s8` pel nom correcte al teu sistema.

# 4. Configuració de la interfície de xarxa del servidor

El servidor DHCP ha de tenir una **adreça IP estàtica** a la interfície LAN. A Ubuntu 24.04, la xarxa es configura amb **Netplan**.

## 4.1. Edita la configuració de Netplan

```bash
sudo nano /etc/netplan/00-installer-config.yaml
```

Afegeix o modifica la configuració de la interfície LAN:

```nano
network:
  version: 2
  ethernets:
    enp0s8:
      addresses:
      - 192.168.10.10/24
      dhcp4: false
      nameservers:
        addresses:
        - 8.8.8.8
        - 8.8.4.4
      routes:
      - to: "default"
        via "192.168.10.1"      
```

> [!WARNING]
> El format YAML és sensible a la indentació. Utilitza sempre espais, **mai tabuladors**.

## 4.2. Aplica la configuració

```bash
sudo netplan apply
```

## 4.3. Verifica la configuració

```bash
ip addr show enp0s8
```

La sortida ha de mostrar l'adreça `192.168.10.10/24`:

```ini
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
    inet 192.168.10.10/24 brd 192.168.10.255 scope global enp0s8
```

# 5. Instal·lació del servidor DHCP

## 5.1. Actualitza els dipòsits

```bash
sudo apt update
```

## 5.2. Instal·la el paquet `isc-dhcp-server`

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

Durant la instal·lació, el servei intentarà arrencar i **fallarà** perquè encara no està configurat. Això és normal.

## 5.3. Verifica la instal·lació

```bash
dpkg -l isc-dhcp-server
```

```ini
ii  isc-dhcp-server  4.4.3-P1-2ubuntu3  amd64  ISC DHCP server for automatic IP address assignment
```

# 6. Configura el servidor DHCP

La configuració del servidor DHCP es divideix en dos fitxers principals:

| Fitxer | Funció |
|--------|-----------|
| `/etc/default/isc-dhcp-server` | Indica en quines interfícies escolta el servidor |
| `/etc/dhcp/dhcpd.conf` | Defineix els paràmetres de xarxa i els rangs d'adreces |

## 6.1. Especifica la interfície d'escolta

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

Modifica la línia `INTERFACESv4`:

```bash
# Interfaces on which the DHCP server will serve DHCP requests.
INTERFACESv4="enp0s8"
INTERFACESv6=""
```

## 6.2. Configura `dhcpd.conf`

Fes una còpia de seguretat del fitxer original:

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

Edita el fitxer de configuració principal:

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

Substitueix el contingut per la configuració següent:

```nano
# ============================================================
# Fitxer de configuració del servidor DHCP
# Servidor: Ubuntu Server 24.04
# Xarxa: 192.168.10.0/24
# ============================================================

# Paràmetres globals del servidor
default-lease-time 86400;       # Temps de concessió per defecte: 24 hores (en segons)
max-lease-time 172800;          # Temps de concessió màxim: 48 hores (en segons)

# El servidor és l'autoritat DHCP d'aquesta xarxa
authoritative;

# Opcions globals (s'apliquen a totes les subxarxes si no s'especifica el contrari)
option domain-name "smx.local";
option domain-name-servers 8.8.8.8, 8.8.4.4;

# -----------------------------------------------------------
# Declaració de la subxarxa 192.168.10.0/24
# -----------------------------------------------------------
subnet 192.168.10.0 netmask 255.255.255.0 {

    # Rang d'adreces IP dinàmiques que es poden assignar
    range 192.168.10.100 192.168.10.200;

    # Opcions específiques per a aquesta subxarxa
    option routers 192.168.10.1;              # Porta d'enllaç predeterminada
    option subnet-mask 255.255.255.0;         # Màscara de subxarxa
    option broadcast-address 192.168.10.255;  # Adreça de difusió
}
```

# 7. Assigna adreces IP estàtiques (reserva per MAC)

Per assignar sempre la mateixa IP a un dispositiu concret (impressora, servidor, NAS, etc.), s'utilitza una **reserva** basada en l'adreça MAC del dispositiu.

Afegeix els blocs `host` dins del bloc `subnet` o fora d'ell:

```nano
# -----------------------------------------------------------
# Reserves d'adreces IP estàtiques (per adreça MAC)
# -----------------------------------------------------------

# Impressora de la classe
host impressora-classe {
    hardware ethernet 08:00:27:AA:BB:CC;
    fixed-address 192.168.10.11;
}

# PC del professor
host pc-professor {
    hardware ethernet 08:00:27:11:22:33;
    fixed-address 192.168.10.12;
    option host-name "pc-professor";
}
```

> **Com obtenir l'adreça MAC d'un client Linux:**
> ```bash
> ip link show eth0 | grep ether
> ```
> **En Windows:**
> ```cmd
> ipconfig /all
> ```

# 8. Activa i verifica el servei

## 8.1. Comprova la sintaxi del fitxer de configuració

Abans d'iniciar el servei, verifica que no hi ha errors de sintaxi:

```bash
sudo dhcpd -t -cf /etc/dhcp/dhcpd.conf
```

Si no hi ha errors, la sortida serà similar a:

```ini
Internet Systems Consortium DHCP Server 4.4.3-P1
Config file: /etc/dhcp/dhcpd.conf
Database file: /var/lib/dhcpd/dhcpd.leases
PID file: /var/run/dhcpd.pid
```

## 8.2. Habilita i inicia el servei

```bash
# Habilitar el servei perquè s'iniciï automàticament en arrencar
sudo systemctl enable isc-dhcp-server

# Iniciar el servei ara
sudo systemctl start isc-dhcp-server
```

## 8.3. Verifica l'estat del servei

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

La sortida ha de mostrar `active (running)`:

```ini
● isc-dhcp-server.service - ISC DHCP IPv4 server
     Loaded: loaded (/lib/systemd/system/isc-dhcp-server.service; enabled; preset: enabled)
     Active: active (running) since ...
```

## 8.4. Odres de gestió del servei

| Ordre | Acció |
|---------|-------|
| `sudo systemctl start isc-dhcp-server` | Iniciar el servei |
| `sudo systemctl stop isc-dhcp-server` | Aturar el servei |
| `sudo systemctl restart isc-dhcp-server` | Reiniciar el servei |
| `sudo systemctl reload isc-dhcp-server` | Recarregar la configuració sense aturar |
| `sudo systemctl status isc-dhcp-server` | Veure l'estat del servei |

# 9. Verifica les concessions DHCP

## 9.1. Consulta el fitxer de concessions

El servidor registra totes les IP assignades al fitxer `/var/lib/dhcpd/dhcpd.leases`:

```bash
cat /var/lib/dhcpd/dhcpd.leases
```

Exemple d'una concessió activa:

```ini
lease 192.168.10.100 {
  starts 2 2024/10/01 09:00:00;
  ends 3 2024/10/02 09:00:00;
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet 08:00:27:ab:cd:ef;
  client-hostname "client-ubuntu";
}
```

## 9.2. Consulta les concessions actives en temps real

```bash
sudo dhcp-lease-list
```

> [!NOTE]
> Si `dhcp-lease-list` no està disponible, instal·la el paquet `isc-dhcp-common` o utilitza directament `cat /var/lib/dhcpd/dhcpd.leases`.

## 9.3. Monitora els registres del servei

```bash
sudo journalctl -u isc-dhcp-server -f
```

Exemple de sortida quan un client rep una IP:

```ini
DHCPDISCOVER from 08:00:27:ab:cd:ef via enp0s8
DHCPOFFER on 192.168.10.100 to 08:00:27:ab:cd:ef via enp0s8
DHCPREQUEST for 192.168.10.100 from 08:00:27:ab:cd:ef via enp0s8
DHCPACK on 192.168.10.100 to 08:00:27:ab:cd:ef via enp0s8
```

# 10. Configura el tallafoc (UFW)

Si el tallafoc `ufw` està actiu, cal permetre el trànsit DHCP (port 67/UDP):

```bash
sudo ufw allow 67/udp
sudo ufw reload
sudo ufw status
```

# 11. Resol problemes habituals

## 11.1. El servei no s'inicia

**Símptoma:** `systemctl status` mostra `failed` o `error`.

**Diagnosi:**
```bash
sudo journalctl -u isc-dhcp-server --no-pager -n 50
```

**Causes habituals:**

- Error de sintaxi a `dhcpd.conf` → executa `sudo dhcpd -t -cf /etc/dhcp/dhcpd.conf`
- Interfície incorrecta a `/etc/default/isc-dhcp-server`
- La interfície especificada no té cap adreça IP configurada

## 11.2. Els clients no reben IP

**Causes habituals i solucions:**

| Causa | Solució |
|----------|---------|
| El rang d'adreces s'ha esgotat | Ampliar el rang o reduir el temps de concessió |
| La subxarxa del client no coincideix amb la configurada | Revisar la configuració de `subnet` a `dhcpd.conf` |
| El tallafoc bloqueja el port 67/UDP | `sudo ufw allow 67/udp` |
| El servei no escolta a la interfície correcta | Revisar `/etc/default/isc-dhcp-server` |

## 11.3. Odres de diagnosi útils

```bash
# Veure els ports en escolta
sudo ss -ulnp | grep dhcp

# Capturar trànsit DHCP en temps real (requereix tcpdump)
sudo tcpdump -i enp0s8 port 67 or port 68 -n

# Forçar un client Linux a renovar la seva IP
sudo dhclient -r enp0s3   # allibera la IP actual
sudo dhclient enp0s3      # sol·licita una nova IP
```

# 12. Fitxer de configuració complet

A continuació es mostra el fitxer `/etc/dhcp/dhcpd.conf` complet amb totes les opcions del document:

```nano
# ============================================================
# /etc/dhcp/dhcpd.conf
# Servidor DHCP - Ubuntu Server 24.04
# Xarxa: 192.168.10.0/24
# ============================================================

# Paràmetres globals
default-lease-time 86400;
max-lease-time 172800;
authoritative;

option domain-name "smx.local";
option domain-name-servers 8.8.8.8, 8.8.4.4;

# Subxarxa principal
subnet 192.168.10.0 netmask 255.255.255.0 {
    range 192.168.10.100 192.168.10.200;
    option routers 192.168.10.1;
    option subnet-mask 255.255.255.0;
    option broadcast-address 192.168.10.255;
}

# Reserves per adreça MAC
host impressora-classe {
    hardware ethernet 08:00:27:AA:BB:CC;
    fixed-address 192.168.10.11;
}

host pc-professor {
    hardware ethernet 08:00:27:11:22:33;
    fixed-address 192.168.10.12;
    option host-name "pc-professor";
}
```

# 13. Resum d'ordres

```bash
# Instal·lació
sudo apt update && sudo apt install isc-dhcp-server -y

# Fitxers de configuració
sudo nano /etc/default/isc-dhcp-server   # interfície d'escolta
sudo nano /etc/dhcp/dhcpd.conf           # configuració principal

# Verificació de sintaxi
sudo dhcpd -t -cf /etc/dhcp/dhcpd.conf

# Gestió del servei
sudo systemctl enable --now isc-dhcp-server
sudo systemctl status isc-dhcp-server
sudo systemctl restart isc-dhcp-server

# Monitoratge
cat /var/lib/dhcpd/dhcpd.leases
sudo journalctl -u isc-dhcp-server -f

# Tallafoc
sudo ufw allow 67/udp
```

# 14. Activitats proposades

1. Instal·la i configura un servidor DHCP per a la xarxa `10.0.1.0/24` amb el rang `10.0.1.50`–`10.0.1.150` i la porta d'enllaç `10.0.1.1`.
2. Afegeix una reserva d'IP per a una màquina virtual client (obté la seva MAC amb `ip link`).
3. Comprova, des del client, que rep correctament la IP, la màscara, la porta d'enllaç i els DNS (`ip addr`, `ip route`, `cat /etc/resolv.conf`).
4. Modifica el temps de concessió a 1 hora i verifica el canvi al fitxer de concessions.
5. Simula un esgotament del rang d'adreces reduint-lo a una sola IP i connecta dos clients. Observa els missatges d'error als registres del servidor.

# 15. Referències

**Documentació oficial**

- [Netplan a Ubuntu Server](https://ubuntu.com/server/docs/network-configuration)
- [Manual oficial de dhcpd](https://manpages.ubuntu.com/manpages/noble/man8/dhcpd.8.html)
- [Manual del fitxer de configuració](https://manpages.ubuntu.com/manpages/noble/man5/dhcpd.conf.5.html)
- [Pàgina oficial d'ISC DHCP](https://www.isc.org/dhcp/)

**Referència del protocol**

- [RFC 2131, l'estàndard DHCP original](https://datatracker.ietf.org/doc/html/rfc2131)

**Recursos didàctics complementaris**

- [Wiki de Debian](https://wiki.debian.org/DHCP_Server)
- [Community Help Wiki d'Ubuntu](https://help.ubuntu.com/community/isc-dhcp-server)

#### Versions d'aquest document

+ HTML - [dhcp.html](https://proferamon.com/tic/dhcp.html)
+ PDF - [dhcp.pdf](https://proferamon.com/tic/docs/dhcp.pdf)
+ ODT - [dhcp.odt](https://proferamon.com/tic/odt/dhcp.odt)
+ MD - [dhcp.md](https://proferamon.com/tic/md/dhcp.md)

[Domini Públic (CC0)](https://creativecommons.org/publicdomain/zero/1.0/deed.ca)
