Indirizzi IP e DNS

Una risoluzione DNS
Una risoluzione DNS: il resolver ricorsivo interroga a turno la radice, il dominio di primo livello e il server autorevole, poi tiene la risposta in cache.

Indirizzo IPNumero che identifica un’interfaccia di rete e permette di instradarle i pacchetti
IPv432 bit, scritti come quattro numeri decimali: 172.67.204.67
IPv6128 bit, scritti come otto gruppi esadecimali: 2606:4700:3031::ac43:cc43
DNSDatabase distribuito che traduce i nomi in indirizzi e altri dati
DNS definito inRFC 1034 e RFC 1035 (1987)
Trasporto del DNSUDP e TCP porta 53; DoT (853), DoH (443)
Record più comuniA, AAAA, CNAME, MX, TXT, NS, SOA, HTTPS
Estensione di sicurezzaDNSSEC (DNSKEY, RRSIG, DS)
Strumenti tipicidig, getent, resolvectl, curl -4 / curl -6

Un indirizzo IP è il numero che identifica l’interfaccia di rete di un dispositivo su Internet e permette ai pacchetti di dati di raggiungerlo. Il Domain Name System (DNS) è il database distribuito che traduce i nomi facili da ricordare, come wiki.daniellomario.com, in indirizzi IP, e che conserva anche altre informazioni su un dominio, per esempio quali server ricevono la sua posta.

I due sono complementari: gli indirizzi IP sono ciò che la rete usa davvero, e il DNS è lo strato che permette a persone e programmi di ignorarli. Quando qualcosa “non si carica”, la causa è molto spesso in uno dei due: un nome che risolve all’indirizzo sbagliato, un indirizzo che non risponde più, oppure una rete che supporta solo una delle due versioni di IP. Questa voce spiega come funzionano entrambi, usando come esempio la configurazione reale del dominio di questa wiki.

Indirizzi IP

L’Internet Protocol (IP) trasporta i dati in unità indipendenti chiamate pacchetti. Ogni pacchetto porta un indirizzo di origine e uno di destinazione, e ogni router lungo il percorso guarda solo la destinazione per decidere dove inoltrarlo. Un indirizzo IP ha quindi lo stesso ruolo di un indirizzo postale: dice dove qualcosa deve arrivare, non che cosa contiene.

Un indirizzo identifica un’interfaccia di rete, non un computer: un portatile con Wi-Fi e VPN ha un indirizzo diverso su ciascuna interfaccia. Identifica anche una posizione nella rete, ed è per questo che cambia quando lo stesso dispositivo passa dal Wi-Fi di casa ai dati mobili.

Oggi si usano fianco a fianco due versioni: IPv4, del 1981,1 e IPv6, progettata negli anni Novanta per risolvere la scarsità di indirizzi IPv4.

IPv4

Un indirizzo IPv4 è un numero di 32 bit. Per renderlo leggibile lo si divide in quattro gruppi da 8 bit, chiamati ottetti, e ogni ottetto si scrive come numero decimale da 0 a 255, separando i gruppi con un punto (notazione decimale puntata):

172.67.204.67  =  10101100 . 01000011 . 11001100 . 01000011

Con 32 bit ci sono

indirizzi possibili, circa 4,3 miliardi: meno delle persone sulla Terra, e molti meno dei dispositivi connessi. Il registro centrale, IANA, ha assegnato gli ultimi blocchi liberi il 3 febbraio 2011,2 e i registri regionali li hanno esauriti negli anni successivi (quello europeo, RIPE NCC, il 25 novembre 2019).3 Da allora gli indirizzi IPv4 si riusano, si condividono con il NAT e si comprano e vendono.

Classi di indirizzi

Nel progetto originale un indirizzo era diviso in una parte di rete, che identifica la rete, e una parte host, che identifica l’interfaccia dentro quella rete. Il punto di separazione era codificato nei primi bit dell’indirizzo, che ne definivano la classe:1

Anatomia di un indirizzo di classe B
Figura 1. L’indirizzo 172.67.204.67 in decimale e in binario. I suoi primi due bit sono 10, quindi nel sistema delle classi è un indirizzo di classe B: 16 bit di rete e 16 bit di host. Sotto, le classi come intervalli del primo ottetto.

ClassePrimi bitPrimo ottettoBit di rete / hostRetiIndirizzi per rete
A00–1278 / 2412816 777 216
B10128–19116 / 1616 38465 536
C110192–22324 / 82 097 152256
D1110224–239——multicast
E1111240–255——riservati

Un indirizzo di classe B ha i primi due bit fissati a 10. Restano 14 bit per numerare le reti ( reti) e 16 bit per gli host ( indirizzi, di cui 65 534 utilizzabili, perché i valori di host tutti zero e tutti uno sono riservati alla rete stessa e al broadcast). Per riconoscere la classe dalla forma decimale basta il primo ottetto: se è tra 128 e 191, l’indirizzo è di classe B. L’indirizzo 172.67.204.67, uno di quelli di questa wiki, è quindi di classe B: inizia con 10. L’altro indirizzo dello stesso sito, 104.21.74.163, è di classe A, perché inizia con 0.

