Come aggiungere una nuova zona DNS in BIND

Questo articolo spiega, passo per passo, come aggiungere una nuova zona DNS in BIND 9, il server DNS più diffuso sui sistemi Unix/Linux. Vedremo come dichiarare la zona nei file di configurazione, come creare il file di zona e come verificare che tutto funzioni correttamente.

Scenario di esempio

Supponiamo di voler gestire il dominio example.com come zona master sul nostro server BIND. Il server ha indirizzo IP 192.168.1.10 sulla rete interna.

Prerequisiti

  • Un server Linux con BIND 9 già installato.
  • Accesso root o sudo.
  • Conoscenze di base di DNS (record A, AAAA, CNAME, MX, ecc.).

I percorsi dei file possono variare a seconda della distribuzione. Gli esempi seguenti usano i percorsi tipici di Debian/Ubuntu (/etc/bind) e Red Hat/CentOS/Rocky (/etc/named o /var/named).

1. Verificare l'installazione di BIND

Su Debian/Ubuntu:

sudo apt update
sudo apt install bind9 bind9utils

Su Red Hat / CentOS / Rocky / AlmaLinux:

sudo dnf install bind bind-utils

Verifica che il servizio sia attivo:

sudo systemctl status bind9      # Debian/Ubuntu
sudo systemctl status named      # RHEL-based

2. Scegliere dove dichiarare la zona

Di solito la dichiarazione delle zone si trova in uno di questi file:

  • /etc/bind/named.conf.local (Debian/Ubuntu)
  • /etc/named.conf o file inclusi (RHEL-based)

L'idea è aggiungere un blocco zone che dica a BIND come gestire la nuova zona (master, slave, file di zona, ecc.).

3. Dichiarare la nuova zona in BIND

3.1 Esempio per Debian/Ubuntu

Modifica il file /etc/bind/named.conf.local:

sudo nano /etc/bind/named.conf.local

Aggiungi questo blocco:

zone "example.com" {
    type master;
    file "/etc/bind/db.example.com";
    allow-transfer { none; };
};

Spiegazione rapida:

  • zone "example.com": nome della zona (il dominio).
  • type master: questo server è autoritativo e master per la zona.
  • file "/etc/bind/db.example.com": percorso del file di zona.
  • allow-transfer { none; };: disabilita i trasferimenti di zona, a meno che tu non abbia dei secondary.

3.2 Esempio per RHEL-based

Modifica il file /etc/named.conf (o un file incluso, come /etc/named/named.conf.local):

sudo nano /etc/named.conf

Aggiungi un blocco analogo, cambiando solo il percorso del file di zona:

zone "example.com" IN {
    type master;
    file "db.example.com";
    allow-transfer { none; };
};

Su molte distribuzioni RHEL-based, i file di zona stanno in /var/named, quindi la direttiva file usa un percorso relativo alla directory /var/named.

4. Creare il file di zona

4.1 File di zona per example.com (Debian/Ubuntu)

Crea il file di zona partendo da un modello o da zero:

sudo cp /etc/bind/db.local /etc/bind/db.example.com
sudo nano /etc/bind/db.example.com

Esempio di contenuto completo:

$TTL    3600
@       IN      SOA     ns1.example.com. hostmaster.example.com. (
                        2025112101  ; Serial
                        3600        ; Refresh
                        900         ; Retry
                        604800      ; Expire
                        86400 )     ; Minimum

        IN      NS      ns1.example.com.

ns1     IN      A       192.168.1.10

; Record per il sito web
@       IN      A       192.168.1.20
www     IN      CNAME   @

; Record mail
@       IN      MX 10   mail.example.com.
mail    IN      A       192.168.1.30

Dettagli importanti:

  • $TTL 3600: TTL predefinito (1 ora).
  • SOA: contiene l'authority per la zona:
    • ns1.example.com.: nameserver primario.
    • hostmaster.example.com.: email dell'amministratore (sostituisci la chiocciola con un punto).
    • 2025112101: seriale della zona, di solito in formato YYYYMMDDnn.
  • NS: definisce il nameserver autoritativo per la zona.
  • Record A e CNAME: puntano i nomi host agli indirizzi IP.
  • MX: definisce il mail exchanger per il dominio.

