Технология SPF

При создании протокола передачи электронной почты (SMTP), процесс идентификации отправителя играл далеко не первоочередную роль, в результате чего отправителя письма стало очень легко подменить.
Такой обман стали называть Спуфингом (e-mail spoofing), и для борьбы с этим явлением, был разработан и введен в действие стандарт SPF – Sender Policy Framework (структура политики отправителя).

Размещая SPF-запись в домене, администратор домена определяет список хостов, которым разрешено/запрещено отправлять почту от имени данного домена.
Прочитав ее содержимое, сервера принимающей стороны легко отделяют авторизованные хосты от хостов, которым не разрешено посылать почту от имени этого домена.
Наличие корректной SPF-записи улучшает доставляемость писем и помогает повысить уровень доверия к электронной почте, приходящей с email-адресов ваших доменов.

Как происходит проверка

Во время передачи email-сообщения от одного сервера к другому, сервер передающей стороны в сеансе передачи сообщения сообщает принимающей стороне email-адрес отправителя.
Принимающий сервер извлекает из этого email почтовый домен, и через систему DNS пытается получить запись определенного формата (SPF-запись) в домене отправителя.
Если такая запись будет найдена и она будет валидной, сервер принимающей стороны сравнит IP-адрес и/или имя сервера отправителя с указанными в этой строке механизмами по порядку до первого совпадения, определяя, разрешено ли данному серверу отправлять почту от имени домена.

Таким образом, для растройки SPF-аписи в своем домене, администратору домена достаточно определить список серверов, которым он разрешает отправку email этого домена, правильно сформировать SPF-запись и прописать ее в панели управления DNS-записями своего домена. Важно сделать это максимально аккуратно, чтобы случайно не заблокировать отправку нужной корреспонденции.
Вы всегда можете посмотреть содержимое своей или чужой SPF-записи с помощью нашего инструмента проверки.
А если вы новичок в SPF, мы можем помочь вам создать нужную запись с помощью нашего конструктора SPF-записи.

Итак, SPF-запись состоит из специальных дериктив, называемых "механизмами" или "модификаторами", разделенных пробелами.

Префиксы

Каждый механизм описывает один или несколько хостов, идентифицируемых тем или иным способом, и предваряется одним из четырех префиксов:
+ Pass Разрешить прием писем
- Fail Запретить прием писем
~ SoftFail Письма должны быть приняты, но помечены как спам
? Neutral Письма должны быть приняты, с нейтральным статусом

Если хост попадает в один из механизмов проверки, представленных в SPF-записи, он будет обработан с помощью префикса, стоящим перед совпавшим механизмом. Если префикс не указан в явном виде, по умолчанию, он будет + (т.е. Pass).

Механизмы проверки, указанные в SPF-строке, оцениваются по порядку, до первого совпадения.

Если хост не попадает ни в один из механизмов проверки, представленных в SPF-записи, он будет обработан с помощью префикса ? (Neutral).

Если SPF-запись в домене не найдена (не опубликована), результатом проверки всегда будет None.

Если во время обработки ДНС-запроса возникнет временная ошибка, результатом обработки будет TempError.
Если в SPF-записи будут синтаксические ошибки, или будут присутствовать неизвестные тэги, результатом обработки будет PermError.
Дополнительными ограничениями для SPF-записи являются длина записи (не более 512 байт), и вложенность запросов (не более 10), которые должны быть выполнены для полного преобразования всех механизмов и модификаторов в IP-адреса. Если данные условия не выполняются, результатом обработки такой SPF-записи будет PermError.

Механизмы

