Как написать SPF политику

Узнайте, как правильно написать/настроить SPF политику для отправки электронных писем от имени вашего домена

Каждая SPF-запись должна начинаться с v=spf1, затем последовательность механизмов (слева → направо), затем при необходимости модификаторы; проверка останавливается на первом совпадающем механизме, и итоговое действие обычно определяется механизмом all (-all, ~all, ?all).

Общая структура (порядок важен)

v=spf1  <mechanism> <mechanism> <mechanism>  [modifier]

Каждый механизм может иметь префикс квалификатора:

  • + : Pass (по умолчанию, если опущено) — принять.
  • - : Fail (жёсткий отказ) — отклонить/запретить.
  • ~ : SoftFail — принять, но пометить как подозрительное.
  • ? : Neutral — нет политики.

Примеры: -all, ~mx, ?include:example.uz.

1. Начало: версия (обязательно)

Любая SPF-запись всегда начинается с:

v=spf1

Это сообщает получателям: «это SPF версия 1». Если отсутствует — запись недействительна.

2. Механизмы — строительные блоки (синтаксис, назначение, поведение DNS-запросов)

ip4:<ip4/cidr>

  • Пример: ip4:203.0.113.5 или ip4:203.0.113.0/24.
  • Проверяет, входит ли подключающийся IPv4 в эту сеть. Если с IP 203.0.113.5 отправляется письмо от you@example.uz — оно принимается.
  • Не выполняет DNS-запросы (не учитывается в лимите 10).

Пример:

v=spf1 ip4:203.0.113.5 -all

ip6:<ip6/cidr>

  • То же самое, но для IPv6. DNS-запросы не делает.

Пример:

ip6:2001:db8::/32

a или a:<домен>

  • Пример: a или a:mail.example.uz (можно с CIDR).
  • Разрешает A/AAAA записи домена и сравнивает IP отправителя.
  • Лучше указывать адрес почтового сервера, например mail.example.uz.
  • Выполняет DNS-запросы (учитывается в лимите). Используйте ip4/ip6, если возможно.

Пример:

a:example.uz

или просто a (проверяет A/AAAA записи зоны).

mx или mx:<домен>

  • Пример: mx или mx:example.uz.
  • Проверяет MX записи, затем их A/AAAA. Совпадение = разрешено.
  • Лучше указывать корневой домен (example.uz).
  • Выполняет DNS-запросы.

include:<домен>

  • Пример: include:_spf.google.com.
  • Подтягивает SPF указанного домена. Если тот даёт Pass — совпадение.
  • Делает DNS-запросы, может раскрыться в дополнительные (считается в лимит 10). Избегайте лишних include.

exists:<домен>

  • Пример: exists:%{i}._spf.example.uz (поддерживает макросы).
  • Проверяет, существует ли A запись для домена. Считается в лимит.

all

  • Совпадает со всеми. Обычно в конце с квалификатором:
    • -all = жёсткий отказ (всё остальное отклонить).
    • ~all = мягкий отказ (принять, но пометить).
    • ?all = нейтрально (нет политики).
  • DNS-запросы не выполняет. Использовать осторожно.

3. Модификаторы

redirect=<домен>

  • Передаёт проверку SPF другому домену, если ничего не совпало.
  • Работает только после механизмов.
  • Если есть all — redirect не применяется.

exp=<домен>

  • Возвращает человекочитаемое объяснение при FAIL.
  • Запрос exp выполняется после проверки и не учитывается в лимите 10.

Жёсткое правило: лимит 10 DNS-запросов

SPF ограничивает механизмы/модификаторы, требующие DNS-запросов, до 10. Если больше — PermError (ошибка SPF).
Считаются: include, a, mx, ptr, exists, redirect.
Не считаются: ip4, ip6, all, exp.

Алгоритм проверки

  1. Сервер получает TXT для example.uz.
  2. Парсит SPF строку (должна быть одна).
  3. Проверяет механизмы слева → направо.
  4. Если совпало — возвращает результат (PASS/FAIL/...).
  5. Если нет и есть redirect → проверяет его.
  6. Если нет redirect → ?all (нейтрально).
  7. Если более 10 запросов → PermError.

Практические примеры

Запретить всё (базовый вариант)

v=spf1 -all

Один сервер (IP)

v=spf1 ip4:203.0.113.5 -all

Сервер использует A/MX и Google Workspace

v=spf1 a mx include:_spf.google.com -all

Несколько сторонних сервисов

v=spf1 include:_spf.google.com include:spf.sendgrid.net include:mailgun.org -all

Тестовый режим (мягкий отказ)

v=spf1 ip4:203.0.113.5 ~all

Типичные ошибки

  • Более 10 запросов → PermError. Решение: уменьшить include, заменить a/mx на ip4/ip6.
  • Несколько SPF TXT → запись недействительна.
  • +all или отсутствие all → позволяет спуфинг.
  • ptr → медленно, ненадёжно. Избегайте.
  • Не согласовано с DMARC → SPF может пройти, но DMARC упадёт. Всегда используйте DKIM+SPF+DMARC.

Дополнительно

  • redirect= полезен для множества поддоменов.
  • exp= редко используется, но может пояснить причину FAIL.

Чек-лист

  • Одна TXT строка с v=spf1.
  • Только реальные IP/хосты.
  • Подсчитайте запросы ≤ 10.
  • Начинайте с ~all, затем переходите на -all.
  • Используйте DKIM + DMARC.