Il tuo record SPF sembra a posto: qualche include per il provider di posta, lo strumento di newsletter e il CRM, chiuso da -all. Eppure l’intestazione di un messaggio riporta spf=permerror, i report DMARC mostrano errori SPF o un checker segnala “too many DNS lookups”. La causa è di solito il limite di 10 termini che generano query DNS previsto dallo standard SPF, che conta anche i lookup nascosti dentro ogni include.
Questa guida spiega quali termini contano e quali no, il limite separato sui void lookup, come contare il totale a mano, come tornare sotto dieci senza perdere posta legittima, perché il flattening richiede cautela e perché un nome può avere un solo record SPF. Tutti i nomi di dominio e gli indirizzi IP sono esempi.
Ambito di questa guida
Lo snapshot gratuito legge il record SPF dell’hostname esatto che inserisci e conta solo i termini che generano query DNS in quel record. Non segue include: o redirect=, non conta i void lookup, non invia posta e non è un pentest.
Che cosa significa “too many DNS lookups”
Quando un server ricevente verifica SPF, legge il record TXT che inizia con v=spf1 sul dominio del mittente della busta (l’indirizzo MAIL FROM, poi visibile come Return-Path) e ne valuta i termini da sinistra a destra. Alcuni termini obbligano il ricevente a interrogare di nuovo il DNS. La RFC 7208, sezione 4.6.4 limita questi termini a 10 per verifica, compresi quelli contenuti in ogni record incluso. Quando la valutazione ne richiede un undicesimo, il ricevente deve fermarsi e restituire permerror, il risultato per i record pubblicati che non si sono potuti interpretare correttamente.
Di solito te ne accorgi in uno di tre punti: l’header Authentication-Results di un messaggio consegnato (RFC 8601), per esempio spf=permerror smtp.mailfrom=example.com; un messaggio di rimbalzo che cita troppi lookup; oppure gli errori SPF nei report aggregati DMARC.
Due dettagli rendono l’errore confuso. I riceventi contano i lookup durante la valutazione, e la valutazione si ferma al primo termine che corrisponde. La posta di un servizio elencato all’inizio può continuare a passare, mentre quella di un servizio il cui include si trova dopo il decimo lookup riceve permerror: il problema può sembrare intermittente. Inoltre permerror non è un fail: SPF semplicemente smette di aiutare. DMARC passa quando SPF oppure DKIM passa per un dominio allineato all’indirizzo From (RFC 9989), quindi un messaggio con una firma DKIM allineata passa comunque, mentre uno che si affidava solo a SPF no. Come un ricevente tratti permerror oltre a questo è una sua decisione.
Quali termini SPF contano nel limite e quali no
| Termine | Conta nei 10 | Che cos’altro sapere |
|---|---|---|
include: | 1, più ogni lookup del record incluso | Se il nome incluso non ha un record SPF, il risultato è permerror |
a, a: | 1 | Interroga i record A o AAAA del nome, a seconda che il mittente si sia connesso in IPv4 o IPv6 |
mx, mx: | 1 | I lookup degli indirizzi per gli host MX restituiti hanno un limite proprio, separato, di 10 |
ptr | 1 | La RFC 7208 dice che NON DOVREBBE essere pubblicato |
exists: | 1 | Corrisponde se il nome costruito ha un record A; spesso usato con le macro |
redirect= | 1, più ogni lookup del record di destinazione | Ignorato quando il record contiene un termine all |
ip4:, ip6: | 0 | L’indirizzo viene confrontato direttamente, senza query |
all | 0 | Imposta il risultato per ogni mittente non corrisposto prima |
exp= | 0 | Interrogato solo dopo un fail, per recuperare un testo di spiegazione |
Il tuo record v=spf1 | 0 | La prima query TXT non è un termine |
Il budget appartiene all’intera valutazione, non a un singolo record. Un include costa un lookup per sé e poi quanto costa il record che sta dietro, fino all’ultimo livello annidato. I provider modificano i propri record, per esempio distribuendo i loro intervalli di indirizzi su più include annidati, quindi il totale può cambiare senza alcuna modifica da parte tua.
Il limite esiste perché i record SPF fanno inviare ai riceventi query DNS per conto di chi li pubblica; la sezione 11.1 della RFC 7208 descrive come un attaccante potrebbe altrimenti sfruttarlo per inondare il DNS di terzi. La RFC suggerisce anche un limite di tempo per l’intera verifica, di almeno 20 secondi. Se il tempo finisce si ottiene temperror, un errore temporaneo, e non permerror.
Il secondo limite: non più di due void lookup
La RFC 7208 aggiunge un limite separato per i lookup che tornano vuoti: una risposta senza record (NOERROR con zero risposte) oppure un Name Error (NXDOMAIN, il nome non esiste). Si chiamano void lookup. Le implementazioni DOVREBBERO consentirne al massimo due, e superarli produce ancora permerror, anche se il totale è ancora sotto 10. Serve a evitare che un record SPF mandi i riceventi a caccia di lunghe liste di nomi inesistenti.
I void lookup nascono di solito da residui:
a:old-web.example.comdopo che il nome DNS del vecchio server è stato eliminato.mxomx:example.orgsu un nome senza record MX. Il meccanismo non deve ripiegare sul record A del nome, quindi non trova nulla.asul dominio senza prefisso dopo che il sito è passato a un host che risponde solo suwww.
Un include: è più severo. Se il nome incluso non esiste o non pubblica alcun record SPF, l’include non conta solo come void: porta subito l’intero risultato a permerror (sezione 5.2). Succede quando un provider che hai smesso di usare ritira il dominio che il tuo record include ancora. Interroga ogni nome a cui punta il tuo record; un nome che non restituisce nulla va corretto o rimosso.
Come contare a mano i lookup SPF
Parti dal dominio del mittente della busta, che puoi leggere nell’header Return-Path di un messaggio che hai inviato, e percorri il record in modo ricorsivo:
- Leggi il record:
dig +short TXT example.com, oppurenslookup -type=TXT example.comsu Windows. - Assegna 1 a ogni
include,a,mx,ptr,existseredirect; assegna 0 aip4,ip6eall. - Per ogni include e redirect, leggi il record a cui puntano e valutalo allo stesso modo, fin dove arriva l’annidamento.
- Somma tutto e annota ogni nome che non ha restituito record.
Ecco un record ipotetico con solo cinque termini che generano query DNS a prima vista:
example.com. TXT "v=spf1 mx include:_spf.mail.example.net include:spf.crm.example.org include:news.example.net a -all"| Termine | Lookup | Perché |
|---|---|---|
mx | 1 | La query MX per example.com |
include:_spf.mail.example.net | 4 | 1 per l’include, 3 per tre include annidati in quel record |
include:spf.crm.example.org | 2 | 1 per l’include, 1 per un termine a: al suo interno |
include:news.example.net | 3 | 1 per l’include, 1 per un include annidato, 1 per un termine exists: in quest’ultimo |
a | 1 | Una voce residua per un vecchio server web |
-all | 0 | Nessuna query |
| Totale | 11 | Uno oltre il limite |
Il totale è il caso peggiore. Un mittente che corrisponde al primo include richiede al massimo cinque lookup e passa. Un mittente che non corrisponde a nulla prima arriva all’a finale, l’undicesimo lookup, quindi la posta falsificata riceve permerror invece del fail che -all avrebbe dovuto produrre. Conta di nuovo ogni volta che aggiungi un servizio di invio, e ogni tanto comunque, perché i record inclusi cambiano senza preavviso.
Come tornare sotto dieci senza perdere posta
- Rimuovi gli include che non usi più. Un precedente provider di posta, uno strumento di newsletter disdetto, una prova di CRM. I report aggregati DMARC mostrano quali fonti inviano davvero a nome del tuo dominio, e ti aiutano a individuare gli include inutili. Verifica con il responsabile di ciascun servizio prima di rimuoverlo.
- Controlla se un include viene davvero valutato. SPF si verifica sul dominio del mittente della busta. Se i messaggi di un servizio mostrano il dominio del servizio in
Return-Path, i riceventi controllano il record SPF di quel dominio, non il tuo, e il tuo include non serve a nulla per quella posta. Conferma nella documentazione del provider prima di toglierlo. - Sostituisci
aemxconip4eip6per i server che controlli. Se il tuo server invia da 192.0.2.10,ip4:192.0.2.10non costa nulla, mentreacosta un lookup. Chiediti semxdebba esserci: i server che ricevono la tua posta non necessariamente la inviano, e se appartengono al tuo provider di posta, il suo include potrebbe già elencare i server di invio. Aggiorna l’indirizzo quando il server cambia. - Assegna a ogni mittente ad alto volume un sottodominio dedicato. Lascia che un servizio di newsletter o ticketing usi come mittente della busta un dominio di rimbalzo come
news.example.com, con un proprio record SPF e un proprio limite di 10. SPF non si eredita, quindi il sottodominio ha bisogno di quel record. Con l’allineamento rilassato predefinito di DMARC,news.example.comresta allineato a un indirizzo From su example.com. Molti servizi lo chiamano return-path personalizzato o dominio di bounce. - Elimina
ptr. La RFC 7208 dice che NON DOVREBBE essere pubblicato: è lento, dipende dal DNS inverso controllato da chi possiede l’indirizzo IP che si connette e consuma lookup. Sostituiscilo conip4/ip6o con l’include del provider. - Non considerare il riordino una soluzione. Spostare in testa il mittente più attivo significa che meno messaggi arrivano all’undicesimo lookup, ma il record resta rotto per tutto ciò che sta più in basso, compresa la posta falsificata che dovrebbe incontrare
-all.
Anche DKIM allenta la pressione. DMARC richiede un solo esito allineato positivo, e DKIM di norma sopravvive all’inoltro mentre SPF no. Assicurati che ogni servizio firmi con il tuo dominio, poi riduci il record SPF.
Flattening SPF: meno lookup, più manutenzione
Il flattening sostituisce un include con gli intervalli ip4 e ip6 a cui si risolve oggi. Il conteggio dei lookup scende, ma il tuo record contiene ora una copia dell’elenco di qualcun altro, e la copia non si aggiorna da sola.
| Rischio | Che cosa succede | Come limitarlo |
|---|---|---|
| Il provider aggiunge o modifica intervalli | La posta dai nuovi indirizzi non supera SPF e nulla ti avvisa | Appiattisci solo provider che pubblicano intervalli stabili e documentati, e ricontrollali con regolarità |
| Il provider smette di usare certi intervalli | Gli indirizzi che ha lasciato, e che un giorno potrebbero servire a qualcun altro, restano autorizzati nel tuo record | Rimuovi gli intervalli che il provider non elenca più |
| Il record cresce | La RFC 7208 raccomanda di mantenere le risposte SPF entro 512 ottetti; risposte troppo grandi per un pacchetto UDP possono essere ignorate in silenzio dove i firewall ostacolano il DNS su TCP o EDNS0 | Appiattisci solo i pochi include più costosi |
| L’infrastruttura cambia spesso | Le grandi piattaforme cloud ruotano i propri indirizzi di invio | Mantieni il loro include; Microsoft, per esempio, sconsiglia di appiattire il suo include Microsoft 365 |
I servizi di flattening automatico risolvono gli include a intervalli regolari e riscrivono il tuo record. Questo risolve il problema degli intervalli obsoleti, ma dà a una terza parte un ruolo nel tuo DNS, e un aggiornamento fallito rompe il tuo SPF. Prova prima le altre soluzioni. Se decidi di appiattire, annota quale include hai sostituito e quando, confronta regolarmente con gli intervalli pubblicati dal provider e testa SPF dopo ogni modifica (Microsoft Learn dà lo stesso consiglio ai propri clienti).
Un record SPF per nome, diviso nel modo giusto
Un nome deve avere esattamente un record TXT che inizia con v=spf1. Con due, il ricevente non può scegliere e restituisce permerror (RFC 7208, sezione 4.5). Capita spesso quando la guida di configurazione di un nuovo servizio dice di “aggiungere questo record TXT” e qualcuno aggiunge un secondo record SPF invece di modificare il primo. Un secondo record quindi non raddoppia il budget; unisci i due:
# Sbagliato: due record SPF sullo stesso nome
example.com. TXT "v=spf1 include:_spf.mail.example.net -all"
example.com. TXT "v=spf1 include:spf.crm.example.org ~all"
# Corretto: un solo record
example.com. TXT "v=spf1 include:_spf.mail.example.net include:spf.crm.example.org -all"Altri record TXT sullo stesso nome, come i token di verifica del sito, vanno bene; contano solo i record che iniziano con v=spf1. Una singola stringa dentro un record TXT contiene al massimo 255 caratteri. Un record SPF più lungo resta un unico record TXT composto da più stringhe tra virgolette, che i riceventi uniscono senza aggiungere spazi (sezione 3.3), quindi chiudi una stringa con uno spazio dove finisce un termine:
example.com. TXT "v=spf1 ip4:192.0.2.0/24 ip6:2001:db8::/32 include:_spf.mail.example.net " "include:spf.crm.example.org -all"Diversi altri errori producono lo stesso permerror: un errore di sintassi in qualunque punto del record, come include= al posto di include: (sezione 4.6), oppure l’include di un dominio senza record SPF. Anche i record SPF non si ereditano, quindi ogni nome usato come mittente della busta ha bisogno del proprio record, e ciascuno ha il proprio limite di 10.
Che cosa conta il checker gratuito SPF e DMARC
Lo snapshot gratuito di preparazione al lancio esegue otto controlli passivi su un dominio pubblico, senza registrazione; uno di essi legge i record DNS della posta. Non è un pentest né l’audit su sei aree, e non invia posta.
- Hostname esatto. Legge il record SPF sul nome che inserisci, senza ripiegare sul dominio padre. Inserisci il dominio del mittente della busta, per esempio example.com anziché www.example.com.
- Conteggio di primo livello. Conta i termini che generano query DNS in quel record (
include,a,mx,ptr,existseredirect) e segnala più di dieci come segnale di rischio medio. - Non seguiti. Non segue
include:néredirect=, non conta i void lookup e non segnala un secondo record SPF sullo stesso nome. L’esempio a cinque termini sopra supera questo conteggio anche se i riceventi hanno bisogno di undici lookup, quindi fai anche tu il conteggio ricorsivo. - Altri segnali SPF.
+allè segnalato come rischio alto e?allcome basso; un record SPF o DMARC mancante viene segnalato quando l’host ha record MX.
Per aprire prima il controllo DNS della posta, usa la verifica gratuita SPF e DMARC: esegue lo stesso snapshot e mostra quel controllo sopra gli altri sette. Per il resto del record, da ~all contro -all al passaggio di DMARC da none a reject, vedi la guida a SPF e DMARC.
Domande frequenti
Che cosa significa “SPF permerror: too many DNS lookups”?
La valutazione del tuo record SPF ha richiesto più di 10 termini che generano query DNS, contando quelli dentro i record inclusi. La RFC 7208 impone ai riceventi di fermarsi e restituire permerror a quel punto, quindi SPF non può più aiutare il messaggio a superare DMARC.
ip4 e ip6 contano nel limite di lookup SPF?
No. ip4, ip6 e all non richiedono query DNS e non vengono contati. include, a, mx, ptr, exists e redirect contano uno ciascuno, e un include o un redirect aggiunge anche ogni lookup del record a cui punta.
Il limite SPF è 10 include o 10 lookup?
10 lookup. Un record con quattro include può superare il limite quando i record inclusi contengono a loro volta include, a o mx. Conta in modo ricorsivo attraverso ogni include e redirect, non solo i termini che vedi.
Posso pubblicare un secondo record SPF per avere più lookup?
No. Due record TXT che iniziano con v=spf1 sullo stesso nome portano il risultato a permerror. Uniscili in un solo record, oppure sposta un mittente su un sottodominio dedicato, che ha il proprio record e il proprio limite di 10.
Il flattening SPF risolve il limite di 10 lookup?
Riduce il conteggio, ma gli intervalli IP copiati diventano obsoleti quando il provider li cambia, e la posta legittima dai nuovi indirizzi non supera più SPF. Prima rimuovi gli include inutilizzati e usa i sottodomini; appiattisci solo provider con intervalli stabili e documentati e ricontrollali regolarmente.
DMARC fallisce se il mio record SPF restituisce permerror?
Non necessariamente. DMARC richiede un solo esito allineato positivo, quindi la posta con una firma DKIM valida allineata al dominio From passa comunque. La posta che si affidava solo a SPF no, ed è per questo che correggere il record conta.
Fonti e approfondimenti
- RFC 7208: Sender Policy Framework (SPF)www.rfc-editor.org
- RFC 7208, sezione 4.6.4: limiti dei lookup DNSwww.rfc-editor.org
- RFC 9989: DMARCwww.rfc-editor.org
- RFC 8601: campo di intestazione del messaggio per indicare lo stato di autenticazionewww.rfc-editor.org
- Microsoft Learn: configurare SPF per identificare le fonti di posta valide del tuo dominio Microsoft 365learn.microsoft.com
A cura della redazione di Sitelemetry. Le fonti collegate permettono di approfondire gli argomenti.



