ARC sealing (forwarded mail)
Purpose. Mail this server forwards — through an alias with a remote destination, or a mailbox forwarder — arrives somewhere else having been relayed by us. SRS (SRS — sender rewriting for forwarded mail) keeps SPF passing across that hop, but any change to the message on the way through breaks the sender’s original DKIM signature and with it DMARC alignment. ARC (RFC 8617) records how the message authenticated when it reached us and signs that record, so the destination can see the original result and who is vouching for it.
Behaviour.
- Rspamd’s
arcmodule seals inbound mail — the mail that may be forwarded. Three headers are added on arrival and travel with the message when Postfix relays it:ARC-Authentication-Results(how it authenticated here),ARC-Message-Signature(the message as we saw it) andARC-Seal(chaining the two). A second forwarder adds its own set ati=2, and so on. - The seal is signed with the domain’s existing DKIM key — same key, same
ms<yyyymm>selector (with a letter after it,ms202610b, for a second rotation in one month), same published TXT record. There is no ARC key, no ARC DNS row and no ARC rotation: an ARC verifier looks up<selector>._domainkey.<domain>, which is exactly what DNS records & live verification already generates and verifies for DKIM. ARC starts working when DKIM does, which is the moment a domain is created. - The sealing identity is the local recipient domain (
use_domain = "recipient") — the domain doing the forwarding, and the one whose key we hold. The template also setsuse_esld = true, so rspamd may reduce that domain to its registrable domain before looking up the key: mail for a hosted subdomain such aslists.example.commay then be sealed withexample.com’s key whenexample.comis hosted here too, and go unsealed when it is not, becausetry_fallback = false. That is read from the configuration and not yet measured for ARC; DKIM signing with the same setting was measured using the subdomain’s own key (DKIM signing). - Mail the server originates (authenticated submission, webmail, locally generated) is not sealed. It carries a DKIM signature of its own; an ARC set would assert nothing more.
- ARC verification is separate and was already running before sealing was configured: rspamd scores
ARC_ALLOW/ARC_REJECT/ARC_NAon stock defaults for every message. Nothing in this feature changes how an incoming chain is scored.
Configuration. None. local.d/arc.conf is rendered from the server configuration like every other daemon
file and there is nothing to set — no admin action, no DNS to publish, no per-domain switch. A domain with no
DKIM key is simply not sealed (try_fallback = false), which cannot happen in practice because domain
creation rotates a key. With an outbound relay configured, the seal’s message signature leaves out Date and
Message-ID, because a forwarded message leaves through the relay too and a relay such as SES overrides both, which
breaks the seal (arc=fail) at the next hop; without a relay Rspamd’s default list applies (DKIM signing).
Limits & edge cases.
-
Sealing only applies to mail from outside
local_addrs.sign_inboundmeans “not from a local network”, andoverride.d/options.inclists the loopback, the stack’s own Compose subnet and the configured trusted networks (Relaying & trusted networks). On a real server every internet sender is outside them, so this is invisible — but it makes ARC hard to observe by sending from the Docker host: on Linux the host reaches a published port as the bridge gateway, which is inside the Compose subnet and therefore treated as local. To check sealing on a running stack, drive rspamd directly with an address it will treat as external:Terminal window docker exec mailserver-rspamd-1 rspamc --ip 203.0.113.5 \--from someone@remote.example --rcpt bob@yourdomain.test symbols /tmp/probe.eml# Symbol: ARC_SIGNED (0.00)[yourdomain.test:s=ms202608:i=1]Write a message to
/tmp/probe.emlinside the container first, as Per-domain and per-mailbox spam settings does. -
A rotation keeps old seals verifiable for 30 days, the same overlap window that protects in-flight DKIM signatures — the retired selector’s TXT record stays published (DKIM signing).
-
Multi-recipient inbound mail is sealed once, under whichever local recipient domain rspamd picks.
-
We do not (yet) let a trusted ARC chain override a DMARC failure on mail we receive. That is a separate decision about which forwarders to trust and is not taken.
-
ARC does not rescue a message whose content is what receivers object to. It preserves an authentication result; it does not vouch for the mail.