Il sistema delle classi sprecava spazio: un’organizzazione che aveva bisogno di 300 indirizzi era troppo grande per una classe C (256) e riceveva una classe B (65 536), lasciandone inutilizzata quasi tutta. Per questo nel 1993 le classi sono state abolite e sostituite dal CIDR.4 I nomi sono rimasti nel linguaggio comune, in particolare “rete privata di classe A, B o C” per gli intervalli privati (vedi sotto), ma oggi la classe di un indirizzo non ha alcun significato tecnico: i due indirizzi qui sopra, uno “di classe A” e uno “di classe B”, appartengono alla stessa azienda e si usano esattamente allo stesso modo.

CIDR e maschere di sottorete

Con il CIDR (Classless Inter-Domain Routing)5 il confine tra rete e host può cadere dopo un bit qualsiasi, e lo si scrive esplicitamente dopo una barra: la lunghezza del prefisso. Un blocco con prefisso contiene

indirizzi. La stessa informazione si può scrivere come maschera di sottorete, un numero di 32 bit con uni seguiti da zeri: /24 corrisponde a 255.255.255.0.

BloccoPrefissoMascheraIndirizziEsempio
172.64.0.0/1313255.248.0.0524 288un blocco annunciato da Cloudflare, che contiene 172.67.204.67
172.67.0.0/1616255.255.0.065 536quella che sarebbe stata la vecchia rete di classe B
192.168.1.0/2424255.255.255.0256una tipica rete di casa
104.21.74.163/3232255.255.255.2551un singolo indirizzo

Il blocco /13 della prima riga è più grande di una classe B e non inizia al confine di una classe: è proprio ciò che le classi non potevano esprimere.

I blocchi di indirizzi sono assegnati alle organizzazioni che gestiscono una propria rete, chiamate sistemi autonomi e identificate da un numero (ASN). Cloudflare, per esempio, è l’AS13335 e l’Internet Archive l’AS7941. I sistemi autonomi si comunicano a vicenda quali blocchi sanno raggiungere con il protocollo BGP, ed è così che un router in Italia sa dove mandare un pacchetto diretto a 104.21.74.163. Siccome l’ASN dice chi gestisce un indirizzo, una regola di firewall può bloccare un’intera organizzazione con il suo numero AS invece che con un elenco di indirizzi.

Intervalli speciali

Alcuni blocchi sono riservati e non compaiono mai come destinazione sull’Internet pubblica:

BloccoUsoDove si incontra
10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16indirizzi privati6reti di casa e aziendali; spesso chiamate reti private “di classe A, B e C”
100.64.0.0/10spazio condiviso per il NAT degli operatori7reti interne degli operatori; lo usa anche Tailscale (per esempio 100.100.100.100, il suo resolver DNS)
127.0.0.0/8loopback127.0.0.1 è la macchina stessa
169.254.0.0/16link-local8indirizzi automatici in assenza di DHCP; 169.254.169.254 è il servizio di metadati e DNS di molti provider cloud
192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24documentazione9esempi in libri e manuali, come quelli di questa voce

L’intervallo privato 172.16.0.0/12 copre esattamente 16 vecchie reti di classe B, da 172.16.x.x a 172.31.x.x. L’indirizzo 172.67.204.67 ne è fuori, e infatti è pubblico.

Traduzione degli indirizzi (NAT)

Poiché gli indirizzi IPv4 pubblici sono scarsi, una rete di casa riceve di solito un solo indirizzo pubblico, assegnato al router, e i dispositivi interni usano indirizzi privati come 192.168.1.23. Il router fa la traduzione degli indirizzi (NAT, Network Address Translation): riscrive l’indirizzo di origine dei pacchetti in uscita con il proprio e si ricorda a quale dispositivo interno appartiene ogni connessione, per consegnargli le risposte. Da fuori, tutti i dispositivi della casa appaiono come un unico indirizzo. Il NAT ha evitato che IPv4 si esaurisse molto prima, ma rende difficile raggiungere da fuori un dispositivo dentro la rete: è il problema che strumenti come Tailscale e Cloudflare Tunnel aggirano.

IPv6

Un indirizzo IPv6 ha 128 bit,10 quindi ci sono

indirizzi, abbastanza da non avere mai bisogno del NAT. Si scrive come otto gruppi da 16 bit in esadecimale, separati da due punti, con due abbreviazioni:11

  1. gli zeri iniziali di ogni gruppo si possono omettere (0db8 → db8);
  2. una sola sequenza di gruppi consecutivi tutti a zero si può sostituire con ::.
2606:4700:3031:0000:0000:0000:ac43:cc43   forma completa
2606:4700:3031::ac43:cc43                 forma compressa

Il :: può comparire una volta sola, altrimenti non si capirebbe quanti gruppi di zeri rappresenta ciascuno. Una curiosità di questo indirizzo in particolare: i suoi ultimi 32 bit, ac43:cc43, sono i byte ac 43 cc 43, cioè 172.67.204.67, l’indirizzo IPv4 dello stesso sito. È una scelta di Cloudflare, non una regola di IPv6.

I principali intervalli IPv6 sono:12

