Как работает проверка SPF
Наш сервер запрашивает у публичного резолвера Cloudflare TXT-записи домена и выбирает ту, что начинается с v=spf1. Затем он ищет запись SPF каждого домена, указанного в include или redirect, и доменов, которые указаны в них, — не более 20 записей и шесть уровней вложенности, как это сделал бы принимающий почтовый сервер. К самим почтовым серверам он не подключается.
Каждый элемент разбирается по правилам RFC 7208. Получатель сверяет адрес сервера, отправившего письмо, с элементами слева направо; решает первый совпавший, а его квалификатор определяет результат: + пройдено, - отказ, ~ мягкий отказ, ? нейтрально. Элемент без квалификатора означает «пройдено».
Элементы include, a, mx, ptr, exists и redirect стоят по одному запросу DNS, как и те, что находятся внутри каждой подключённой записи. RFC 7208 допускает 10 за проверку: если больше, получатель останавливается, и SPF не проходит для всей почты домена. ip4, ip6 и all ничего не стоят. В режиме вставки запись читается в вашем браузере, поэтому считаются только её собственные запросы.
Механизмы и квалификаторы SPF
Элементы, которые может содержать запись SPF, что соответствует каждому и сколько из 10 запросов он стоит:
| Элемент | Совпадает, когда отправляющий сервер… | Запросы |
|---|---|---|
ip4 | имеет адрес IPv4 из указанного адреса или диапазона, например ip4:192.0.2.0/24. | 0 |
ip6 | имеет адрес IPv6 из указанного адреса или диапазона, например ip6:2001:db8::/32. | 0 |
a | имеет адрес из записи A или AAAA домена (этого домена или a:other.example). | 1 |
mx | является одним из почтовых серверов домена (его записи MX). | 1 |
include | проходит по записи SPF другого домена, обычно почтового сервиса. | 1 + запросы его записи |
exists | делает так, что существует имя, которое получатель составляет из письма; для особых случаев. | 1 |
ptr | имеет имя в обратном DNS внутри домена. Не используйте: медленно и ненадёжно. | 1 |
all | любой сервер. Ставится последним: определяет, что происходит с каждым сервером, которого нет в списке. | 0 |
redirect= | разрешён записью другого домена; используется, если в этой записи ничего не совпало. | 1 + запросы его записи |
exp= | никогда: он только указывает текст, объясняющий отказ. | 0 |
Квалификаторы
- + пройдено (по умолчанию, если ничего не написано): серверу отправлять можно.
- - отказ: серверу отправлять нельзя; получатели могут отклонить письмо.
- ~ мягкий отказ: скорее всего, нельзя; письмо принимается, но считается подозрительным.
- ? нейтрально: без вердикта, как будто записи SPF нет.
Пример
example.com публикует «v=spf1 ip4:192.0.2.10 mx include:spf.mailer.example ~all». Элемент ip4 запросов не требует, mx стоит один запрос, а include — один запрос плюс то, что нужно записи spf.mailer.example. Эта запись — «v=spf1 ip4:198.51.100.0/24 include:spf2.mailer.example -all»: ещё один запрос, а spf2.mailer.example перечисляет только диапазоны адресов. Итого 3 из 10. Письмо с 192.0.2.10 проходит на первом элементе; письмо с 203.0.113.5, которого нет ни в одном элементе, доходит до ~all и получает мягкий отказ: его обычно принимают, но считают подозрительным.
Вопросы
Что такое запись SPF и как её проверить?
SPF (Sender Policy Framework) — это TXT-запись в DNS домена, которая начинается с v=spf1 и перечисляет серверы, которым разрешено отправлять почту от его имени. Чтобы проверить её, введите домен выше: инструмент найдёт запись, пройдёт по её include и покажет, что означает каждый элемент и что не так. Чтобы проверить запись до публикации, переключитесь в режим вставленной записи.
Как исправить ошибку «слишком много запросов DNS» в SPF?
SPF допускает 10 запросов DNS за одну проверку: считается каждый include, a, mx, ptr, exists и redirect, в том числе внутри подключённых записей. Если больше 10, проверка заканчивается постоянной ошибкой (permerror). Удалите include сервисов, которыми больше не пользуетесь, замените a и mx на адреса ip4 и ip6, которые за ними стоят, а массовую рассылку отправляйте с поддомена с собственной записью SPF. Помогает и «сплющивание» (flattening — копирование адресов сервиса в вашу запись), но запись устаревает, когда сервис меняет адреса.
Может ли у домена быть две записи SPF?
Нет. Домен может публиковать только одну TXT-запись, которая начинается с v=spf1. Если их две, получатели возвращают постоянную ошибку, и SPF не проходит для всей почты. Объедините их: оставьте одну v=spf1, поместите в неё элементы обеих и закончите одним ~all или -all. У поддоменов свои записи, они не считаются.
Чем отличается ~all от -all?
-all (отказ) сообщает получателям, что почта с серверов, которых нет в списке, не разрешена и может быть отклонена. ~all (мягкий отказ) говорит, что она, скорее всего, не разрешена: её обычно принимают и помечают как подозрительную. При включённом DMARC получатели в любом случае следуют политике DMARC, поэтому чаще выбирают ~all; -all подходит домену, который вообще не отправляет почту. Избегайте ?all и +all: они ничего не защищают.
Защищает ли SPF адрес в From, который видят люди?
Сам по себе нет. SPF проверяет домен адреса возврата (Return-Path), которого люди не видят, поэтому злоумышленник может пройти SPF со своим доменом и при этом показывать в From ваш. DMARC закрывает эту лазейку: он требует, чтобы SPF или DKIM проходили для домена в строке From. Проверка DMARC покажет, так ли это у вас.