DNS, DHCP e NAT: i servizi fondamentali di una rete
Quando iniziamo a studiare il networking, è facile concentrarsi sugli indirizzi IP, sulle subnet e sui gateway. Sono concetti fondamentali, ma da soli non spiegano completamente cosa succede quando colleghiamo un computer alla rete e iniziamo a navigare.
Il nostro PC, infatti, deve prima di tutto ottenere una configurazione di rete, poi deve poter tradurre i nomi dei siti in indirizzi IP e, quando comunica con Internet attraverso una rete privata, deve spesso passare attraverso un meccanismo di traduzione degli indirizzi.
Qui entrano in gioco tre servizi e meccanismi fondamentali:
DHCP, che ci aiuta a configurare automaticamente il dispositivo;
DNS, che traduce i nomi in indirizzi IP;
NAT, che permette a una rete privata di comunicare con reti esterne attraverso un indirizzo pubblico.
Capire come collaborano è un passo importante per iniziare a leggere una rete con gli occhi di chi deve amministrarla.
Prima di tutto: cosa deve sapere un computer per comunicare?
Immaginiamo di collegare un portatile alla nostra rete domestica.
Per comunicare correttamente non è sufficiente che la scheda di rete sia fisicamente collegata al router. Il sistema deve conoscere almeno alcune informazioni fondamentali:
- il proprio indirizzo IP;
- la subnet a cui appartiene;
- il gateway da utilizzare per raggiungere altre reti;
- uno o più server DNS.
Nelle configurazioni manuali possiamo inserire questi dati uno per uno. Nelle reti normali, però, sarebbe poco pratico configurare manualmente ogni computer, smartphone, stampante o server.
È proprio per questo che entra in gioco DHCP.
DHCP: il servizio che configura automaticamente i dispositivi
DHCP significa Dynamic Host Configuration Protocol.
Il suo compito principale è fornire automaticamente ai client i parametri necessari per utilizzare la rete. Tra questi troviamo normalmente l’indirizzo IP, la subnet mask, il gateway predefinito e gli indirizzi dei server DNS.
Possiamo immaginare il DHCP come una sorta di “ufficio informazioni” della nostra rete.
Quando un dispositivo si collega, chiede:
“Qual è la configurazione che devo utilizzare?”
Il server DHCP risponde fornendo i parametri necessari.
Uno degli aspetti interessanti è che l’indirizzo assegnato non deve necessariamente essere permanente. Il DHCP normalmente lavora con un lease, cioè un periodo durante il quale il client può utilizzare quell’indirizzo. Al termine del periodo, il client può rinnovarlo.
In questo modo possiamo avere, per esempio:
Router / DHCP
│
├── PC → 192.168.1.20
├── Laptop → 192.168.1.21
├── Server → 192.168.1.22
└── Tablet → 192.168.1.23
Non dobbiamo assegnare manualmente ogni indirizzo.
DHCP non significa soltanto “assegnare un IP”
Questo è un punto importante.
Dire che DHCP “assegna l’indirizzo IP” è corretto, ma riduttivo.
Il server può fornire anche informazioni come:
- gateway predefinito;
- server DNS;
- nome del dominio;
- hostname;
- altre opzioni di configurazione.
Questo spiega perché un computer può collegarsi alla rete e funzionare immediatamente senza che noi abbiamo inserito manualmente tutti questi parametri.
Su Ubuntu, per esempio, possiamo vedere una configurazione DHCP attraverso gli strumenti di rete del sistema. Ubuntu utilizza Netplan come livello di configurazione della rete e può configurare un’interfaccia per utilizzare DHCP.
Una configurazione molto semplice può assomigliare a questa:
network:
version: 2
ethernets: enp3s0:
dhcp4: true
Dopo aver applicato la configurazione, possiamo verificare l’indirizzo ricevuto con:
ip addr
e controllare il routing con:
ip route
Questi comandi sono già familiari se abbiamo seguito la nostra guida sul networking di base su Linux.
DNS: perché possiamo scrivere un nome invece di un indirizzo IP?
Supponiamo ora che il nostro computer sia correttamente configurato.
Vogliamo visitare un sito e scriviamo nel browser:
www.orvietolinux.itIl computer deve però comunicare attraverso la rete utilizzando indirizzi IP.
Come fa quindi a capire quale indirizzo IP corrisponde a quel nome?
La risposta è DNS, cioè Domain Name System.
Il DNS fornisce un sistema gerarchico e distribuito per associare nomi a informazioni relative alle risorse della rete, inclusi gli indirizzi degli host.
In termini molto semplici:
www.orvietolinux.it
│
▼
DNS
│
▼
indirizzo IPQuesto evita di dover ricordare gli indirizzi IP dei servizi che utilizziamo.
Il concetto diventa ancora più evidente con un esempio.
Un server potrebbe avere un indirizzo come:
203.0.113.25ma per noi è molto più semplice utilizzare:
www.example.itIl DNS si occupa di permettere questa associazione.
Cosa succede quando facciamo una richiesta DNS?
Quando un’applicazione deve risolvere un nome, normalmente non interroga direttamente tutto il DNS di Internet.
Il sistema utilizza un resolver, che si occupa di effettuare le richieste necessarie verso i server DNS.
Possiamo verificare quale configurazione DNS sta utilizzando un sistema Ubuntu moderno con:
resolvectl status
Ubuntu documenta systemd-resolved e resolvectl come parte della gestione della risoluzione dei nomi, mentre Netplan può fornire i server DNS da utilizzare attraverso la configurazione della rete.
Possiamo anche effettuare una verifica molto semplice:
resolvectl query www.orvietolinux.it
In questo modo possiamo osservare la risoluzione del nome senza coinvolgere direttamente il browser.
È un controllo molto utile quando qualcosa non funziona.
Se, per esempio, questo comando non riesce a risolvere un dominio ma:
ping -c 4 1.1.1.1
funziona, abbiamo un’indicazione interessante: la connettività IP potrebbe essere corretta, mentre il problema potrebbe riguardare il DNS.
È esattamente il tipo di distinzione che ci permette di fare troubleshooting in modo ordinato.
DHCP e DNS possono collaborare
A questo punto possiamo collegare i due concetti.
Il DHCP può fornire al client l’indirizzo del server DNS da utilizzare.
Quindi una situazione tipica può essere:
Router / DHCP
│
┌───────────┴───────────┐
│ │
indirizzo IP DNS server
192.168.1.20 192.168.1.1
│ │
└───────────┬───────────┘
│
PCIl PC riceve quindi la configurazione necessaria per sapere:
“Questo è il mio indirizzo, questo è il gateway e questo è il DNS che posso interrogare.”
È una piccola collaborazione tra servizi che, per l’utente finale, normalmente rimane completamente trasparente.
Arriviamo al NAT
Ora abbiamo il nostro dispositivo configurato e sappiamo anche come risolvere i nomi.
Rimane una domanda:
come fa un computer con un indirizzo privato come 192.168.1.20 a comunicare con Internet?
Qui entra in gioco il NAT, Network Address Translation.
Il NAT permette di tradurre gli indirizzi IP tra una rete e un’altra. Una delle configurazioni più comuni consente a molti dispositivi con indirizzi privati di accedere a una rete esterna attraverso un unico indirizzo pubblico.
Possiamo immaginare la nostra rete così:
PC 192.168.1.20 ─┐
Laptop 192.168.1.21 ─┼── Router/NAT ── Internet
Smartphone 192.168.1.22 ─┘
│
IP pubblicoAll’interno della rete utilizziamo indirizzi privati.
Verso Internet il router utilizza invece un indirizzo pubblico.
Il NAT mantiene le informazioni necessarie per permettere alle risposte di tornare al dispositivo corretto.
NAT e porte: perché un solo IP pubblico può bastare?
Nelle reti domestiche il meccanismo utilizzato è spesso NAPT, cioè Network Address and Port Translation.
In questo caso non viene tradotto soltanto l’indirizzo IP, ma anche l’informazione relativa alla porta TCP o UDP. Questo permette a molti dispositivi interni di condividere lo stesso indirizzo pubblico.
Immaginiamo tre computer:
192.168.1.20:51000
192.168.1.21:51001
192.168.1.22:51002Il router può tradurre queste connessioni utilizzando il proprio indirizzo pubblico e porte differenti.
In forma semplificata:
Rete privata Internet
192.168.1.20:51000 ─┐
│
192.168.1.21:51001 ──┼─ NAT ── 203.0.113.10:xxxxx
│
192.168.1.22:51002 ─┘Il dettaglio della traduzione è più complesso di questo schema, ma il concetto fondamentale è proprio questo: il router mantiene una relazione tra le connessioni interne e quelle esterne.
È anche per questo che, quando parleremo di porte TCP e UDP, capire il NAT ci sarà molto utile.
NAT non è un firewall
Qui dobbiamo fare attenzione a un equivoco molto comune.
Il NAT non è un firewall.
In molte reti domestiche il router svolge contemporaneamente più funzioni: routing, NAT, DHCP, DNS forwarding e filtraggio del traffico. Questo può far sembrare che siano tutti la stessa cosa.
Non lo sono.
Il NAT si occupa della traduzione degli indirizzi e, nel caso del NAPT, delle porte. Un firewall invece applica regole per decidere quale traffico permettere o bloccare.
Il fatto che una rete utilizzi NAT può avere effetti sul traffico in ingresso, ma non dobbiamo trasformare questa caratteristica in una definizione di sicurezza.
Questa distinzione diventerà particolarmente importante quando parleremo di firewall e Linux nella nostra serie dedicata alla sicurezza.
Mettiamo insieme tutto
A questo punto possiamo ricostruire quello che succede quando colleghiamo un computer alla rete e apriamo un sito.
Immaginiamo di avere un PC appena collegato al router.
Primo passaggio: DHCP.
Il PC riceve una configurazione di rete, per esempio:
IP: 192.168.1.20
Subnet: 255.255.255.0
Gateway: 192.168.1.1
DNS: 192.168.1.1Secondo passaggio: DNS.
Digitiamo:
www.orvietolinux.itIl sistema deve ottenere l’indirizzo IP associato al nome.
Terzo passaggio: routing.
Il computer deve capire dove inviare il traffico. Se la destinazione non appartiene alla rete locale, utilizza il gateway predefinito.
Quarto passaggio: NAT.
Il router può tradurre l’indirizzo privato del nostro PC nell’indirizzo pubblico utilizzato per la comunicazione verso Internet.
Possiamo rappresentare tutto il percorso così:
RETE LOCALE
┌─────────────────────────┐
│ PC │
│ 192.168.1.20 │
└────────────┬────────────┘
│
DHCP
│
▼
┌───────────────┐
│ Router │
│ Gateway │
│ DNS │
│ NAT │
└───────┬───────┘
│
IP pubblico
│
▼
INTERNETIl bello è che tutto questo può avvenire in pochi istanti e senza che l’utente debba conoscere i singoli passaggi.
Come usare questi concetti per fare troubleshooting
Conoscere DNS, DHCP e NAT diventa particolarmente utile quando qualcosa smette di funzionare.
Se il computer non riceve un indirizzo IP, possiamo sospettare DHCP o un problema precedente nella connessione.
Se il computer ha un indirizzo IP ma non raggiunge altre reti, dobbiamo controllare il gateway e il routing.
Se riesce a raggiungere un indirizzo IP ma non riesce a risolvere i nomi, il DNS diventa uno dei primi elementi da verificare.
Se i dispositivi della rete navigano normalmente ma un servizio interno non è raggiungibile dall’esterno, possiamo invece iniziare a ragionare su NAT, port forwarding e firewall.
Su Linux possiamo partire da pochi strumenti:
ip addr
ip route
resolvectl status
resolvectl query dominio.tld
Sono controlli semplici, ma ci permettono già di capire in quale punto della catena si trova il problema.
Tre servizi, tre domande diverse
Possiamo quindi ricordare DNS, DHCP e NAT attraverso tre domande molto semplici.
DHCP:
“Come configuro automaticamente questo dispositivo?”
DNS:
“Quale indirizzo IP corrisponde a questo nome?”
NAT:
“Come permetto a una rete privata di comunicare con una rete esterna utilizzando la traduzione degli indirizzi?”
Sono problemi diversi, affrontati da meccanismi diversi, eppure, nelle reti domestiche e in molte infrastrutture reali, li troviamo spesso tutti sullo stesso dispositivo: il router.
Capire questa collaborazione ci permette di fare un passo avanti rispetto alla semplice configurazione di un indirizzo IP.
Da questo momento, quando una connessione non funziona, possiamo iniziare a scomporre il problema: indirizzo, routing, DNS, traduzione e infine porte e servizi.
Ed è proprio dalle porte che partiremo per approfondire il funzionamento di TCP e UDP.
LICENZA E CONDIZIONI D’USO
Questo How-to è rilasciato sotto licenza Creative Commons Attribution-NonCommercial 3.0 Italy.
CONTATTI DELL’AUTORE
Marco Ciammella marco@orvietolinux.it
Orvieto Linux User Group info@orvietolinux.it