4.2 File di zona per example.com (RHEL-based)

Crea il file in /var/named:

sudo nano /var/named/db.example.com

Il contenuto può essere identico a quello visto sopra. Assicurati solo che proprietario e permessi siano corretti, ad esempio:

sudo chown root:named /var/named/db.example.com
sudo chmod 640 /var/named/db.example.com

5. Controllare la sintassi

Prima di ricaricare BIND, è fondamentale controllare la configurazione.

5.1 Controllo del file di configurazione

sudo named-checkconf

Se il comando non produce output, la configurazione di base non presenta errori sintattici.

5.2 Controllo della zona

sudo named-checkzone example.com /etc/bind/db.example.com   # Debian/Ubuntu
sudo named-checkzone example.com /var/named/db.example.com  # RHEL-based

Dovresti vedere un output che indica il loaded serial e una conferma del tipo OK.

6. Ricaricare il servizio BIND

Se tutto è andato bene, puoi ricaricare la configurazione.

Debian/Ubuntu:

sudo systemctl reload bind9

RHEL-based:

sudo systemctl reload named

In alternativa, se reload non è disponibile, puoi riavviare il servizio:

sudo systemctl restart bind9    # Debian/Ubuntu
sudo systemctl restart named    # RHEL-based

7. Testare la nuova zona

Usa dig per interrogare il nameserver e verificare che la zona risponda.

7.1 Verifica del record SOA

dig @192.168.1.10 example.com SOA

7.2 Verifica di un record A

dig @192.168.1.10 example.com A
dig @192.168.1.10 www.example.com A

7.3 Verifica del record MX

dig @192.168.1.10 example.com MX

Se le risposte coincidono con quanto definito nel file di zona, la configurazione della nuova zona DNS è completa.

8. Aggiungere anche la zona di reverse (opzionale ma consigliato)

Per una configurazione più completa, è buona pratica configurare anche la reverse zone, che consente di tradurre IP in nomi (record PTR).

Per la rete 192.168.1.0/24, la zona di reverse corrispondente è 1.168.192.in-addr.arpa.

8.1 Dichiarare la zona di reverse

zone "1.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/db.192.168.1";
};

8.2 Creare il file di zona di reverse

sudo cp /etc/bind/db.127 /etc/bind/db.192.168.1
sudo nano /etc/bind/db.192.168.1

Esempio di contenuto:

$TTL    3600
@       IN      SOA     ns1.example.com. hostmaster.example.com. (
                        2025112101  ; Serial
                        3600        ; Refresh
                        900         ; Retry
                        604800      ; Expire
                        86400 )     ; Minimum

        IN      NS      ns1.example.com.

10      IN      PTR     ns1.example.com.
20      IN      PTR     example.com.
30      IN      PTR     mail.example.com.

Anche qui, controlla la sintassi:

sudo named-checkzone 1.168.192.in-addr.arpa /etc/bind/db.192.168.1

E ricarica il servizio come visto in precedenza.

9. Buone pratiche nella gestione delle zone

  • Seriale della zona: aumenta sempre il valore seriale nel record SOA quando modifichi la zona, altrimenti i secondary DNS non sapranno che esiste una nuova versione.
  • TTL adeguati: in ambienti di test puoi usare TTL più bassi (ad esempio 300 secondi) per propagare più rapidamente le modifiche; in produzione usa valori più alti per ridurre il carico.
  • Backup dei file di zona: conserva copie regolari dei file di zona e dei file di configurazione.
  • Controlli periodici: usa named-checkzone dopo ogni modifica importante per evitare errori sintattici difficili da diagnosticare.
  • Permessi corretti: assicurati che BIND possa leggere i file di zona, ma che non siano scrivibili da utenti non autorizzati.

Conclusione

Aggiungere una nuova zona DNS in BIND richiede pochi passi chiari: dichiarare la zona nel file di configurazione, creare il file di zona con i record corretti, verificare la sintassi e ricaricare il servizio. Seguendo la procedura descritta in questo articolo e utilizzando gli strumenti di verifica come named-checkconf e named-checkzone, puoi ridurre al minimo gli errori e gestire in modo affidabile la tua infrastruttura DNS.

Torna su