DNS & DHCP – DHCP

Published by Lello on

Installeremo ora i servizi DHCP sui nostri server; il servizio DHCP fornirà tramite protocollo DHCP a quegli apparati che ne fanno richiesta, un indirizzo IP facente parte del nostro network.

Il DHCP non fornisce solo l’indirizzo IP, ma anche altri parametri, quali:

  • la netmask (altrimenti non potrei identificare la rete e l’host);
  • il gateway
  • i DNS server
  • l’NTP server
  • … altro

Vediamo  brevemente cosa succede quando un PC senza indirizzo IP preassegnato vuole un indirizzo IP:

dhcp

  1. Il client effettua una richiesta in broadcast (con indirizzo sorgente 0.0.0.0 e indirizzo di destinazione 255.255.255.255)  per cercare un servizio DHCP che possa offrirgli un indirizzo IP; tale fase è chiamata DHCPDISCOVER;
  2. la richiesta effettuata dal client viene ricevuta da tutti i DHCP presenti nella rete il server DHCP, i quali rispondono alla richiesta del client comunicandogli i propri indirizzi IP. Tale fase è chiamata DHCPOFFER;
  3. il computer invia una richiesta di assegnazione di indirizzo IP al server che per prima gli ha comunicato il proprio indirizzo IP; non esiste una priorità di DHCP, per cui solo il primo DHCP server che risponde avrà la priorità di richiesta del client. La richiesta è in ogni caso inviata a tutti i DHCP server presenti nella rete; in tale richiesta il campo “server identifier” conterrà l’indirizzo del server prescelto dal client. Tale fase viene chiamata DHCPREQUEST;
  4. Il DHCP server invia in dati contenenti anche l’indirizzo IP al client che ne ha fatto richiesta. Tale fase, denominata DHCPACK chiude la sessione.

Installiamo i package relativi al nostro dhcp client ed abilitiamo il servizio:

# yum -y install dhcp
# systemctl enable dhcpd

Gli obiettivi che vogliamo raggiungere con il nostro servizio DHCP sono i seguenti:

  • deve essere autoritativo per il network della mia rete;
  • fornire ai client l’indirizzamento IP (IP address, netmask, DNS server);
  • fornire ai client in maniera automatica le regole di proxy da utilizzare;
  • il servizio deve essere in failover con quello installato su server02;
  • permettere l’aggiornamento dinamico del DNS server in base all’indirizzo IP assegnato;

Modifichiamo il file /etc/dhcp/dhcpd.conf, che è il file relativo alla configurazione del servizio, in questo modo:

# Definisco il mio server come autoritativo per le informazioni pubblicate sul network
authoritative;
ping-check true;
one-lease-per-client on;
default-lease-time 600;
max-lease-time 7200;
# Permetto aggiornamenti dinamici del DNS-Server tramite il DHCP
ddns-update-style interim;
# Se il mio dominio ha un proxy server, indico al client dove scaricare il wpad.dat
# Commentare le 2 righe seguenti se non esiste un proxy server
option wpad code 252 = text;
option wpad "http://server01.anthesia.lan/wpad/wpad.dat";

# Definiamo le chiavi per gli aggiornamenti della zona del DNS server:
# La stessa chiave dovremo inserirla nella zona del nostro DNS server.
key server01-server02 {
        algorithm hmac-md5;
        secret "vMRWHTEuqhlhd7KOfgnu8iVN9xX7Dqfh/83HeDh4o620kzrqhe6OyEkHL/3F++jMDByKpWjVGzPG5a5o9K62Ng==";
};

zone anthesia.lan {
        primary 172.28.0.200;
        key server01-server02;
}

# Costruiamo il servizio di failover tra server01 e server02:
failover peer "anthesia-failover" {
        primary;
        address 172.28.0.200;
        port 519;
        peer address 172.28.0.201;
        peer port 520;
        max-response-delay 30;
        max-unacked-updates 10;
        load balance max seconds 3;
        mclt 1800;
        split 128;
}

# Definiamo la rete nella quale risiede il nostro DHCP server:
subnet 172.28.0.0 netmask 255.255.252.0 {
    default-lease-time 86400;
    max-lease-time 86400;
       #Definiamo gli indirizzi IP che devono essere assegnati all'interno della subnet:
    option subnet-mask              255.255.252.0;
    option broadcast-address        172.28.3.255;
    option routers                  172.28.0.0;
    option domain-name              "anthesia.lan";
    option domain-name-servers      172.28.0.200, 172.28.0.201;
    option ntp-servers              172.28.0.200, 172.28.0.201;
    option netbios-name-servers     172.28.0.200, 172.28.0.201;
    option netbios-node-type        8;
    # Definiamo il range degli IP che possono essere assegnati e mettiamoli nel failover    
    pool {
        deny dynamic bootp clients;
        failover peer "anthesia-failover";
        range 172.28.2.0 172.28.3.254;
        allow unknown-clients;
    }
}

Vediamo cosa accade nel file di log quando attivo il servizio; chiaramente, non essendo ancora attivo il DHCP secondario, avrò un errore ed il servizio apparirà in errore:

# systemctl start dhcpd
Aug  7 14:26:49 localhost systemd: Started DHCPv4 Server Daemon.
 Aug  7 14:26:49 localhost dhcpd: Internet Systems Consortium DHCP Server 4.2.5
 Aug  7 14:26:49 localhost dhcpd: Copyright 2004-2013 Internet Systems Consortium.
 Aug  7 14:26:49 localhost dhcpd: All rights reserved.
 Aug  7 14:26:49 localhost dhcpd: For info, please visit https://www.isc.org/software/dhcp/
 Aug  7 14:26:49 localhost dhcpd: Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not specified in the config file
 Aug  7 14:26:49 localhost dhcpd: Wrote 0 leases to leases file.
 Aug  7 14:26:49 localhost dhcpd: Listening on LPF/eno33584934/07:4c:29:3f:33:7b/172.28.0.0/22
 Aug  7 14:26:49 localhost dhcpd: Sending on   LPF/eno33584934/07:4c:29:3f:33:7b/172.28.0.0/22
 Aug  7 14:26:49 localhost dhcpd:
 Aug  7 14:26:49 localhost dhcpd: Sending on   Socket/fallback/fallback-net
 Aug  7 14:26:49 localhost dhcpd: failover peer anthesia-failover: I move from recover to startup
 Aug  7 14:27:04 localhost dhcpd: failover peer anthesia-failover: I move from startup to recover
 Aug  7 14:28:19 localhost dhcpd: failover peer anthesia-failover: unexpected error

Installiamo in maniera analoga il servizio DHCP su server02; modifichiamo solo la sezione relativa al failover (tutto il resto rimane uguale):

# Costruiamo il servizio di failover tra server02 e server01:
failover peer "anthesia-failover" {
        secondary;
        address 172.28.0.201;
        port 520;
        peer address 172.28.0.200;
        peer port 519;
        max-response-delay 30;
        max-unacked-updates 10;
        load balance max seconds 3;
}

Abbiamo specificato che questo è il DHCP secondario, abbiamo invertito le porte di ascolto (519 e 520) ed abbiamo specificato che il peer è in questo caso il primario. Avviando il servizio sul secondario e controllando i file di log di entrambi i server vediamo che:

Aug  7 15:06:16 localhost dhcpd: failover peer anthesia-failover: peer moves from unknown-state to recover
Aug  7 15:06:16 localhost dhcpd: failover peer anthesia-failover: requesting full update from peer
Aug  7 15:06:16 localhost dhcpd: Sent update request all message to anthesia-failover
Aug  7 15:06:16 localhost dhcpd: Update request all from anthesia-failover: sending update
Aug  7 15:06:17 localhost dhcpd: failover peer anthesia-failover: peer update completed.
Aug  7 15:06:17 localhost dhcpd: failover peer anthesia-failover: I move from recover to recover-done
Aug  7 15:06:17 localhost dhcpd: Sent update done message to anthesia-failover
Aug  7 15:06:17 localhost dhcpd: failover peer anthesia-failover: peer moves from recover to recover-done
Aug  7 15:06:17 localhost dhcpd: Both servers have entered recover-done!
Aug  7 15:06:17 localhost dhcpd: failover peer anthesia-failover: I move from recover-done to normal
Aug  7 15:06:17 localhost dhcpd: balancing pool 7fa1919a8690 172.28.0.0/22  total 511  free 511  backup 0  lts 255  max-own (+/-)51
Aug  7 15:06:17 localhost dhcpd: balanced pool 7fa1919a8690 172.28.0.0/22  total 511  free 256  backup 255  lts 0  max-misbal 77
Aug  7 15:06:17 localhost dhcpd: Sending updates to anthesia-failover.
Aug  7 15:06:17 localhost dhcpd: failover peer anthesia-failover: peer moves from recover-done to normal
Aug  7 15:06:23 localhost dhcpd: peer anthesia-failover: disconnected
Aug  7 15:06:23 localhost dhcpd: failover peer anthesia-failover: I move from normal to communications-interrupted
Aug  7 15:06:28 localhost dhcpd: failover peer anthesia-failover: peer moves from normal to normal
Aug  7 15:06:28 localhost dhcpd: failover peer anthesia-failover: I move from communications-interrupted to normal
Aug  7 15:06:28 localhost dhcpd: balancing pool 7fa1919a8690 172.28.0.0/22  total 511  free 256  backup 255  lts 0  max-own (+/-)51
Aug  7 15:06:28 localhost dhcpd: balanced pool 7fa1919a8690 172.28.0.0/22  total 511  free 256  backup 255  lts 0  max-misbal 77

I due server si sono sincronizzati, hanno visto che possono rilasciare 511 IP e si sono divisi 256 ip sul primario e 255 sul secondario.

Quindi il mio servizio è pronto a rilasciare indirizzi IP all’interno del suo network; vediamo cosa accade quando un client effettua una richiesta dhcpd al mio server:

Aug  7 15:25:26 localhost dhcpd: DHCPDISCOVER from 00:0c:29:3a:5c:7a via eno33554984
Aug  7 15:25:27 localhost dhcpd: DHCPOFFER on 172.28.2.255 to 00:0c:29:3a:5c:7a (mioclient) via eno33554984
Aug  7 15:25:27 localhost dhcpd: DHCPREQUEST for 172.28.2.255 (172.28.0.200) from 00:0c:29:3a:5c:7a (mioclient) via eno33554984
Aug  7 15:25:46 localhost dhcpd: DHCPINFORM from 172.28.2.255 via eno33554984
Aug  7 15:25:46 localhost dhcpd: DHCPACK to 172.28.2.255 (00:0c:29:3a:5c:7a) via eno33554984

Il mio DHCP server ha passato tutti i dati in suo possesso al client, per cui questo è pronto ad utilizzare il network.

 

← DNS & DHCP – DNS