PrefissoTipoEsempio
2000::/3unicast globale: indirizzi pubblici2606:4700:3031::ac43:cc43 (Cloudflare ha 2606:4700::/32)
fc00::/7indirizzi locali unici (in pratica fd00::/8), l’equivalente IPv6 degli indirizzi privatiTailscale usa fd7a:115c:a1e0::/48
fe80::/10link-local: validi solo sul collegamento locale, ogni interfaccia ne ha unofe80::1c2b:… sul Wi-Fi
::1/128loopbackla macchina stessa
2001:db8::/32documentazione9esempi

Doppio stack e Happy Eyeballs

Le due versioni non sono compatibili: un dispositivo solo IPv4 non può parlare direttamente con uno solo IPv6. La transizione avviene quindi con il doppio stack (dual stack): reti e server usano entrambe, e un nome può avere sia un indirizzo IPv4 sia uno IPv6. Quando un client li ha tutti e due, l’algoritmo Happy Eyeballs13 parte da IPv6 e, se non ottiene una connessione entro un breve ritardo (il valore consigliato è 250 ms), prova in parallelo IPv4, tenendo quello che risponde per primo.

Una rete di casa può non avere affatto IPv6: dipende dall’operatore e dal router, non dal computer, che supporta IPv6 da decenni. Su Linux lo si vede con ip -6 route: se gli unici indirizzi sono fe80:: (link-local) e quelli di una VPN, non c’è una strada verso l’Internet IPv6. In questa situazione i client ricevono comunque dal DNS gli indirizzi IPv6 dei siti, li provano e ripiegano su IPv4. Di solito non costa nulla, ma una rete configurata male, o un browser che prova per primi protocolli più recenti su IPv6, può mostrare ritardi o errori occasionali che con il solo IPv4 non capitano. Il test più rapido è confrontare curl -4 e curl -6 sullo stesso sito.

Anycast

Di solito un indirizzo corrisponde a un solo luogo. Con l’anycast, invece, lo stesso blocco viene annunciato via BGP da molti luoghi contemporaneamente, e ogni pacchetto raggiunge il più vicino. Le reti di distribuzione dei contenuti come Cloudflare funzionano così: a 104.21.74.163 rispondono centinaia di data center, e gli stessi indirizzi servono molti siti diversi, distinti dal nome che il browser richiede. Per questo l’indirizzo IP di un sito dietro una rete simile dice dove si trova la rete, non dove si trova il server del sito.

Domain Name System

Prima del DNS, i nomi delle poche centinaia di macchine di ARPANET erano conservati in un unico file, HOSTS.TXT, gestito centralmente e copiato da tutti. Il file cresceva troppo in fretta per essere gestito così, e nel 1983 Paul Mockapetris propose il Domain Name System,14 la cui definizione attuale risale al 1987.1516 Una traccia del vecchio metodo sopravvive nel file /etc/hosts, che i sistemi leggono ancora prima di chiedere al DNS.

Nomi e gerarchia

Un nome di dominio è una sequenza di etichette separate da punti, che si leggono da destra a sinistra, dalla più generale alla più specifica:

wiki . daniellomario . com . (radice)
  • la radice è l’etichetta vuota all’estrema destra; la forma completa di un nome termina con un punto: wiki.daniellomario.com.;
  • com è un dominio di primo livello (TLD, top-level domain); altri sono it, org o dev;
  • daniellomario è il dominio di secondo livello, la parte che si registra;
  • wiki è un sottodominio, che il proprietario può creare liberamente.

Ogni etichetta può essere lunga fino a 63 caratteri. L’albero è diviso in zone, parti gestite da organizzazioni diverse. La zona radice delega com ai server dell’azienda che lo gestisce, e com delega daniellomario.com ai server scelti dal suo proprietario. La delega è il motivo per cui il DNS scala: nessun server sa tutto, ma ogni server sa a chi chiedere.

Qui entrano in gioco due ruoli che si confondono spesso:

  • il registrar è l’azienda presso cui si compra e si rinnova il dominio; scrive nella zona del TLD quali name server sono responsabili del dominio;
  • il provider DNS gestisce quei name server e conserva i record veri e propri.

Possono essere la stessa azienda o due diverse. Spostare un dominio da un provider DNS a un altro significa cambiare i name server presso il registrar; l’esempio più sotto mostra che cosa può succedere nel frattempo.

Risoluzione

Alla traduzione di un nome in un indirizzo partecipano tre tipi di software:

  • lo stub resolver, dentro il sistema operativo del dispositivo (su Linux, per esempio, systemd-resolved), che non risolve nulla da sé ma inoltra la domanda;
  • il resolver ricorsivo, che fa il lavoro vero e tiene una cache: quello dell’operatore o del router, oppure uno pubblico come 1.1.1.1 (Cloudflare) o 8.8.8.8 (Google);
  • i server autorevoli, che conservano i record di una zona e rispondono solo per quella.

