# Domain Name System (DNS)

Il Domain Name System o `DNS` è un protocollo del livello applicativo (layer 7) nel modello ISO/OSI (layer 5 nel modello TCP/IP). Utilizza il protocollo UDP a livello di trasporto ed è associato alla *well-know port 53*.

La funzione principale del DNS è quella di tradurre i nomi di dominio in indirizzi IP, facilitando così la navigazione degli utenti. Oltre a questa funzione principale, il DNS offre anche altre due importanti caratteristiche:

- **Aliasing**: consente di creare alias per un dominio principale (ad esempio, per il dominio *miosito.com*, è possibile avere alias come *blog.miosito.com*)
- **Load Balancing**: il DNS può anche fungere da bilanciatore di carico. Quando un client richiede l'indirizzo IP di un web server, il DNS può inviare la richiesta a un server specifico in base al carico di lavoro attuale, smistando così le richieste tra più indirizzi IP associati allo stesso dominio

## Gerarchia DNS

Quando il processo di risoluzione DNS viene avviato, si seguono diversi passaggi per ottenere l'indirizzo IP associato a un nome di dominio.

Il primo passo consiste nell'interrogare la **memoria locale del dispositivo**, la quale può contenere sia entry manuali inserite dall'utente sia informazioni precedentemente risolte e memorizzate nella cache.

### DNS Resolver locale

Se l'informazione non è presente nella memoria locale, il sistema si rivolge al *DNS resolver locale*, che può essere:

- un server DNS configurato localmente sulla macchina o sul proprio router
- un server DNS locale nella LAN
- un server DNS fornito dal proprio Internet Service Provider (`ISP`)

### Server DNS root

Se il resolver locale non riesce a fornire la risposta, la richiesta viene inoltrata ai `server DNS root`, che rappresentano *il primo livello della gerarchia DNS*. Non contengono informazioni specifiche sui nomi di dominio, ma il loro compito principale è quello di indirizzare la risoluzione verso i server dei **Top Level Domain** (`TLD`), che si trovano al *secondo livello della gerarchia*. Questi server gestiscono i domini di primo livello, come ad esempio `.com`, `.org`, ecc.

### Server TLD

I `server TLD` ricevono la richiesta e, a loro volta, indirizzano il resolver verso i server DNS autoritativi per il dominio specifico richiesto.

### Server DNS Autoritativi

Infine, al terzo livello della gerarchia, ci sono i `server DNS autoritativi`. Questi server contengono le informazioni definitive riguardanti il dominio richiesto e sono gestiti dal proprietario del dominio o da un ente di fiducia a cui il proprietario si affida. Solo questi server possono fornire la risposta finale, ovvero l'indirizzo IP associato al nome di dominio.

![dns-hierarchy](asset/img/dns-hierarchy.png)

## Risoluzione DNS

La risoluzione DNS può avvenire attraverso due modalità principali:

- `Interattiva`: nella modalità interattiva, il DNS resolver locale richiede direttamente l'informazione a ciascun livello della gerarchia DNS, partendo dal server DNS root fino ai server autoritativi. Questo approccio presenta diversi vantaggi in termini di sicurezza. Il resolver locale quindi:
  - invia richieste ai server DNS root per ottenere indicazioni sui server TLD appropriati
  - prosegue a interrogare i server TLD per ottenere informazioni sui server autoritativi specifici del dominio richiesto
  - contatta i server autoritativi per ottenere l'indirizzo IP associato al nome di dominio
- `Ricorsiva`: nella modalità ricorsiva, il resolver locale delega la responsabilità di trovare l'informazione a altri server DNS, partendo dal server DNS root di primo livello. Questo processo continua in modo ricorsivo, con ogni server che fornisce indicazioni al successivo, fino a quando il resolver non ottiene la risposta finale

## Zona DNS

Una zona DNS è una sottosezione della gerarchia DNS che comprende un insieme di server DNS responsabili di un determinato dominio e dei suoi sottodomini. Questa zona contiene tutte le informazioni relative ai nomi di dominio e ai relativi `Resource Records` (RR).

Il `namespace` di una zona DNS è l'insieme completo di tutte le informazioni contenute in quella zona. Ogni zona DNS ha un server DNS autoritativo, che è responsabile di fornire informazioni accurate e aggiornate sulla zona stessa.

## Records DNS

I `Resource Records` (RR) o records DNS sono informazioni strutturate in quattro macro campi: (`nome, tipo, valore, TTL`). Esistono diversi tipi di record DNS, ognuno con uno scopo specifico:

- `Tipo A` (Address Record): associa un nome di dominio a un indirizzo IPv4, un processo noto come `DNS lookup`. Ad esempio, `(www.sito.com,A,X.X.X.X,100)`
- `Tipo AAAA` (Address Record): simile al tipo A, ma associa un nome di dominio a un indirizzo IPv6
- `Tipo MX` (Mail Exchange Record): indica il server di posta autorizzato a ricevere email per un dominio `(www.gmail.com,MX,smtp.gmail.com,100)`
- `Tipo CNAME` (Canonical Name Record): associa un nome di dominio canonico a un alias `(www.sito.com,CNAME,blog.sito.com,100)`
- `Tipo NS` (Name Server Record): identifica i server responsabili per una zona di dominio (detti `name server`), mappando il dominio al nome di un ns `(www.sito.com,NS,ns1.dnsprovider.com,100)`
- `Tipo PTR` (Pointer Record): utilizzato per la `reverse DNS lookup`, associa un indirizzo IP a un nome di dominio `(152.152.142.12.in-addr.arpa,PTR,www.sito.com,100)`
- `Tipo SOA` (Start of Authority): fornisce informazioni amministrative sulla zona DNS, inclusi i server autoritativi. Un esempio di record SOA:

  ```txt
  @ IN SOA ns.example.com. admins.siteground.com. (
  2022010101 ; Serial
  86400 ; Refresh
  7200 ; Retry
  3600000 ; Expire
  86400 ; Minimum TTL
  )
  ```

- `Tipo TXT`: Associa una stringa di testo a un dominio. I record TXT sono spesso utilizzati per configurazioni relative alla posta elettronica, come SPF, DKIM e DMARC, per migliorare la sicurezza e l'autenticità delle comunicazioni email

## Pacchetto DNS

Il pacchetto DNS è costituito da diverse componenti, alcune delle quali vengono utilizzate se il pacchetto è una richiesta DNS (DNS request) e altre nella risposta (DNS response). La struttura principale del pacchetto include:

### Intestazione (Header)

L'intestazione, lunga 12 byte, contiene vari campi:

- `Transaction ID`: un identificatore univoco della richiesta, che consente di associare una specifica query alla sua risposta
- `Flags`: un insieme di valori rappresentati da singoli bit, ciascuno dei quali può essere acceso (1) o spento (0):
  - `QR`: indica se il pacchetto è una query (0) o una risposta (1)
  - `AA` (Authoritative Answer): indica se la risposta è autoritativa (1) o meno (0)
- `RCODE` (Response Code): un campo di 4 bit che riporta codici di risposta per eventuali errori
- `QDCount`: il numero di richieste presenti nella sezione *Question*, che indica quante domande sono state formulate
- `ANCount`: il numero di record di risposta presenti nella sezione *Answer*
- `NSCount`: il numero di RR presenti nella sezione *Authority*, che indica quanti record provengono da un server autoritativo
- `ARCount`: il numero di record presenti nella sezione *Additional*, che fornisce informazioni supplementari utili per la risoluzione della richiesta

### Sezione Questions

La sezione Questions contiene la/e richiesta/e DNS e include i seguenti campi:

- `QNAME`: il nome di dominio per il quale si sta effettuando la richiesta
- `QTYPE`: indica il tipo di record richiesto, rappresentato da un codice associato al tipo di RR specificato in QNAME.
  - A (1)
  - AAAA (28)
  - MX (15)
  - CNAME (5)
- `QCLASS`: indica la classe della query, specificando il contesto/luogo in cui si sta cercando l'informazione per il nome di dominio. Per un contesto ampio, come Internet, si utilizza la QCLASS IN (Internet).

Questi campi forniscono le informazioni necessarie per elaborare la richiesta e ottenere la risposta desiderata.

### Sezione Answers (Risposte)

La sezione Answers fornisce le risposte alla/e richiesta/e DNS e include i seguenti campi:

- `Name`: rappresenta il dominio per il quale è stata effettuata la richiesta
- `Type`: indica il tipo di record restituito, come A, AAAA, MX, CNAME, ecc.
- `CLASS`: rappresenta la classe di risposta, che è quasi sempre IN (Internet).
- `TTL` (Time to Live): indica il tempo di vita della risposta. Una volta scaduto, l'informazione viene considerata obsoleta e viene eliminata
- `RD Length`: indica la lunghezza dei dati di risposta, specificando quanti byte occupa l'informazione restituita
- `RDATA`: contiene i dati effettivi della risposta, che variano a seconda del tipo di record richiesto

### Sezione Authority

La sezione Authority indica le risposte provenienti da server DNS autoritativi.

### Sezione Additional

La sezione Additional può contenere informazioni extra che non rientrano nelle altre sezioni.

![dns-response](asset/img/dns-response-example.png)
