📧 Почтовые серверы📅 09.04.2026⏱️ 12 мин чтения✍️ АйТи Фреш👁 —
Настройка DKIM и SPF в Postfix: пошаговое руководство
Зачем нужны DKIM, SPF и DMARC
Электронная почта без аутентификации — как письмо без подписи: любой желающий может отправить сообщение от имени вашего домена, и никто это не заметит. DKIM, SPF и DMARC — три механизма, которые работают в связке и закрывают домен от подделки (spoofing), а заодно заметно улучшают доставляемость нормальной почты.
SPF (Sender Policy Framework) — TXT-запись в DNS, в которой вы явно перечисляете IP-адреса серверов, которым разрешено слать почту от имени домена. Принимающая сторона смотрит: а этот IP вообще в списке? Если нет — письмо подозрительное.
DKIM (DomainKeys Identified Mail) — криптографическая подпись заголовков и тела письма. Ваш сервер подписывает каждое письмо приватным ключом, получатель сверяет подпись с публичным ключом из DNS. Подделать это без приватного ключа практически невозможно.
DMARC (Domain-based Message Authentication, Reporting & Conformance) — политика, которая говорит принимающей стороне: что делать с письмами, провалившими SPF или DKIM. Варианты три: пропустить и записать в лог (none), отправить в карантин (quarantine) или отклонить совсем (reject). Плюс встроенный механизм отчётности — вы будете видеть, кто и что шлёт от вашего имени.
Без всего этого ваши письма рискуют уходить в спам даже у крупных провайдеров — Gmail, Outlook.com, Mail.ru. Причём с 2024 года Google прямо требует DKIM + SPF + DMARC от массовых отправителей. Не настроили — ждите проблем с доставляемостью.
Настройка SPF
SPF — самое простое из трёх. Настраивается за 10 минут: одна TXT-запись в DNS, и готово.
Создание SPF-записи
В SPF-записи перечисляете все источники, с которых уходит почта вашего домена:
# Базовая SPF-запись для домена с одним почтовым сервером
# DNS TXT запись для corp.local:
v=spf1 ip4:203.0.113.10 mx -all
# Разъяснение:
# v=spf1 — версия SPF
# ip4:... — разрешённый IP отправителя
# mx — все MX-серверы домена
# -all — отклонять всё остальное (hard fail)
# Расширенная SPF-запись
v=spf1 ip4:203.0.113.10 ip4:203.0.113.11 ip6:2001:db8::1 mx include:_spf.google.com ~all
# include: — включение SPF-записей другого домена (для SaaS)
# ~all — soft fail (рекомендуется на начальном этапе)
# -all — hard fail (рекомендуется для продакшена)
Проверяем, что SPF-запись подхватилась и выглядит правильно:
# Через dig
dig TXT corp.local +short
# Через nslookup
nslookup -type=TXT corp.local
# Онлайн-проверка через mxtoolbox (из командной строки)
curl -s "https://dns.google/resolve?name=corp.local&type=TXT" | python3 -m json.tool
# Добавление пользователя postfix в группу opendkim
sudo usermod -aG opendkim postfix
# Создание директории для сокета
sudo mkdir -p /run/opendkim
sudo chown opendkim:opendkim /run/opendkim
# Запуск OpenDKIM
sudo systemctl enable opendkim
sudo systemctl restart opendkim
# Перезагрузка Postfix
sudo systemctl restart postfix
# Проверка, что сокет создан
ls -la /run/opendkim/opendkim.sock
Проверка подписи
Отправляем тестовое письмо и смотрим, появилась ли DKIM-подпись в заголовках:
# Отправка тестового письма
echo "DKIM test" | mail -s "DKIM Test $(date)" test@gmail.com
# Проверка логов
sudo tail -f /var/log/mail.log | grep -i dkim
# Должно быть: DKIM-Signature field added
# Проверка через командную строку
opendkim-testkey -d corp.local -s mail -vvv
# Результат должен содержать:
# opendkim-testkey: key OK
В заголовках письма ищите строку Authentication-Results — там должно быть dkim=pass. Если есть — всё работает.
Настройка DMARC
DMARC — это надстройка над SPF и DKIM. Она не проверяет сама, а говорит: вот что делать с письмами, которые не прошли эти проверки:
# DNS TXT запись для _dmarc.corp.local
_dmarc.corp.local. IN TXT "v=DMARC1; p=none; sp=none; rua=mailto:dmarc-reports@corp.local; ruf=mailto:dmarc-forensic@corp.local; fo=1; adkim=r; aspf=r; pct=100; ri=86400"
# Разъяснение параметров:
# v=DMARC1 — версия
# p=none — политика: none (мониторинг), quarantine, reject
# sp=none — политика для поддоменов
# rua= — адрес для агрегированных отчётов
# ruf= — адрес для forensic-отчётов
# fo=1 — генерировать отчёт при любом failure
# adkim=r — выравнивание DKIM: r(relaxed) или s(strict)
# aspf=r — выравнивание SPF: r(relaxed) или s(strict)
# pct=100 — процент писем, к которым применяется политика
# ri=86400 — интервал отчётов (секунды, 86400 = 1 день)
Рекомендуемый порядок ужесточения DMARC
Сразу ставить политику reject — плохая идея. Мы несколько раз видели, как это обрезало легитимную почту. Двигайтесь постепенно:
Неделя 1-4:p=none — только смотрим, ничего не блокируем, собираем отчёты
Неделя 5-8:p=quarantine; pct=10 — в карантин уходят 10% подозрительных писем
Неделя 9-12:p=quarantine; pct=50 — карантин уже для половины
Неделя 13-16:p=quarantine; pct=100 — все подозрительные письма идут в карантин
После анализа:p=reject; pct=100 — полная защита, чужие письма от вашего имени отклоняются
На каждом этапе читайте DMARC-отчёты внимательно. Если видите легитимные источники, которые не проходят проверку — не паникуйте: просто добавьте их в SPF или настройте для них DKIM. Это нормальная рабочая ситуация.
Поддержка нескольких доменов
Если один Postfix обслуживает несколько доменов — для каждого нужен свой DKIM-ключ. Вот как это настраивается:
Для каждого домена добавьте в DNS три записи: SPF (TXT в корне домена), DKIM (TXT для mail._domainkey) и DMARC (TXT для _dmarc). Без любой из них защита будет неполной.
Поиск и устранение неполадок DKIM
Диагностика проблем
Типичные проблемы, с которыми приходят клиенты, и как их диагностировать:
DKIM не подписывает письма
Проверяйте в таком порядке — это экономит время:
# 1. Проверка статуса OpenDKIM
sudo systemctl status opendkim
# 2. Проверка сокета
ls -la /run/opendkim/opendkim.sock
# Пользователь postfix должен иметь доступ
# 3. Проверка логов
sudo grep opendkim /var/log/mail.log | tail -20
sudo journalctl -u opendkim -n 50
# 4. Проверка конфигурации
opendkim -n # парсинг конфигурации без запуска
# 5. Проверка прав на приватный ключ
ls -la /etc/opendkim/keys/corp.local/mail.private
# Должно быть: -rw------- opendkim opendkim
# 6. Проверка signing.table
# Убедитесь, что домен отправителя совпадает с паттерном
SPF fail при отправке
Если получатели видят SPF fail в заголовках — скорее всего одна из этих причин:
# Проверка SPF-записи
dig TXT corp.local +short
# Проверка, с какого IP отправляется почта
# Посмотрите Received-заголовки письма — IP должен быть в SPF
# Проверка через spfquery
sudo apt install libmail-spf-query-perl
spfquery -ip 203.0.113.10 -sender user@corp.local -helo mail.corp.local
# Частые ошибки:
# - IP сервера не указан в SPF
# - Превышен лимит DNS-запросов (максимум 10 include/redirect)
# - Отправка через relay, не указанный в SPF
# - Опечатка в SPF-записи
Комплексная проверка
Для финальной проверки всей связки удобно использовать внешние сервисы — они сразу покажут, что не так:
# Отправка на специальные адреса для проверки
# Gmail: посмотрите заголовки через "Show original"
# Должно быть: SPF: PASS, DKIM: PASS, DMARC: PASS
# Проверка DNS-записей
dig TXT corp.local +short # SPF
dig TXT mail._domainkey.corp.local +short # DKIM
dig TXT _dmarc.corp.local +short # DMARC
# Проверка DKIM-ключа
opendkim-testkey -d corp.local -s mail -vvv
# Проверка через mail-tester.com
# Отправьте письмо на адрес, указанный на сайте mail-tester.com
# Сервис выставит оценку от 1 до 10 и покажет все проблемы
Ротация DKIM-ключей
DKIM-ключи надо менять раз в 6–12 месяцев. Если ключ утёк — злоумышленник может подписывать письма от вашего имени сколько угодно. Процедура ротации такая:
# Шаг 1: Генерация нового ключа с новым селектором
sudo opendkim-genkey -b 2048 -d corp.local \
-D /etc/opendkim/keys/corp.local -s mail202604 -v
sudo chown opendkim:opendkim /etc/opendkim/keys/corp.local/mail202604.private
# Шаг 2: Добавление нового ключа в DNS (не удаляя старый!)
# mail202604._domainkey.corp.local IN TXT "v=DKIM1; h=sha256; k=rsa; p=..."
# Шаг 3: Обновление key.table и signing.table
# /etc/opendkim/key.table:
mail202604._domainkey.corp.local corp.local:mail202604:/etc/opendkim/keys/corp.local/mail202604.private
# /etc/opendkim/signing.table:
*@corp.local mail202604._domainkey.corp.local
# Шаг 4: Перезапуск OpenDKIM
sudo systemctl restart opendkim
# Шаг 5: Через 1-2 недели (после истечения кэша DNS) удалите старый ключ из DNS
# Удалите запись mail._domainkey.corp.local
Важный момент: старый DNS-ключ не удаляйте сразу после смены. Письма со старой подписью могут сидеть в очередях получателей несколько дней — дайте им время дойти, иначе получите волну ошибок.
PTR-запись: обратный DNS, без которого почта не взлетит
PTR — обратная DNS-запись: по IP сервера она возвращает его hostname. Если PTR отсутствует, крупные почтовые провайдеры сразу и сильно снижают оценку доверия к отправителю. Настраивается PTR не у регистратора домена, а у хостинг-провайдера — там, где физически расположен сервер.
# Проверка PTR из консоли
dig -x 185.45.67.89 +short
# Должно вернуть: mail.company.ru.
# Прямая запись должна вести обратно на тот же IP
dig mail.company.ru A +short
# Должно вернуть: 185.45.67.89
Если IP уже попал в чёрный список
Делистинг возможен, но требует терпения. Сначала нужно найти все RBL, в которых числится IP (это можно проверить через публичные сервисы вроде mxtoolbox blacklists). Для каждого RBL — своя процедура делистинга: у Spamhaus через check.spamhaus.org, у SORBS через www.sorbs.net. Перед запросом на делистинг нужно убедиться, что причина включения устранена: сервер не открытый relay, на машинах в сети нет вирусов, настроены SPF/DKIM/DMARC. После этого можно запрашивать делистинг — Spamhaus обычно отвечает за 4-24 часа, остальные списки — от одного до семи дней.
Часто задаваемые вопросы
Технически можно работать с чем-то одним, но на практике это плохая идея. SPF проверяет только IP-адрес — откуда пришло письмо. DKIM проверяет содержимое — что письмо не изменили в пути. Они закрывают разные векторы атак и дополняют друг друга. Gmail и Outlook.com ждут оба механизма. А DMARC вообще не имеет смысла без хотя бы одного из них — просто нечего будет проверять.
Минимум — 1024 бит, но мы так уже не делаем: такие ключи считаются слабыми. Берите 2048 бит — это оптимум по соотношению безопасности и совместимости. Ключи на 4096 бит дают максимальную защиту, но есть подвох: они могут не влезать в одну DNS TXT-запись (там лимит 255 символов на строку) и потребуют разбиения на части. Лишняя головная боль без существенного выигрыша.
RFC 7208 жёстко ограничивает количество DNS-запросов при проверке SPF — не более 10. Каждый механизм include:, a:, mx:, redirect= «съедает» один запрос. Мы в своей практике видели записи, где только include: набирали 12–14 lookup — и всё, письма молча падали в спам. Выход простой: заменяйте include: на конкретные ip4:/ip6: адреса, объединяйте записи, либо используйте сервисы flat SPF — тот же dmarcian умеет это автоматически. ip4: и ip6: DNS-запросов не вызывают вообще, поэтому на них и нужно опираться.
DKIM для входящей почты большинство MTA проверяют сами. Postfix делает это через OpenDKIM в режиме verify — без каких-либо дополнительных настроек с вашей стороны. Зачем это нужно? Письма с валидной DKIM-подписью от известных доменов получают больший вес при спам-фильтрации, и это реально работает. В нашей конфигурации по умолчанию включён режим Mode sv (sign + verify) — он покрывает оба направления сразу.
DMARC Aggregate Reports приходят XML-файлами на адрес из rua=. Читать их руками — то ещё удовольствие, особенно когда отчётов накапливается по 50–100 в день от крупных провайдеров. Для разбора используем parsedmarc — он open source, парсит отчёты и грузит всё в Elasticsearch, откуда уже можно строить нормальные дашборды. Если хочется без инфраструктуры — dmarcian.com, Postmark DMARC (есть бесплатный тариф) или EasyDMARC. Главное, зачем вообще смотреть эти отчёты: находить легитимные серверы, которые вы забыли добавить в SPF, ловить попытки подделки вашего домена и выявлять проблемы с DKIM-подписями на отдельных серверах.
Столкнулись с похожей задачей? Обращайтесь — решим
Если у вас происходит что-то из описанного в этой статье — или любая другая проблема с ИТ-инфраструктурой, — обращайтесь в любое время. Мои специалисты и я лично разберём ситуацию, найдём настоящую причину и доведём до решения.
Возьмёмся и за разовую задачу, и за постоянное обслуживание. Первичная консультация — бесплатно и без обязательств.
Каждую неделю мы выпускаем практические гайды для руководителей IT и системных администраторов. Это не просто теория! Здесь вы найдёте всё: безопасность, 1С, миграции, резервные копии и проверенные лайфхаки из наших реальных проектов.
Реквизиты оператора персональных данных
ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.
Оставить комментарий