Partendo da una cache vuota, i passi sono quelli della figura nell’infobox:

  1. il dispositivo chiede al resolver ricorsivo l’indirizzo di wiki.daniellomario.com;
  2. il resolver chiede a un server radice, che non conosce la risposta ma risponde con i server di com;
  3. chiede a un server di com, che risponde con i server di daniellomario.com (qui albert.ns.cloudflare.com e kayleigh.ns.cloudflare.com);
  4. chiede a uno di questi server autorevoli, che finalmente risponde con l’indirizzo;
  5. il resolver restituisce l’indirizzo al dispositivo e tiene ogni risposta in cache.

Le identità dei server radice sono 13, chiamate da a.root-servers.net a m.root-servers.net e gestite da 12 organizzazioni;17 grazie all’anycast ognuna di esse è in realtà un gran numero di server sparsi nel mondo. In pratica i passi 2 e 3 non avvengono quasi mai: gli indirizzi dei server di com sono nella cache di ogni resolver, e il lavoro si riduce all’ultimo passo o a niente del tutto.

Cache e TTL

Ogni record porta un TTL (time to live), il numero di secondi per cui si può tenere in cache. Per quel tempo i resolver rispondono a memoria, senza chiedere di nuovo ai server autorevoli. È ciò che rende il DNS veloce e leggero, ed è anche il motivo per cui le modifiche non sono istantanee.

Alcuni valori del dominio di questa wiki, misurati con dig:

CosaTTLSignificato
record A e AAAA del sito300 sun cambio di indirizzo lo vedono tutti entro 5 minuti
record NS nella zona86 400 sun giorno
delega nella zona com172 800 sdue giorni: il tempo per cui un resolver può continuare a chiedere ai vecchi name server dopo un cambio
risposte negative1 800 sper quanto si ricorda un “questo record non esiste”

Anche il fatto che un record non esista finisce in cache (negative caching).18 La durata è la minore tra il TTL del record SOA della zona e l’ultimo campo di quel record, qui entrambi 1 800 secondi. Vuol dire che interrogare un nome prima di creare il record può “avvelenare” la risposta per mezz’ora: il record ormai esiste, ma il resolver continua a rispondere che non c’è.

Quella che comunemente si chiama propagazione del DNS non è qualcosa che viaggia: è il tempo che serve perché scadano le vecchie copie nelle cache di tutti i resolver.

Un esempio: una risposta vecchia dopo il cambio dei name server

È una situazione comune, capitata proprio mentre si metteva in piedi questa wiki. Gli indirizzi qui sotto sono esempi di documentazione.

  1. Il dominio era registrato presso un’azienda che forniva anche il DNS, e lì il nome wiki aveva un record A che puntava a un vecchio server, 203.0.113.10.
  2. Il sito è stato spostato dietro Cloudflare e i name server presso il registrar sono stati cambiati con quelli di Cloudflare, dove wiki ha i nuovi indirizzi.
  3. Per un massimo di due giorni (il TTL della delega) alcuni resolver hanno continuato a usare i vecchi name server che avevano in cache, e questi rispondevano ancora con 203.0.113.10.
  4. Il vecchio server non accettava più connessioni sulla porta 443, quindi per quegli utenti il browser mostrava “connessione non riuscita”, mentre per tutti gli altri il sito funzionava.

La soluzione è stata cancellare il vecchio record presso il provider precedente. Ne vengono due regole: quando si sposta il DNS, svuotare o allineare la vecchia zona, e per i cambi programmati abbassare i TTL qualche giorno prima.

Trasporto e privacy

Il DNS classico viaggia in chiaro sulla porta UDP 53, passando a TCP per le risposte grandi: chiunque si trovi sul percorso di rete può leggere quali nomi cerca un dispositivo e, in teoria, alterare le risposte. Due standard cifrano il traffico tra il dispositivo e il resolver:

  • DNS over TLS (DoT), sulla porta 853;19
  • DNS over HTTPS (DoH), che nasconde le domande dentro il normale traffico HTTPS sulla porta 443.20

