uCheckeruChecker
10 мин чтения

Как пересылка email ломает аутентификацию

Вы настроили SPF, DKIM и DMARC, всё проходит проверки. Потом один получатель пересылает ваше письмо на другой ящик, и аутентификация ломается. Письмо уходит в спам или вовсе отклоняется. Это не ошибка в вашей настройке. Так устроена пересылка, и проблему эту знают с тех пор, как придумали сами протоколы аутентификации.



Что происходит при пересылке письма

Вы настроили SPF, DKIM, DMARC. Всё проходит проверки. Потом получатель пересылает ваше письмо на другой ящик - и аутентификация ломается. Письмо попадает в спам или отклоняется. Это не баг вашей настройки. Так работает пересылка, и это известная проблема со времён появления протоколов аутентификации.

Есть два типа пересылки. Серверный редирект — промежуточный сервер принимает письмо и отправляет дальше, не меняя заголовок From. Конверт (MAIL FROM) меняется на адрес пересылающего сервера. Тело может быть изменено: добавлены подписи, перекодированы MIME-части, переписаны ссылки. Ручная пересылка — пользователь нажимает «Переслать» в почтовом клиенте. Создаётся новое письмо с новым конвертом. С точки зрения аутентификации это совершенно другое сообщение. Проблему создаёт именно серверный редирект.

SPF: ломается первым

SPF проверяет IP отправителя по DNS-записи домена конвертного адреса. Когда сервер B пересылает письмо, отправленное сервером A, получающий сервер C видит подключение с IP сервера B. Этого IP нет в SPF-записи исходного домена. Результат: SPF fail.

Некоторые пересылающие серверы используют SRS (Sender Rewriting Scheme) - перезаписывают конвертный адрес на свой домен. Это решает проблему SPF, но ломает alignment для DMARC: SPF теперь проходит для домена пересылателя, а не для домена в заголовке From.

DKIM: выживает, но не всегда

DKIM подписывает заголовки и тело сообщения. Подпись привязана к содержимому, а не к IP. Если письмо не было изменено при пересылке, подпись остаётся валидной. Принимающий сервер проверяет её через DNS исходного домена - проходит.

Но «не было изменено» - сильное допущение. На практике пересылающие серверы часто модифицируют письмо: списки рассылки добавляют префикс в тему и футер в тело, корпоративные шлюзы дописывают юридические дисклеймеры, системы безопасности перезаписывают ссылки для проверки при клике. Любое такое изменение инвалидирует хеш тела в DKIM-подписи.

DMARC: каскадный отказ

DMARC требует, чтобы хотя бы один протокол (SPF или DKIM) прошёл проверку и совпал с доменом в заголовке From. После пересылки SPF провален или совпадает с чужим доменом (SRS). DKIM - либо прошёл (если тело не трогали), либо провален.

Если DKIM проходит, DMARC тоже проходит - домен в подписи (d=) совпадает с From. Это единственный сценарий, где пересылка не ломает аутентификацию. Во всех остальных случаях - DMARC fail. При политике p=reject письмо будет отброшено, и вы как отправитель можете об этом не узнать.

ARC: протокол для решения проблемы

Authenticated Received Chain (ARC, RFC 8617) создан специально для пересылки. Каждый промежуточный сервер записывает состояние аутентификации на момент получения и подписывает эту запись. Формируется цепочка доверия.

ARC добавляет три заголовка на каждом хопе: ARC-Authentication-Results (результаты проверки), ARC-Message-Signature (DKIM-подобная подпись сообщения) и ARC-Seal (подпись поверх всех предыдущих ARC-заголовков).

Gmail, Microsoft 365 и Yahoo учитывают ARC при принятии решений о доставке пересланных писем. Но ARC - не гарантия. Принимающий сервер сам решает, доверять ли промежуточному узлу. И не каждый пересылатель поддерживает ARC.

Списки рассылки: самый тяжёлый случай

Mailman, Google Groups, LISTSERV - самые агрессивные пересылатели. Они добавляют префикс в тему, меняют Reply-To, дописывают футер с инструкцией по отписке, иногда полностью перезаписывают From. Это ломает и DKIM (тело изменено), и SPF (другой IP), и DMARC (оба протокола провалены).

Типичное решение: софт списка рассылки перезаписывает From на свой домен, а оригинального отправителя помещает в Reply-To. Mailman 3 и Google Groups делают это по умолчанию, когда у домена отправителя строгая политика DMARC. Работает, но получатели видят не тот адрес, который ожидают.

Что может сделать отправитель

