SPF

SPF (Sender Policy Framework, RFC 7208) — DNS-запись перечисляющая какие серверы имеют право отправлять почту от имени домена. Получатель проверяет: пришло ли сообщение от указанного IP. Первая линия защиты от подделки отправителя. Работает с 2006.

Как записывается

Обычная TXT-запись в DNS:

example.com.  IN TXT  "v=spf1 ip4:192.0.2.0/24 ip4:198.51.100.10 include:_spf.google.com ~all"

Разбор:

Механизмы

МеханизмЗначение
allСовпадает всегда. Обычно последний
ip4:1.2.3.0/24IPv4-сеть
ip6:2001:db8::/32IPv6-сеть
a / a:host.comA/AAAA-записи хоста
mx / mx:host.comMX-записи
ptr (deprecated)Rdns-имя оканчивается на этот суффикс. Не используй — медленно и небезопасно
exists:host.comA-запись существует
include:domain.comРекурсивно подтянуть SPF от domain.com

Квалификаторы

ПрефиксРезультат
+ (по умолчанию)Pass — принять
-Fail — отклонить
~SoftFail — принять, но пометить
?Neutral

Reserved 10 lookups

Ключевое ограничение SPF — не более 10 DNS-lookups при проверке. Каждый include:, a, mx, ptr, exists потребляет lookup. Превысил → PermError, письмо отклонено.

Частая ловушка — include:_spf.google.com сам по себе тратит несколько lookups. Комбо из Google + Mailchimp + SendGrid + свой сервер = легко перебор.

Инструменты проверки

$ dig +short TXT example.com | grep spf
"v=spf1 ip4:1.2.3.4 include:_spf.google.com ~all"

# Онлайн:
# https://mxtoolbox.com/spf.aspx
# https://easydmarc.com/tools/spf-lookup

# Проверить сколько lookups:
# https://www.dmarcanalyzer.com/spf/checker/

Return-Path vs From

Важно. SPF проверяет домен из envelope-from (SMTP MAIL FROM), не из заголовка From:. Это два разных поля:

SMTP:
    MAIL FROM: <bounce@service.example.com>   ← SPF проверяет этот

DATA:
    From: alice@example.com                    ← Пользователь видит этот

Отсюда phishing-технология: envelope-from от разрешённого bounce@evil.com (SPF pass), а From: подделан на ceo@bank.com. Юзер видит «CEO банка», SPF pass. Против этого — DMARC alignment.

Проблема с форвардингом

Классический сценарий:

  1. Alice шлёт с alice@example.com на bob@forward.com.
  2. Bob настроил forwarding: bob@forward.com → bob@gmail.com.
  3. Forward.com пересылает письмо, но с оригинальным Return-Path alice@example.com.
  4. Gmail проверяет SPF: пришло с IP forward.com, но envelope-from example.com. SPF fail.

Решения:

Пример конфигов

# Только один свой сервер
"v=spf1 ip4:1.2.3.4 -all"

# Google Workspace
"v=spf1 include:_spf.google.com ~all"

# Google + Mailchimp
"v=spf1 include:_spf.google.com include:servers.mcsv.net ~all"

# Домен вообще не отправляет почту
"v=spf1 -all"

Тонкости

См. также