Skip to main content
email·digit

Unknown IPs in your DMARC report: spoofing or a forgotten sender?

An IP you do not recognize in your DMARC report is usually one of four things: a service that sends as you which nobody set up properly, a forwarder or mailing list, a server of your own that is misconfigured, or a spoofer. You can tell them apart with a reverse DNS lookup, an owner lookup, the volume, and whether DKIM passed for your domain.

The four usual answers

SourceWhat it looks likeWhat to do
A service you forgotSteady volume from a known provider's network; fails alignmentAuthorize it on your domain
A forwarder or mailing listSmall volume from a university, ISP or list host; SPF fails, DKIM often passesUsually nothing
Your own serverAn IP in your own range or cloud account; fails bothFix it, or route it through an authorized sender
A spooferBursts from unrelated networks; fails both; no DKIM for your domainLet your DMARC policy handle it

How to tell them apart

1. Look up the reverse DNS (PTR) record

The PTR record often names the owner outright:

$ dig -x 198.51.100.24 +short
mail-out-24.sender.example.net.

A hostname under a sending provider's domain points to a service. A hostname under a residential ISP, or no PTR at all, points to something else.

2. Look up who owns the network

A WHOIS or ASN lookup tells you which organization holds the IP range. If the owner is a CRM, a help desk, a billing tool or a cloud host that your team uses, start there.

$ whois 198.51.100.24 | grep -i -E "orgname|org-name|netname"
OrgName:  Example Sender Inc.

3. Read the volume and the pattern

A forgotten service sends every day, often in amounts that match something real: invoices, password resets, support replies. Forwarders show up as a trickle. Spoofing tends to come in bursts from many unrelated networks, then stop.

4. Check whether DKIM passed for your domain

This is the strongest signal. A spoofer cannot produce a valid DKIM signature with d=example.com without your private key. If the record shows DKIM passing for your own domain, the mail almost certainly started at one of your real senders.

5. Compare header_from with envelope_from

The envelope_from (the Return-Path domain) often names the real sender. If it is a provider's bounce domain, that provider sent the mail. If it is your domain but SPF still fails, the mail was probably forwarded.

<row>
  <source_ip>203.0.113.7</source_ip>
  <count>12</count>
  <policy_evaluated>
    <disposition>none</disposition>
    <dkim>pass</dkim>               <!-- signature survived -->
    <spf>fail</spf>                 <!-- forwarder's IP is not in your SPF -->
  </policy_evaluated>
</row>
<identifiers>
  <header_from>example.com</header_from>
  <envelope_from>example.com</envelope_from>
</identifiers>
<auth_results>
  <dkim><domain>example.com</domain><selector>s1</selector><result>pass</result></dkim>
  <spf><domain>example.com</domain><result>fail</result></spf>
</auth_results>

This is the classic forwarding pattern: your domain in both identifiers, SPF failing because the forwarding server is not in your SPF record, and DKIM passing because the message was not changed.

What to do about each one

A service you forgot: authorize it

Add the service's SPF include to your record and turn on DKIM signing with your own domain in the service's settings. DKIM matters more: it survives forwarding, and it aligns even when the service uses its own bounce domain.

example.com.  TXT  "v=spf1 include:_spf.example.net include:spf.example.org ~all"

Each include costs DNS lookups, and SPF allows ten in total. Past that, SPF returns an error, so remove includes for services you no longer use.

A forwarder or mailing list: usually leave it

You cannot add every forwarder in the world to your SPF record, and you should not try. A forwarder that keeps the message intact keeps your DKIM signature valid, so the mail still passes DMARC. Mailing lists that add a footer or change the subject break DKIM too. Receivers often recognize this and report a forwarded or mailing_list reason in policy_evaluated. Making sure all your legitimate mail is DKIM signed with your own domain is the defense here.

Your own server: fix it

A web server sending contact form notifications, a printer that emails scans, an old app on a virtual machine. Either authorize it (SPF plus DKIM on your domain) or, better, send through a service you have already set up.

A spoofer: let the policy do its job

There is nothing to reply to and nobody to contact. Your DMARC policy is the tool: under p=quarantine or p=reject, receivers that honor it send failing mail to spam or refuse it.

Stay on p=none while you investigate

Under p=none, receivers report but do not act, so a service you have not authorized yet keeps delivering while you find it. Moving to reject before you have accounted for every legitimate source is how invoices and password resets quietly stop arriving.

  1. Stay on p=none and read a few weeks of reports.
  2. Authorize or fix every legitimate source until it passes aligned.
  3. Move to p=quarantine. Watch the reports for anything legitimate that now fails.
  4. Move to p=reject.

If you have not read a report before, start with how to read a DMARC report. To see your sources grouped in plain English, paste the XML into the free DMARC report analyser or upload the .xml file: no account, no cap. Email Digit can also manage this for domains you send from: you publish four DNS records once, then rotate keys in one click and step up DMARC when your reports say it is safe, without editing DNS again.