Вы не контролируете, что происходит с письмом после отправки. Но можно снизить ущерб.

  • Правильно подписывайте DKIM. Ключ 2048 бит. Подписывайте заголовки From, To, Subject, Date, MIME-Version, Content-Type. Не подписывайте заголовки, которые промежуточные серверы часто меняют.
  • Не используйте тег l= в DKIM без острой необходимости. Он позволяет добавлять контент в конец тела без поломки подписи, но создаёт дыру для атакующих.
  • Анализируйте DMARC-отчёты. Aggregate-отчёты показывают, с каких IP идут отправки и прошла ли аутентификация. Постоянные failure с IP известных пересылающих сервисов - это пересылка, а не спуфинг.
  • Повышайте политику DMARC постепенно. От p=none к p=quarantine; pct=10, затем увеличивайте pct неделями. Это ограничивает радиус поражения при проблемах с пересылкой.

Главный вывод: DKIM - единственный протокол, который может пережить пересылку. Если DKIM проходит, DMARC проходит через DKIM alignment. Если DKIM ломается, вы зависите от того, доверяет ли принимающий сервер ARC-цепочке. А это вне вашего контроля.

Как диагностировать сбой при пересылке

Когда получатель жалуется на пропавшие письма, попросите его открыть исходные заголовки. Смотреть надо вот на что.

# Смотрим результаты аутентификации
Authentication-Results: ...
  spf=fail ...
  dkim=fail (body hash did not verify) ...
  dmarc=fail ...

# Ищем ARC-заголовки: если они есть, промежуточный узел
# пытался сохранить результат проверки
ARC-Authentication-Results: i=1; ...
  spf=pass ...
  dkim=pass ...

# По Received-заголовкам восстанавливаем маршрут
Received: from forwarder.net (203.0.113.50) by mx.destination.com ...
Received: from mta.original-sender.com (198.51.100.25) by forwarder.net ...

Если ARC-заголовки есть, на первом переходе всё прошло, а у адресата провалилось, пересылающий сервер свою часть работы сделал. Принимающая сторона не доверилась цепочке ARC или не поддерживает её вовсе.

Если ARC-заголовков нет, пересылающий сервер про ARC не знает. Результат проверки с первого перехода потерян целиком.

Насколько это массовая история

Пересылка встречается сплошь и рядом. Выпускники вузов держат университетский адрес с переадресацией на личный Gmail или Outlook. Малый бизнес заводит почту на домене, которая уходит в общий ящик. Люди настраивают автопересылку между своими аккаунтами. Системные администраторы прописывают правила ретрансляции на шлюзе.

Google в своём разборе внедрения DMARC писал, что пересылка это главная причина ложных провалов DMARC. Если вы пишете B2B-аудитории в вузах или в корпоративной среде, рассчитывайте, что от 5 до 15% получателей увидят ваше письмо минимум через один переход пересылки.

Для отправителя со строгой политикой DMARC это значит, что заметная доля законных получателей может писем не увидеть. Спасает только целый DKIM и маршрут, который не переписывает тело письма.

Что происходит с протоколами после пересылки

Протокол
Пересылка без изменений
Тело письма изменено
SPF
Провал (другой IP)
Провал (другой IP)
SPF + SRS
Проходит (конверт переписан)
Проходит (конверт переписан)
DKIM
Проходит (подпись цела)
Провал (хеш тела не сошёлся)
DMARC через SPF
Провал (после SRS нет выравнивания)
Провал (после SRS нет выравнивания)
DMARC через DKIM
Проходит (d= совпадает с From)
Провал (DKIM сломан)
ARC
Сохраняет исходный результат
Сохраняет исходный результат

Главное отсюда: DKIM это единственная реальная защита от срыва аутентификации при пересылке. Держится DKIM, значит DMARC проходит по выравниванию через него. Сломался DKIM, и вы целиком зависите от того, доверится ли принимающий сервер цепочке ARC, а на это вы повлиять не можете.

Аутентификация - не единственный фактор

Пересылка может сломать SPF и DKIM. Но если в вашей базе 15% невалидных адресов, ни один протокол не спасёт репутацию домена. Высокий bounce rate + DMARC failure от пересылок - и провайдеры начинают фильтровать даже прямые доставки.

Прежде чем разбираться с пересылками, убедитесь, что база чистая. Загрузите список в uChecker, увидите мёртвые адреса, ловушки и рискованные контакты за минуты. Чистая база даёт вам запас прочности, когда пересылка ломает часть проверок.

пересылка emailSPF failDKIM forwardingARC протоколDMARC alignmentemail аутентификация