I browser possono usare DoH per conto proprio, scavalcando il resolver di sistema. In Firefox la funzione si chiama Trusted Recursive Resolver; la modalità più severa (“protezione massima”, modalità 3 in about:networking#dns) usa solo il resolver DoH, senza ripiego su quello di sistema. Dà più privacy, ma significa anche che il browser e il resto del sistema possono vedere risposte diverse o comportarsi in modo diverso sulla stessa rete. La cifratura protegge il percorso fino al resolver, non il contenuto delle risposte: quello è il compito del DNSSEC.

Record DNS

I dati di una zona sono conservati come record (resource record), ciascuno con cinque campi: nome, TTL, classe (in pratica sempre IN, Internet), tipo e dati. È così che li mostra dig:

daniellomario.com.   300   IN   A   172.67.204.67
TipoContieneEsempio da questo dominio
Aindirizzo IPv4172.67.204.67
AAAAindirizzo IPv62606:4700:3031::ac43:cc43
CNAMEalias verso un altro nomesend → send.forge.rmta.net
NSserver autorevoli della zonaalbert.ns.cloudflare.com
SOAdati amministrativi della zonanumero di serie, timer, TTL negativo
MXserver di posta, con priorità15 route3.mx.cloudflare.net
TXTtesto libero: SPF, DKIM, DMARC, verifichev=spf1 include:_spf.mx.cloudflare.net ~all
HTTPSparametri di connessione per un sito webprotocolli h3 e h2, suggerimenti di indirizzo
PTRnome di un indirizzo (risoluzione inversa)—
CAAautorità di certificazione ammesse a emettere certificati—
DNSKEY, RRSIG, DSchiavi e firme DNSSECDS 2371 13 2 5433… nella zona com

A e AAAA

Il record A contiene un indirizzo IPv4 e il record AAAA (quattro A, perché l’indirizzo è quattro volte più lungo) un indirizzo IPv6. Un nome può averne diversi di ciascun tipo: i client ne scelgono uno e provano gli altri se non funziona. Il dominio di questa wiki ne ha due per tipo:

daniellomario.com.   300   IN   A      172.67.204.67
daniellomario.com.   300   IN   A      104.21.74.163
daniellomario.com.   300   IN   AAAA   2606:4700:3031::6815:4aa3
daniellomario.com.   300   IN   AAAA   2606:4700:3031::ac43:cc43

Non sono gli indirizzi di un server proprio, ma quelli della rete anycast di Cloudflare, che poi inoltra la richiesta al sito. Il sottodominio wiki ha gli stessi quattro indirizzi.

CNAME

Un record CNAME dice che un nome è un alias di un altro: chi lo risolve deve ripartire dal nome di destinazione. In questo dominio send.daniellomario.com è un alias di send.forge.rmta.net, un nome del servizio di posta, così il servizio può cambiare i propri record senza che il proprietario del dominio debba toccare nulla. Dal suo funzionamento seguono due regole:

  • un nome con un CNAME non può avere nessun altro record, perché il CNAME dice “tutto ciò che riguarda questo nome è là”;
  • per questo l’apice di una zona (daniellomario.com stesso), che deve avere i record SOA e NS, non può essere un CNAME. Alcuni provider offrono una scappatoia, come il CNAME flattening di Cloudflare, che risolve l’alias sul server e pubblica i record A e AAAA risultanti.

NS e SOA

I record NS elencano i server autorevoli di una zona; lo stesso elenco deve comparire anche nella zona superiore (com), ed è questo che fa funzionare la delega. Il record SOA (start of authority) contiene i dati amministrativi della zona:

daniellomario.com. 1800 IN SOA albert.ns.cloudflare.com. dns.cloudflare.com. 2418953318 10000 2400 604800 1800
CampoValoreSignificato
server primarioalbert.ns.cloudflare.comil name server principale
contattodns.cloudflare.comun indirizzo email in cui il primo punto sta per @: dns@cloudflare.com
numero di serie2418953318versione della zona, cresce a ogni modifica
refresh, retry, expire10000, 2400, 604800timer per i server secondari che copiano la zona
minimum1800TTL delle risposte negative

MX

I record MX (mail exchanger) dicono quali server ricevono la posta del dominio. Ognuno ha una priorità: chi invia prova prima il server con il numero più basso e gli altri se quello non risponde.

daniellomario.com.  300  IN  MX  15  route3.mx.cloudflare.net.
daniellomario.com.  300  IN  MX  78  route2.mx.cloudflare.net.
daniellomario.com.  300  IN  MX  91  route1.mx.cloudflare.net.

Qui i tre server sono quelli del servizio di inoltro di Cloudflare, che riceve la posta di info@ e cv@ e la passa a una casella personale. Senza record MX un dominio non può ricevere email.

TXT e autenticazione della posta

Un record TXT contiene testo arbitrario. È nato per note destinate alle persone, ma oggi serve soprattutto per dati letti dai programmi: prove di possesso del dominio chieste da servizi esterni e, soprattutto, i tre meccanismi che proteggono la posta dai mittenti falsi.

L’SPF (Sender Policy Framework)21 elenca quali server possono inviare posta per un dominio:

daniellomario.com.  TXT  "v=spf1 include:_spf.mx.cloudflare.net ~all"

include: importa l’elenco pubblicato da Cloudflare, e ~all (softfail) chiede di trattare come sospetta la posta da qualsiasi altro server; -all chiederebbe di rifiutarla. L’SPF controlla il dominio del mittente della busta (il Return-Path), non quello che vede chi legge, e non regge quando un messaggio viene inoltrato.

Il DKIM (DomainKeys Identified Mail)22 aggiunge una firma digitale a ogni messaggio. Il server che invia firma con una chiave privata, e la chiave pubblica viene pubblicata in un record TXT sotto un nome formato da un selettore e da _domainkey:

cf2024-1._domainkey.daniellomario.com.  TXT  "v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkq…"
resend._domainkey.daniellomario.com.    TXT  "p=MIGfMA0GCSqGSIb3DQEB…"

I selettori permettono di avere più chiavi insieme: qui una appartiene al servizio di posta di Cloudflare e una a Resend, il servizio usato per rispondere dagli indirizzi del dominio. Chi riceve legge il selettore dal messaggio, cerca la chiave e verifica che il messaggio non sia stato alterato.

Il DMARC23 lega i due e dice cosa fare quando falliscono:

_dmarc.daniellomario.com.  TXT  "v=DMARC1; p=reject; sp=reject"

Un messaggio supera il DMARC se passa l’SPF o il DKIM e il dominio controllato è allineato con quello dell’indirizzo From: visibile, cioè è lo stesso dominio o un suo sottodominio. p=reject chiede a chi riceve di rifiutare i messaggi che falliscono, e sp=reject applica la stessa regola ai sottodomini. È la politica più severa: nessuno può inviare posta che sembri provenire da @daniellomario.com senza passare dai servizi autorizzati. Le risposte inviate con Resend passano grazie alla firma DKIM con d=daniellomario.com e a un Return-Path sul sottodominio send, allineato con il dominio principale.

HTTPS e SVCB

Il record HTTPS, una specializzazione del più generale SVCB,24 dice a un browser come collegarsi prima della prima connessione: quali protocolli supporta il server e a quali indirizzi.

daniellomario.com. 300 IN HTTPS 1 . alpn="h3,h2" ipv4hint=104.21.74.163,172.67.204.67 ech=AEX+DQBB… ipv6hint=2606:4700:3031::6815:4aa3,…

alpn="h3,h2" annuncia HTTP/3 e HTTP/2, così il browser può provare subito HTTP/3; i suggerimenti (hint) ripetono gli indirizzi per risparmiare una risoluzione; ech contiene la chiave per l’Encrypted ClientHello, che nasconde a chi osserva il traffico perfino il nome del sito richiesto.

PTR e CAA

Un record PTR fa l’opposto di un record A: associa un nome a un indirizzo. Le risoluzioni inverse usano zone speciali in cui l’indirizzo è scritto al contrario: 163.74.21.104.in-addr.arpa per 104.21.74.163, e le 32 cifre esadecimali in ordine inverso sotto ip6.arpa per IPv6. Le usano soprattutto i server di posta, che diffidano dei mittenti il cui indirizzo non ha un nome coerente.

Un record CAA elenca le autorità di certificazione ammesse a emettere certificati TLS per il dominio. Senza, come su questo dominio, qualsiasi autorità può farlo; pubblicarlo riduce il rischio che un certificato venga emesso per errore.

DNSSEC

Il DNS è stato progettato senza alcun modo di verificare le risposte. Un resolver che accetta una risposta falsa la tiene in cache e la consegna a tutti i suoi utenti per l’intero TTL: si chiama avvelenamento della cache (cache poisoning). Nel 2008 Dan Kaminsky mostrò che era molto più facile da realizzare di quanto si pensasse,25 e i resolver reagirono rendendo casuali porte e identificativi delle domande. La soluzione vera è il DNSSEC,26 che aggiunge firme digitali ai record:

  • DNSKEY: le chiavi pubbliche della zona. Il valore 257 dei flag indica la key signing key (KSK), che firma solo le altre chiavi, e 256 le zone signing key (ZSK), che firmano i dati;
  • RRSIG: la firma di ogni insieme di record, con il suo periodo di validità;
  • DS (delegation signer): un’impronta (hash) della KSK della zona figlia, pubblicata nella zona madre. È l’anello della catena di fiducia;
  • NSEC e NSEC3: prove firmate che un nome non esiste, così che nemmeno le risposte negative si possano falsificare.

La verifica scende lungo l’albero a partire dalla radice, la cui chiave è inclusa nei resolver: la radice firma il DS di com, le chiavi di com firmano il DS del dominio, le chiavi del dominio firmano i suoi record. La radice è firmata dal 15 luglio 2010.27 Oggi il record DS di com nella zona radice è:

com.   DS   19718 13 2 8ACBB0CD28F41250A80A491389424D341522D946B0DA0C0291F2D3D771D7805A

dove 19718 identifica la chiave, 13 è l’algoritmo (ECDSA sulla curva P-256 con SHA-256) e 2 la funzione di hash dell’impronta (SHA-256).

Un resolver che completa la verifica imposta il flag AD (authenticated data) nella risposta. Il dominio di questa wiki è firmato dal 1° novembre 2026. La zona pubblica due chiavi, entrambe con algoritmo 13:

daniellomario.com.  3600  IN  DNSKEY  257 3 13 mdsswUyr3DPW132mOi8V…   (KSK, key tag 2371)
daniellomario.com.  3600  IN  DNSKEY  256 3 13 oJMRESz5E4gYzS/q6XDr…   (ZSK, key tag 34505)

e la zona com contiene il record DS che le aggancia alla catena di fiducia:

daniellomario.com.  DS  2371 13 2 54333064B9903A6B6F4F223DFCCA3EE75F4600314753C1D2F410E91F5C73DEC2

Il DS punta alla KSK (key tag 2371), la KSK firma l’insieme delle chiavi, e la ZSK (key tag 34505) firma tutti gli altri record, per esempio i record A, ciascuno con una RRSIG valida per pochi giorni. Interrogando un resolver che verifica, con dig +dnssec daniellomario.com, tra i flag compare ad. resolvectl query può comunque stampare Data is authenticated: no: quella riga si riferisce alla verifica fatta dal systemd-resolved locale, che molte distribuzioni lasciano disattivata, non a quella del resolver a monte.

Attivare il DNSSEC ha richiesto due passi, in quest’ordine: accendere la firma presso il provider DNS, che crea le chiavi, e poi inserire il record DS presso il registrar, che lo pubblica in com. L’ordine conta, e conta la precisione: un DS che non corrisponde alle chiavi rende il dominio irraggiungibile per tutti i resolver che verificano, cioè oggi la maggior parte. Prima di inserirlo conviene ricalcolare il DS dalla DNSKEY pubblicata e controllare che coincida.

Campi di un record DS

Quando si attiva il DNSSEC, il registrar chiede il record DS diviso in quattro campi. Per questo dominio sono:

CampoValoreSignificato
Key Tag2371identificativo breve della chiave a cui il record si riferisce
Algorithm13ECDSA sulla curva P-256 con SHA-256
Digest Type2la funzione di hash usata per l’impronta: SHA-256
Digesti 64 caratteri esadecimali del record DS qui sopral’impronta (hash) della chiave stessa

Key Tag. Un numero di 16 bit calcolato dal contenuto del record DNSKEY con una semplice somma di controllo.28 Permette a un resolver di trovare subito a quale chiave si riferisce il DS quando la zona ne pubblica più di una, come qui (KSK e ZSK) e durante un cambio di chiave. Non è un meccanismo di sicurezza: due chiavi diverse possono avere lo stesso tag, e il controllo vero lo fa il digest.

Algorithm. Il numero, preso da un registro gestito da IANA, dell’algoritmo di firma della chiave; deve coincidere con il campo algoritmo della DNSKEY. I più comuni sono 8 (RSA con SHA-256, usato dalla radice), 13 (ECDSA P-256 con SHA-256, usato da com e da questo dominio)29 e 15 (Ed25519). L’algoritmo 13 è diffuso perché chiavi e firme sono molto più corte di quelle RSA: una firma P-256 occupa 64 byte, contro i 256 byte di RSA a 2048 bit, così le risposte firmate restano abbastanza piccole da viaggiare su UDP.

Digest Type. Quale funzione di hash ha prodotto l’impronta: 1 è SHA-1, ormai deprecata, 2 è SHA-256, la scelta abituale, e 4 è SHA-384. È indipendente dall’algoritmo: l’algoritmo riguarda le firme, il tipo di digest solo il modo in cui la zona madre conserva la sua impronta della chiave.

Digest. L’hash del nome del dominio, nella forma binaria usata dal DNS, seguito dal contenuto del record DNSKEY (flag, protocollo, algoritmo e chiave pubblica):

Con SHA-256 il risultato è di 32 byte, scritti come 64 caratteri esadecimali. Siccome il nome fa parte dell’input, la stessa chiave usata per due domini darebbe due impronte diverse. Il digest non è segreto: chiunque può leggerlo con dig DS daniellomario.com e chiunque può ricalcolarlo dalla DNSKEY pubblica. Ricalcolarlo è proprio il controllo che conviene fare prima di inserirlo presso il registrar, perché basta un carattere sbagliato per spezzare la catena di fiducia.

La zona madre conserva un’impronta invece dell’intera chiave perché deve solo garantire per la chiave, non usarla: un hash ha una dimensione breve e fissa, e la chiave, che la zona figlia può cambiare, resta nella zona figlia.

Strumenti di diagnosi

ComandoCosa fa
dig nomechiede al resolver di sistema il record A e mostra la risposta completa
dig +short nome AAAAsolo gli indirizzi IPv6
dig nome @1.1.1.1chiede a un resolver preciso, per confrontare le risposte
dig nome NS @a.gtld-servers.netchiede direttamente ai server di com: mostra la delega com’è davvero
dig +trace nomeripete l’intera risoluzione partendo dalla radice
dig +dnssec nomemostra anche le firme RRSIG
getent hosts nomerisolve come fanno i programmi, compreso /etc/hosts
resolvectl query nomechiede a systemd-resolved, con origine e stato DNSSEC
curl -4 -sI https://nomeprova la connessione solo in IPv4 (-6 solo in IPv6)
ip -6 routemostra se la macchina ha una strada verso l’Internet IPv6
about:networking#dnsla cache DNS di Firefox e la sua modalità DoH

Quando un sito non si carica, l’ordine è: controllare che il nome risolva (dig), che risolva agli indirizzi attesi chiedendo a resolver diversi, che gli indirizzi rispondano in IPv4 e in IPv6 (curl -4, curl -6), e infine se il browser vede qualcosa di diverso dal sistema. Ogni passo esclude un livello, e il primo che fallisce dice dov’è il problema.

Glossario inglese–italiano

Termini usati comunemente in inglese anche nei contesti italiani, con una frase di esempio utile in un colloquio di lavoro.

TermineSignificatoFrase di esempio
Name resolutionRisoluzione dei nomiName resolution turns a hostname into an IP address.
Recursive resolverResolver ricorsivoThe recursive resolver does the lookup and caches the answer.
Authoritative serverServer autorevoleOnly the authoritative servers hold the zone’s records.
RecordRecord DNSI added an A record and an AAAA record for the subdomain.
TTLDurata in cacheWith a TTL of 300 seconds, the change is visible within five minutes.
PropagationPropagazione (scadenza delle cache)Propagation is really just old cache entries expiring.
Subnet / CIDRSottorete / notazione CIDRA /24 subnet has 256 addresses.
Dual stackDoppio stack IPv4 e IPv6The server is dual stack, so it answers on both IPv4 and IPv6.
NATTraduzione degli indirizziBehind NAT, all devices share one public IPv4 address.
AnycastStesso indirizzo da più luoghiWith anycast, users reach the nearest data center.
Alignment (DMARC)Allineamento dei dominiDMARC requires SPF or DKIM to be aligned with the From domain.

Voci correlate

Note

Footnotes

  1. Postel, J. (1981). Internet Protocol. RFC 791. rfc-editor.org ↩ ↩2

  2. Number Resource Organization (2011). Free Pool of IPv4 Address Space Depleted. Comunicato stampa, 3 febbraio 2011. nro.net ↩

  3. RIPE NCC (2019). The RIPE NCC has run out of IPv4 Addresses. 25 novembre 2019. ripe.net ↩

  4. Fuller, V. et al. (1993). Classless Inter-Domain Routing (CIDR): an Address Assignment and Aggregation Strategy. RFC 1519. rfc-editor.org ↩

  5. Fuller, V., Li, T. (2006). Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan. RFC 4632. rfc-editor.org ↩

  6. Rekhter, Y. et al. (1996). Address Allocation for Private Internets. RFC 1918. rfc-editor.org ↩

  7. Weil, J. et al. (2012). IANA-Reserved IPv4 Prefix for Shared Address Space. RFC 6598. rfc-editor.org ↩

  8. Cheshire, S., Aboba, B., Guttman, E. (2005). Dynamic Configuration of IPv4 Link-Local Addresses. RFC 3927. rfc-editor.org ↩

  9. Arkko, J., Cotton, M., Vegoda, L. (2010). IPv4 Address Blocks Reserved for Documentation. RFC 5737. rfc-editor.org; per IPv6: Huston, G., Lord, A., Smith, P. (2004). IPv6 Address Prefix Reserved for Documentation. RFC 3849. rfc-editor.org ↩ ↩2

  10. Deering, S., Hinden, R. (2017). Internet Protocol, Version 6 (IPv6) Specification. RFC 8200. rfc-editor.org ↩

  11. Kawamura, S., Kawashima, M. (2010). A Recommendation for IPv6 Address Text Representation. RFC 5952. rfc-editor.org ↩

  12. Hinden, R., Deering, S. (2006). IP Version 6 Addressing Architecture. RFC 4291. rfc-editor.org ↩

  13. Schinazi, D., Pauly, T. (2017). Happy Eyeballs Version 2: Better Connectivity Using Concurrency. RFC 8305. rfc-editor.org ↩

  14. Mockapetris, P. (1983). Domain Names – Concepts and Facilities. RFC 882. rfc-editor.org ↩

  15. Mockapetris, P. (1987). Domain Names – Concepts and Facilities. RFC 1034. rfc-editor.org ↩

  16. Mockapetris, P. (1987). Domain Names – Implementation and Specification. RFC 1035. rfc-editor.org ↩

  17. Root Server Technical Operations Association. Root Servers. root-servers.org ↩

  18. Andrews, M. (1998). Negative Caching of DNS Queries (DNS NCACHE). RFC 2308. rfc-editor.org ↩

  19. Hu, Z. et al. (2016). Specification for DNS over Transport Layer Security (TLS). RFC 7858. rfc-editor.org ↩

  20. Hoffman, P., McManus, P. (2018). DNS Queries over HTTPS (DoH). RFC 8484. rfc-editor.org ↩

  21. Kitterman, S. (2014). Sender Policy Framework (SPF) for Authorizing Use of Domains in Email, Version 1. RFC 7208. rfc-editor.org ↩

  22. Crocker, D., Hansen, T., Kucherawy, M. (2011). DomainKeys Identified Mail (DKIM) Signatures. RFC 6376. rfc-editor.org ↩

  23. Kucherawy, M., Zwicky, E. (2015). Domain-based Message Authentication, Reporting, and Conformance (DMARC). RFC 7489. rfc-editor.org ↩

  24. Schwartz, B., Bishop, M., Nygren, E. (2023). Service Binding and Parameter Specification via the DNS (SVCB and HTTPS Resource Records). RFC 9460. rfc-editor.org ↩

  25. CERT Coordination Center (2008). Multiple DNS implementations vulnerable to cache poisoning. Vulnerability Note VU#800113. kb.cert.org ↩

  26. Arends, R. et al. (2005). DNS Security Introduction and Requirements. RFC 4033. rfc-editor.org ↩

  27. IANA. Root zone trust anchors: la prima chiave della radice è valida dal 15 luglio 2010. data.iana.org ↩

  28. Arends, R. et al. (2005). Resource Records for the DNS Security Extensions. RFC 4034. rfc-editor.org ↩

  29. Hoffman, P., Wijngaards, W. C. A. (2012). Elliptic Curve Digital Signature Algorithm (DSA) for DNSSEC. RFC 6605. rfc-editor.org ↩