Гид по технологиям

Как реализовать SPF в Postfix

7 min read Почтовая безопасность Обновлено 24 Nov 2025
Как реализовать SPF в Postfix
Как реализовать SPF в Postfix

Version 1.0
Author: Falko Timme

Введение

Это руководство показывает, как внедрить SPF (Sender Policy Framework) в установку Postfix 2.x с минимальными изменениями в самих бинарных файлах Postfix. SPF — открытый стандарт, который позволяет серверам-получателям проверять, разрешено ли отправителю отправлять почту от имени домена-отправителя (подробнее: http://www.openspf.org/Introduction).

Мы будем использовать пакет postfix-policyd-spf-perl с сайта OpenSPF. Это Perl-реализация policy-daemon, которая не требует перекомпиляции Postfix и подходит для существующих инсталляций.

Определение: SPF — механизм, который сравнивает IP-адреса отправителей с теми, что явно разрешены в DNS TXT-записи домена.

Важно: это не единший способ. Существуют и другие реализации (milter-решения, плагины), но описанный метод минимален и проверен в боевых системах.

Что потребуется

  • Доступ к серверу с установленным Postfix (root/sudo).
  • Подключение к интернету для загрузки модулей CPAN и пакета policyd-spf-perl.
  • Умение редактировать /etc/postfix/master.cf и /etc/postfix/main.cf.

Ключевые понятия:

  • policy-daemon — внешняя служба, с которой Postfix спрашивает «разрешать ли доставку» для конкретного SMTP-диалога;
  • HELO/MAIL FROM — две идентичности, которые SPF может проверять (helo и mfrom).

1 Предварительная заметка

Предполагается, что Postfix уже настроен и работает. Инструкция распределенно-независима, должна работать на любой Linux-системе; автор тестировал на Debian Etch.

2 Установка необходимых Perl-модулей

postfix-policyd-spf-perl зависит от модулей Mail::SPF и NetAddr::IP. Установим их через CPAN.

Откройте Perl shell:

perl -MCPAN -e shell

При первом запуске CPAN задаст вопросы: обычно достаточно принимать значения по умолчанию и выбирать ближайшие зеркала.

Затем установим Mail::SPF:

install Mail::SPF

Если установка остановится из‑за зависимости Module::Build, выйдите из CPAN (q), запустите shell снова и повторите установку. Часто второй запуск успешно завершает установку и подтягивает Net::DNS::Resolver::Programmable и NetAddr::IP.

Успешная инсталляция обычно заканчивается сообщением о размещении pl/паклист и установке исполняемого spfquery, например:

Installing /usr/local/bin/spfquery
Writing /usr/local/lib/perl/5.8.8/auto/Mail/SPF/.packlist
/usr/bin/make install  -- OK

После успешной установки выйдите из Perl shell:

q

Важно: если у вас строгая политика безопасности, сверяйтесь с пакетным менеджером вашей дистрибуции (apt/yum) — в некоторых репозиториях уже есть готовые пакеты Mail::SPF и NetAddr::IP.

3 Установка postfix-policyd-spf-perl

Скачайте архив пакета в /usr/src и установите исполняемый скрипт в каталог Postfix policies:

cd /usr/src
wget http://www.openspf.org/blobs/postfix-policyd-spf-perl-2.001.tar.gz
tar xvfz postfix-policyd-spf-perl-2.001.tar.gz
cd postfix-policyd-spf-perl-2.001
cp postfix-policyd-spf-perl /usr/lib/postfix/policyd-spf-perl

Отредактируйте /etc/postfix/master.cf и добавьте в конец следующую секцию (обратите внимание на отступы второй строки):

vi /etc/postfix/master.cf

| [...] policy unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/lib/postfix/policyd-spf-perl |

(Отступы перед user=nobody обязательны — Postfix связывает вторую строку с первой.)

Теперь откройте /etc/postfix/main.cf и найдите директиву smtpd_recipient_restrictions. В ней должна быть reject_unauth_destination. Добавьте сразу после неё check_policy_service unix:private/policy, например:

vi /etc/postfix/main.cf

| [...] smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination,check_policy_service unix:private/policy [...] |

Или в более читаемом виде:

| [...] smtpd_recipient_restrictions = [...] reject_unauth_destination check_policy_service unix:private/policy [...] [...] |

Важно: check_policy_service должен идти ПОСЛЕ reject_unauth_destination. Если поставить его раньше, есть риск непреднамеренного превращения сервера в открытый релей.

Перезапустите Postfix:

/etc/init.d/postfix restart

4 Поведение policyd-spf-perl и важные замечания

Пример из README пакета показывает ключевые особенности работы демона:

  • Демон проверяет HELO до Mail From; он отклонит почту, если либо HELO, либо Mail From дают REJECT.
  • При временной ошибке SPF демон отложит доставку (DEFER_IF_PERMIT).
  • Для локальных подключений (127.0.0.1) SPF-проверки пропускаются, при этом добавляется лог-запись «SPF skipped - localhost is always allowed.»
  • Если сообщение не отклонено/не отложено, демон допишет заголовок Received-SPF. При множественной доставке будут добавлены соответствующие заголовки для каждого получателя.

Important: Проверьте, как ваши внутренние MTA и сторонние сервиса (например, системы рассылок, CRM, SPF-делегированные сервисы) реализуют отправку почты, чтобы не ошибочно блокировать легитимную почту.

5 Тестирование policyd-spf-perl

Для ручного теста можно запустить скрипт в интерактивном режиме:

perl /usr/lib/postfix/policyd-spf-perl

Курсор станет ждать ввода. Формируйте запрос в виде набора ключ=значение и пустой строки в конце. Пример теста (сокращённые реальные значения замаскированы):

request=smtpd_access_policy
protocol_state=RCPT
protocol_name=SMTP
helo_name=h**forge.com
queue_id=8045F2AB23
sender=info@hforge.com
recipient=falko.timme@***.de
client_address=81.169.1.
client_name=h.server*****.net

Ожидаемый ответ в случае успеха:

action=PREPEND Received-SPF: pass (hforge.com: 81.169.1. is authorized to use 'info@hforge.com' in 'mfrom' identity (mechanism 'ip4:81.169.1.' matched)) receiver=server1.example.com; identity=mfrom; envelope-from="info@hforge.com"; helo=hforge.com; client-ip=81.169.1.

Тест с неразрешённого IP покажет softfail или fail:

request=smtpd_access_policy
protocol_state=RCPT
protocol_name=SMTP
helo_name=hforge.com
queue_id=8045F2AB23
sender=info@hforge.com
recipient=falko.timme@***.de
client_address=1.2.3.4
client_name=www.example.com

Пример вывода softfail:

action=PREPEND Received-SPF: softfail (hforge.com: Sender is not authorized by default to use 'info@hforge.com' in 'mfrom' identity, however domain is not currently prepared for false failures (mechanism '~all' matched)) receiver=server1.example.com; identity=mfrom; envelope-from="info@hforge.com"; helo=hforge.com; client-ip=1.2.3.4

Можно также проверить поведение при пустом поле sender (частые злоупотребления спамерами):

request=smtpd_access_policy
protocol_state=RCPT
protocol_name=SMTP
helo_name=hforge.com
queue_id=8045F2AB23
sender=
recipient=falko.timme@***.de
client_address=81.169.1.
client_name=h.server*******.net

В случае, если HELO-адрес проходит проверку, вы увидите Pass для identity=helo.

Для выхода из оболочки используйте Ctrl+C.

Сценарии отказа и способы обработки ошибок

  • Если постфикс начинает отклонять легитимную почту после включения policy, проверьте:

    • порядок директив в smtpd_recipient_restrictions;
    • список permit_mynetworks и корректность IP внутренних шлюзов;
    • SPF-записи отправляющих доменов (DNS TXT).
  • Если CPAN не удаётся загрузить модули из-за корпоративного прокси — используйте системные пакеты (apt, yum) или скачайте архивы модулей вручную и установите локально.

  • Если много сторонних сервисов отправляют почту от имени ваших доменов, убедитесь, что их IP или механизмы (include:…) добавлены в SPF DNS-запись.

Альтернативные подходы

  • milter-решения: spf-milter или opendkim+spf-milter — интегрируются через milter-интерфейс, могут дать более глубокую интеграцию.
  • Встроенные плагины для Postfix, требующие перекомпиляции — подходят, если вы управляете собственной сборкой Postfix.
  • Отправка через релей сервиса рассылок — в составе комплексного решения для больших инфраструктур.

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

Пошаговая методология внедрения (мини-методология)

  1. Инвентаризируйте все источники исходящей почты (включая трекеры, CRM, SaaS).
  2. Обновите SPF-записи доменов, добавив все разрешённые IP и include-домены.
  3. Установите Mail::SPF и NetAddr::IP.
  4. Скопируйте policyd-spf-perl в /usr/lib/postfix/ и добавьте политику в master.cf.
  5. В main.cf вставьте check_policy_service unix:private/policy ПОСЛЕ reject_unauth_destination.
  6. Перезапустите Postfix и выполните тесты в интерактивной оболочке.
  7. Наблюдайте логи и метрики доставки несколько дней; при необходимости откатите изменения.

Ролевые контрольные списки

Администратор:

  • Проверить /etc/postfix/main.cf на правильный порядок smtpd_recipient_restrictions.
  • Убедиться, что policyd-spf-perl имеет права на исполнение и читается пользователем Postfix.
  • Настроить мониторинг и логи.

Системный интегратор / DevOps:

  • Проверить SPF-записи доменов в DNS.
  • Тестировать рассылки от внешних сервисов.

Helpdesk:

  • При жалобах пользователей на неполучение почты — проверить логи Postfix и заголовки Received-SPF в входящих сообщениях.

Критерии приёмки

  • Политика SPF не вызывает отклонения легитимной почты в течение 48–72 часов после внедрения.
  • В логах отсутствуют массовые сообщения типа “reject: SPF fail” от легитимных отправителей.
  • Заголовки Received-SPF корректно добавляются в сообщения, прошедшие проверку.

План отката (rollback)

  1. Вернуть /etc/postfix/main.cf к предыдущей версии (резервная копия).
  2. Удалить или закомментировать секцию policy в /etc/postfix/master.cf.
  3. Перезапустить Postfix: /etc/init.d/postfix restart.
  4. Проинформировать заинтересованные команды и продолжить расследование причин отказа.

Тест-кейсы и приёмочные проверки

  • Отправка с IP, явно разрешённого в SPF — ожидается Pass и PREPEND Received-SPF: pass.
  • Отправка с IP, не указанного в SPF — ожидается softfail или fail согласно механизму all.
  • Отправка с пустым Mail From, корректный HELO — ожидается проверка по HELO.
  • Локальные подключения (127.0.0.1) — SPF должен пропускаться и логироваться как пропущенный.

Диагностика и полезные команды

  • Просмотр логов Postfix (Debian/Ubuntu):
tail -f /var/log/mail.log
  • Проверка DNS SPF-записи:
dig +short TXT example.com
  • Локальный тест policyd:
perl /usr/lib/postfix/policyd-spf-perl

Безопасность и конфиденциальность

  • policyd-spf-perl лишь читает и анализирует значения, передаваемые Postfix; он не отправляет письма наружу.
  • Хранение логов: не сохраняйте избыточные личные данные в логах (долгосрочное хранение адресов электронной почты должно соответствовать политике конфиденциальности вашей организации).
  • GDPR: при хранении и обработке логов с персональными данными обеспечьте доступ на основе ролей и ротацию/удаление логов в соответствии с корпоративной политикой.

Советы и эвристики

  • Всегда тестируйте изменения сначала на тестовом SMTP-экземпляре.
  • Используйте мягкий режим (~all) в SPF при поэтапном внедрении, затем переходите к -all после проверки всех отправителей.
  • Следите за заголовками Received-SPF: они помогают отладить, почему сообщение было принято/отклонено.

1‑строчное глоссарий

  • SPF — механизм авторизации IP‑адресов отправителей, описанный в DNS TXT-записях домена.

Совместимость и миграция

  • Если вы используете сторонние почтовые сервисы (MailChimp, SendGrid, CRM), проверьте их документацию по SPF/DKIM и добавьте соответствующие include: в вашу SPF-запись.
  • Если у вас старые версии Postfix, убедитесь, что схема master.cf и поддержка spawn присутствуют.

Полезные ссылки

Краткое резюме

Внедрение policyd-spf-perl в Postfix — простой и безопасный способ снизить риск подмены адреса отправителя. Ключевые шаги — установка Perl-модулей, размещение скрипта policyd-spf-perl в /usr/lib/postfix/, добавление секции в master.cf и подключение check_policy_service в main.cf после reject_unauth_destination. Всегда тестируйте и наблюдайте логи в первые дни после внедрения.

Пример команды перезапуска Postfix:

/etc/init.d/postfix restart

Notes: Планируйте период мониторинга и подготовьте откат, если внешние сервисы будут блокироваться по ошибке.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Payday 2 VR не работает — как исправить
Игры

Payday 2 VR не работает — как исправить

Эмулятор HoloLens — запуск и управление приложениями
Дополненная реальность

Эмулятор HoloLens — запуск и управление приложениями

Как зашифровать облачный диск с BoxCryptor
Безопасность

Как зашифровать облачный диск с BoxCryptor

Knockout-эффект в Photoshop и Illustrator — руководство
Дизайн

Knockout-эффект в Photoshop и Illustrator — руководство

HashTab: проверка контрольных сумм в Windows
Безопасность

HashTab: проверка контрольных сумм в Windows

Экспорт и импорт списков отправителей в Outlook
Почта

Экспорт и импорт списков отправителей в Outlook