Cause tipiche dei mail loop e come risolverle
Come individuare e risolvere sistematicamente i mail loop SMTP in Exchange Online, ambienti ibridi e mail gateway a monte mediante NDR, intestazioni, Message Trace, oggetti destinatario e connector.
Un mail loop si verifica quando almeno due sistemi di trasporto si passano ripetutamente lo stesso messaggio. Nessuno dei sistemi si riconosce come destinazione finale, ma entrambi conoscono un hop successivo apparentemente adatto. Il ciclo termina solo quando un server rileva il superamento del numero consentito di stazioni di trasporto e genera un NDR.
In Exchange, due messaggi sono particolarmente indicativi:
554 5.4.6 Hop count exceeded - possible mail loopviene in genere generato dall’Exchange locale.554 5.4.14 Hop count exceeded - possible mail loop ATTR34viene generato da Exchange Online.
Il limite di hop non è la causa, bensì la protezione contro una ripetizione infinita. Aumentarlo non risolve quindi nulla. Occorre individuare il punto in cui il messaggio, contrariamente all’architettura di destinazione, viene restituito a un sistema già attraversato.
Riconoscere lo schema del ciclo nell’intestazione
L’NDR e le intestazioni complete dei messaggi originali devono essere salvati prima di qualsiasi modifica. Le righe Received si leggono dal basso verso l’alto: la riga più in basso è l’hop documentato più antico, quella più in alto il più recente.
Un ciclo si manifesta di solito come sequenza ricorrente:
Internet
→ Exchange Online Protection
→ Mailgateway
→ Exchange Online Protection
→ Mailgateway
→ Exchange Online Protection
→ ...
Non ogni hostname Microsoft che compare più volte indica già un ciclo. Exchange Online elabora internamente i messaggi attraverso più ruoli di trasporto. È invece sospetto il ritorno ripetuto tra gli stessi confini amministrativi, ad esempio tra Exchange Online e un gateway locale. Timestamp, IP mittente, host ricevente e Message-ID aiutano a identificare chiaramente il giro.
Per la prima analisi è necessario rispondere a queste domande:
- Quale sistema ha generato l’NDR?
- Quali due o tre hop si ripetono?
- Quale sistema avrebbe dovuto consegnare definitivamente il messaggio?
- In base a quale decisione relativa a dominio, destinatario, connector o regola è stato inoltrato?
- Quale modifica ha influenzato per ultima il flusso di posta?
Diagnosi in Exchange Online
Con Get-MessageTraceV2 è possibile analizzare l’elaborazione degli ultimi 90 giorni; ogni query può coprire al massimo dieci giorni. Una finestra temporale ristretta e l’indirizzo concreto del destinatario forniscono i risultati più utili:
$start = (Get-Date).AddHours(-2)
$end = Get-Date
$recipient = "user01@contoso.com"
$trace = Get-MessageTraceV2 `
-RecipientAddress $recipient `
-StartDate $start `
-EndDate $end `
-ResultSize 5000
$trace |
Select-Object Received,SenderAddress,RecipientAddress,Subject,
Status,FromIP,ToIP,MessageTraceId,MessageId |
Sort-Object Received
I dettagli di un risultato mostrano i singoli eventi di trasporto:
$trace | ForEach-Object {
Get-MessageTraceDetailV2 `
-MessageTraceId $_.MessageTraceId `
-RecipientAddress $_.RecipientAddress
} | Format-Table Date,Event,Action,Detail -AutoSize
Successivamente vengono rilevati insieme dominio, destinatario e connector:
Get-AcceptedDomain |
Format-Table Name,DomainName,DomainType,MatchSubDomains -AutoSize
Get-EXORecipient -Identity $recipient |
Format-List DisplayName,RecipientTypeDetails,PrimarySmtpAddress,
ExternalEmailAddress,EmailAddresses
Get-OutboundConnector -IncludeTestModeConnectors |
Format-List Name,Enabled,ConnectorType,RecipientDomains,SmartHosts,
UseMXRecord,RouteAllMessagesViaOnPremises,TlsSettings
Get-InboundConnector |
Format-List Name,Enabled,ConnectorType,SenderDomains,SenderIPAddresses,
TlsSenderCertificateName,RequireTls,RestrictDomainsToIPAddresses,
RestrictDomainsToCertificate
Non è decisivo se un singolo oggetto sembra plausibile. Il tipo di dominio, il tipo effettivo di destinatario e il connector applicabile devono descrivere insieme la stessa destinazione.
Diagnosi nell’Exchange locale
In un ambiente ibrido, lo stesso destinatario viene verificato anche localmente. Le query distinguono tra una vera casella di posta locale, una RemoteMailbox e un MailUser:
Get-Recipient -Identity $recipient |
Format-List DisplayName,RecipientType,RecipientTypeDetails,
PrimarySmtpAddress,EmailAddresses
Get-Mailbox -Identity $recipient -ErrorAction SilentlyContinue |
Format-List RecipientTypeDetails,ServerName,Database,PrimarySmtpAddress
Get-RemoteMailbox -Identity $recipient -ErrorAction SilentlyContinue |
Format-List RecipientTypeDetails,PrimarySmtpAddress,RemoteRoutingAddress
Get-MailUser -Identity $recipient -ErrorAction SilentlyContinue |
Format-List RecipientTypeDetails,PrimarySmtpAddress,ExternalEmailAddress
Per il percorso di trasporto sono necessari i connector di invio e ricezione, nonché i log di tracking:
Get-SendConnector |
Format-List Name,Enabled,AddressSpaces,DNSRoutingEnabled,SmartHosts,
SourceTransportServers,CloudServicesMailEnabled,TlsDomain
Get-ReceiveConnector |
Format-List Identity,Enabled,Bindings,RemoteIPRanges,PermissionGroups
$servers = Get-ExchangeServer |
Where-Object { $_.IsMailboxServer -or $_.IsHubTransportServer }
$servers |
Get-MessageTrackingLog `
-Start $start `
-End $end `
-Recipients $recipient `
-ResultSize Unlimited |
Select-Object Timestamp,ServerHostname,ClientHostname,Source,EventId,
ConnectorId,Sender,Recipients,MessageId,NetworkMessageId |
Sort-Object Timestamp
Un SEND verso Exchange Online, seguito da un nuovo RECEIVE dello stesso messaggio da Exchange Online, rende visibile il ritorno. Con MessageId e NetworkMessageId si evita di confondere tra loro diversi messaggi di test.
Le cause più frequenti in sintesi
| Schema | Causa tipica | Risoluzione |
|---|---|---|
| I destinatari sconosciuti rimbalzano tra due sistemi | Il dominio accettato è impostato su InternalRelay, ma entrambe le parti inoltrano i destinatari sconosciuti | Definire una responsabilità univoca; in caso di consegna completa in EXO usare Authoritative oppure, per una split domain, definire un unico hop finale |
| EXO invia all’Exchange locale, che lo rinvia subito a EXO | Il connector ibrido o Centralized Mail Transport non corrisponde più alla posizione della casella di posta | Verificare la configurazione HCW e RouteAllMessagesViaOnPremises; disattivare il routing centrale obsoleto o correggere la risoluzione locale dei destinatari |
| Il messaggio rimbalza tra EXO e un gateway di sicurezza, firma o crittografia | I messaggi di ritorno soddisfano nuovamente la regola in uscita | Usare come eccezione l’header impostato dal gateway o il meccanismo documentato di prevenzione dei loop; autenticare in modo univoco i connector in entrata e in uscita |
| È interessato un solo destinatario | targetAddress obsoleto o errato, tipo RemoteMailbox errato o indirizzi proxy in conflitto | Determinare la Source of Authority, correggere l’oggetto destinatario lì e sincronizzarlo |
| Vengono coinvolti solo messaggi inoltrati | Una regola di trasporto, un inoltro della casella di posta o una regola Inbox indirizza nuovamente al percorso originale | Disattivare la regola, correggere la destinazione e definire un’eccezione affidabile |
| È interessato solo un sottodominio o un’applicazione | Il dominio padre non copre correttamente il sottodominio nel percorso del connector previsto | Configurare esplicitamente il sottodominio come dominio accettato e nel Send Connector appropriato |
| Tutti i messaggi vanno in loop dopo una modifica al gateway o al DNS | Lo Smart Host o l’MX punta all’ingresso del sistema mittente | Correggere il next hop e verificare separatamente le destinazioni DNS, NAT e Load Balancer |
Causa 1: tipo errato del dominio accettato
Un dominio authoritative significa: tutti i destinatari validi di questo dominio sono noti nell’organizzazione Exchange; i destinatari sconosciuti vengono rifiutati. Un dominio Internal Relay significa: una parte dei destinatari si trova in un altro sistema e deve essere inoltrata tramite un Send Connector o un Outbound Connector.
La configurazione problematica si verifica quando Exchange Online invia destinatari sconosciuti a un sistema locale e quest’ultimo non gestisce definitivamente lo stesso dominio, ma lo restituisce a Exchange Online tramite MX o Smart Host.
Get-AcceptedDomain -Identity contoso.com |
Format-List DomainName,DomainType,MatchSubDomains
Se, al termine di una migrazione, tutti i destinatari si trovano in Exchange Online, Authoritative è in genere lo stato di destinazione corretto:
# Eseguire solo dopo aver completato la verifica dei destinatari e del routing.
Set-AcceptedDomain -Identity contoso.com -DomainType Authoritative
In una vera split domain, InternalRelay può essere corretto. Tuttavia, è allora necessario un connector chiaro verso il sistema che conosce i destinatari rimanenti. Questa destinazione non deve rinviare gli indirizzi sconosciuti al punto di partenza.
Causa 2: connector ibridi sovrapposti e Centralized Mail Transport
Centralized Mail Transport instrada intenzionalmente i messaggi in uscita da Exchange Online attraverso l’Exchange locale. Ciò è utile per determinati requisiti di compliance, ma crea ulteriori percorsi di trasporto. Se l’opzione rimane attiva dopo una migrazione, benché il sistema locale invii messaggi di nuovo a Exchange Online tramite il proprio MX, può formarsi un circuito.
Get-OutboundConnector -IncludeTestModeConnectors |
Format-Table Name,Enabled,ConnectorType,RouteAllMessagesViaOnPremises,
RecipientDomains,SmartHosts,UseMXRecord -AutoSize
Devono essere verificati anche più connector con ambiti sovrapposti. Microsoft raccomanda un connector on-premises dedicato per il flusso di posta ibrido; una riparazione tramite Hybrid Configuration Wizard è spesso più sicura rispetto a singole modifiche isolate.
Se Centralized Mail Transport non è più comprovabilmente necessario, l’impostazione può essere disattivata in modo mirato:
# Solo dopo aver verificato i requisiti di compliance e del gateway.
Set-OutboundConnector `
-Identity "Outbound to On-Premises" `
-RouteAllMessagesViaOnPremises:$false
Causa 3: un gateway elabora nuovamente i propri messaggi di ritorno
In uno scenario in-and-out, Exchange Online invia un messaggio a un servizio aggiuntivo per la firma, la crittografia o l’archiviazione. Quest’ultimo lo restituisce poi a Exchange Online. La regola in uscita deve riconoscere il messaggio di ritorno; altrimenti verrà inviato nuovamente al servizio.
La verifica inizia con tutte le regole che selezionano connector, reindirizzano destinatari o valutano header:
Get-TransportRule |
Sort-Object Priority |
Format-List Name,State,Mode,Priority,FromScope,SentToScope,
RedirectMessageTo,RouteMessageOutboundConnector,
SetHeaderName,SetHeaderValue,ExceptIfHeaderContainsMessageHeader,
ExceptIfHeaderContainsWords
L’eccezione concreta deve seguire la documentazione del produttore del gateway. È comune un header impostato dal servizio che non possa essere falsificato in modo affidabile da Internet. Inoltre, gli Inbound Connector dovrebbero identificare il servizio tramite certificato o IP mittente fisso. Un’eccezione generalizzata per tutti i messaggi apparentemente «interni» è troppo ampia.
Causa 4: l’oggetto destinatario e la casella di posta effettiva non si trovano nello stesso luogo
Un oggetto può apparire in Exchange Online come MailUser, anche se la casella di posta attiva si trova localmente. In un ambiente ibrido sincronizzato, questo non è automaticamente un duplicato. Neppure una ExternalEmailAddress, che corrisponde all’indirizzo SMTP primario, dimostra da sola una configurazione errata.
È determinante la combinazione di tutte le query:
Get-Mailboxrestituisce un risultato localmente: la casella di posta attiva si trova localmente.Get-RemoteMailboxrestituisce un risultato localmente: la destinazione gestita si trova in Exchange Online.Get-EXOMailboxrestituisce un risultato: nel cloud esiste una vera casella di posta.Get-EXORecipientrestituisce solo un MailUser: l’oggetto è una destinazione di routing, non una casella di posta cloud.
Sono problematici gli oggetti obsoleti dopo una migrazione, domini di routing remoto errati o valori targetAddress impostati manualmente, il cui dominio riconduce allo stesso percorso di trasporto. Le modifiche vengono effettuate nella Source of Authority: negli ambienti sincronizzati, quindi con gli strumenti di gestione Exchange localmente e non modificando direttamente singoli attributi in Exchange Online.
Causa 5: inoltri e regole di trasporto formano un circuito
Una regola può reindirizzare dall’indirizzo A a B, mentre B invia nuovamente ad A tramite una seconda regola, un inoltro della casella di posta o un sistema esterno. Questi loop riguardano spesso solo singoli destinatari o tipi di messaggio.
Get-TransportRule |
Sort-Object Priority |
Select-Object Name,State,Mode,Priority,RedirectMessageTo,
BlindCopyTo,AddToRecipients,RouteMessageOutboundConnector
Get-Mailbox -ResultSize Unlimited |
Select-Object DisplayName,PrimarySmtpAddress,
ForwardingAddress,ForwardingSmtpAddress,DeliverToMailboxAndForward
Get-InboxRule -Mailbox user01@contoso.com |
Select-Object Name,Enabled,Priority,ForwardTo,RedirectTo,ForwardAsAttachmentTo
La risoluzione non consiste solo nel disattivare temporaneamente una regola. L’intera catena deve essere eliminata e le regole per servizi esterni necessitano di un’eccezione che riconosca con certezza i messaggi già elaborati.
Causa 6: MX, Smart Host o sottodominio punta indietro
Un gateway può richiedere internamente un next hop diverso da quello degli mittenti esterni. Se per l’inoltro usa semplicemente l’MX pubblico, quest’ultimo potrebbe puntare nuovamente al gateway stesso. Lo stesso problema si verifica quando uno Smart Host, tramite NAT o Load Balancing, riconduce al proprio listener.
Resolve-DnsName -Type MX contoso.com
Resolve-DnsName -Type MX app.contoso.com
Get-SendConnector |
Format-List Name,AddressSpaces,DNSRoutingEnabled,SmartHosts
I sottodomini meritano una verifica separata. Microsoft documenta casi in cui un sottodominio applicativo deve essere creato esplicitamente come dominio Internal Relay e sincronizzato con i sistemi Edge:
New-AcceptedDomain `
-Name "app.contoso.com" `
-DomainName app.contoso.com `
-DomainType InternalRelay
Start-EdgeSynchronization
Questi comandi non sono una correzione universale. Sono adatti solo se app.contoso.com viene effettivamente consegnato al di fuori dell’organizzazione Exchange e il Send Connector dispone di un next hop univoco.
Procedura sicura in caso di ciclo attivo
Durante l’interruzione occorre innanzitutto fermare la moltiplicazione. A seconda dell’architettura, la regola di trasporto che lo provoca o il connector specifico viene disattivato in modo controllato, oppure il gateway trattiene la coda interessata. Prima di farlo, vengono esportati configurazione ed esempi di messaggi.
Segue quindi un test con esattamente un mittente, un destinatario e un oggetto chiaramente riconoscibile. Il messaggio viene tracciato senza interruzioni attraverso header, Message Trace e log di tracking locali. Solo quando termina alla destinazione prevista, il flusso di posta viene riaperto gradualmente.
Non sono consigliati:
- aumentare i limiti di hop
- modificare contemporaneamente più connector
- commutare per tentativi i domini accettati tra
AuthoritativeeInternalRelay - reinserire ripetutamente una coda problematica senza verificarla
- correggere direttamente in AD o Exchange Online gli attributi Exchange sincronizzati
- disattivare i controlli TLS, IP o certificato come presunta soluzione rapida
Controllo finale
Dopo la correzione, la documentazione dovrebbe contenere esattamente un’affermazione per ogni dominio rilevante: quale sistema conosce il destinatario, quale connector è applicabile e quale host è il next hop finale?
Il collaudo tecnico comprende almeno:
- messaggio di test esterno e interno
- destinatario sconosciuto dello stesso dominio
- destinatario su ciascun lato di una vera split domain
- messaggio in uscita con gateway o Centralized Mail Transport attivo
- header senza sequenza di hop ricorrente
- Message Trace con
Deliveredoppure il passaggio previsto - tracking locale senza un nuovo
RECEIVEdopo unSENDverso la stessa destinazione - convalida dei connector per tutti i connector ancora necessari
Un mail loop risolto è concluso solo quando non soltanto l’e-mail di test arriva, ma anche i destinatari sconosciuti e i percorsi alternativi del flusso di posta terminano in modo definito. È proprio qui che si verificano la maggior parte delle ricadute.

Commenti
I commenti vengono caricati da GitHub / Giscus.