all
Механизм all будет выдавать положительное совпадение с любым хостом. Любые механизмы, стоящие после all не обрабатываться, и будут проигнорированы.
Использование механизма all с префиксом + не рекомендуется, т.к. такая запись будет разрешать отправку почты абсоютно с любого хоста.
Некоторые почтовые системы, видя all с любыми префиксами, отличными от "~" и "-", намеренно понижают статус писем с таких доменов, доводя их до уровня спама.
Примеры:
“v=spf1 mx ~all”
Разрешить MX-хостам текущего домена отправлять почту, остальным - запретить.
“v=spf1 -all”
Запретить всем хостам отсылать почту.
“v=spf1 +all”
Разрешить отправку почты с любого хоста.
Формально, запись корректная, но использование такой записи крайне не рекомендуется.
ip4
Синтаксис:
ipv4:<ip4-address>
ipv4:<ip4-address>/<prefix-length>
Аргументом механизма ipv4 является диапазон IP-адресов формата IPv4.
Если конструкция /<prefix-length> не указана, по умолчанию, будет использована маска /32, указывающая на единичный IP-адрес.
Указывая <prefix-length> менее 16, будьте очень мнимательны, т.к. это будет указывать на очень большие сети, и может очень сильно повлиять на доставляемость вашей электронной почты.
В составе <ip-address> должны быть указаны все части адреса. Например, нельзя указывать 192.168.1/24 , необходимо указывать 129.168.1.0/24.
Примеры:
“v=spf1 ip4:192.168.1.0/16 -all”
Разрешить отправлять почту с IP-адресов в дапазоне 192.168.1.0/16, остальным - запретить.
ip6
Синтаксис:
ipv6:<ip6-address>
ipv6:<ip6-address>/<prefix-length>
Аргументом механизма ipv6 является диапазон IP-адресов формата IPv6.
Если конструкция /<prefix-length> не указана, по умолчанию, будет использована /128, указывающая на единичный IP-адрес.
Примеры:
“v=spf1 ip6:1080::8:800:68.0.3.1/96 ~all”
Разрешить отправлять почту с IP-адресов в дапазоне 1080::8:800:68.0.3.1/96, с остальных - принимать с пометкой "спам".
a
Синтаксис:
a
a/<prefix-length>
a:<domain>
a:<domain>/<prefix-length>
Разрешает отправку почты с хостов описанных A-записью для <domain>. Если таких записей несколько, будут обработаны все записи. Если задан /<prefix-length>, найденные IP-адреса будут расширены до IP-диапазонов с соответствующей маской.
Если <domain> не указан, выполняется поиск A-записи для текущего домена.
Примеры:
“v=spf1 a ~all”
Разрешить отправлять почту с IP-адресов, которые будут определены для A-записи текущего домена, с остальных - принимать с пометкой "спам".
“v=spf1 a:otherdomain.ru ~all”
Разрешить отправлять почту с IP-адресов, которые будут определены для A-записи домена otherdomain.ru, с остальных - принимать с пометкой "спам".
mx
Синтаксис:
mx
mx:<prefix-length>
mx:<domain>
mx:<domain>/<prefix-length>
Разрешает отправку почты с хостов описанных MX-записью для <domain>. Если таких записей несколько, будут обработаны все записи. Если задан /<prefix-length>, найденные IP-адреса будут расширены до IP-диапазонов с соответствующей маской.
Если <domain> не указан, выполняется поиск MX-записи для текущего домена.
Примеры:
“v=spf1 mx -all”
Разрешить отправлять почту с IP-адресов, которые будут определены для MX-записей текущего домена, для остальных - запретить.
“v=spf1 mx:otherdomain.ru -all”
Разрешить отправлять почту с IP-адресов, которые будут определены для MX-записей домена otherdomain.ru, с остальных - запретить.
include
Синтаксис:
include:<domain>
Включет в обработку другие TXT-записи, указанные в качестве аргумента.
Примеры:
“v=spf1 include:bigsender.ru -all”
Разрешить отправлять почту с IP-адресов, которые описаны в SPF-записи домена bigsender.ru, для остальных - запретить.
Если в домене bigsender.ru нет SPF-записи, результатом работы будет PermError.
exists
Синтаксис:
exists:<domain>
Для указанного <domain> выполняется запрос A-записи. Если запрос завершится успехом (не важно с каким IP), данный механизм будет считаться успешно пройденным.
Данный механизм часто используется с макросами подстановки, которые мы не будем рассматривать.
Примеры:
“v=spf1 exists:example.ru -all”
Разрешить отправлять почту с любого IP-адреса, пока успешно резолвится запись example.ru.
redirect
Синтаксис:
redirect=<domain>
SFP-запись, указанная в качестве аргумента, заменяет текущую SPF-запись.
Если используется механизм redirect, строка не должна включать в себя механизм all.
Если они будут указаны одновременно, механизм redirect будет проигнорирован.
Если указано несколько модификаторов redirect, исполнен будет только первый, остальные будут проигнорированы.
Примеры:
“v=spf1 redirect=example.ru”
Если example.ru не имеет SPF-записи, произодет ошибка и результат проверки будет unknown.
Если example.ru имеет SPF-запись, то будет обработано ее содержимое, как если бы оно было указано в SPF-записи текущего домена.
exp
Синтаксис:
exp=<domain>

Если сервер получателя отклоняет сообщение, он может показать отправителю объяснение проблемы.
Публикация тэга exp как раз является той строкой, которая будет показана.
Например, Таким образом можно направить пользователя на web-страницу, объясняющую правильные способы аунтификации.

Агрумент тэга exp может содержать только печатные символы ASCII.