Postfix не принимает письма от Яндекса: причины и решение
Проблема, когда Postfix отказывается принимать входящие сообщения от почтовых серверов Яндекса и других доменов, часто связана с механизмом SMTP pipelining. Администраторы сталкиваются с ошибкой improper command pipelining after DATA, даже если в конфигурации отключена директива reject_unauth_pipelining. В этой статье мы подробно разберём причины сбоя и предложим пошаговое решение.
Что такое SMTP pipelining и почему Postfix его блокирует?
SMTP pipelining - это расширение протокола, позволяющее отправлять несколько команд без ожидания ответа на каждую. Это ускоряет доставку, но некоторые серверы (например, Яндекс.Почты) могут нарушать спецификацию, отправляя команды после завершения передачи данных (DATA). Postfix по умолчанию настроен жёстко: если клиент отправляет команду после DATA, он считает это нарушением и отклоняет соединение.
В логах ошибка выглядит так: improper command pipelining after DATA. Даже отключение smtpd_data_restrictions = reject_unauth_pipelining не всегда помогает, так как сам Postfix SMTP-сервер может иметь встроенные проверки.
Почему отключение reject_unauth_pipelining не решает проблему?
Директива reject_unauth_pipelining блокирует клиентов, которые используют pipelining без предварительного согласования (через EHLO). Однако, если клиент (например, Яндекс) правильно объявляет поддержку pipelining, но нарушает порядок команд (pipelining после DATA), Postfix всё равно отклоняет письмо - это встроенная логика ядра MTA. Вы видите в логах:
- Строку
improper command pipelining after DATA - Потерю соединения (
lost connection after DATA) - Увеличение счётчика команд (например,
commands=5/6)
Это говорит о том, что проблема не в проверке аутентифицированного pipelining, а в нарушении протокола SMTP.
Как исправить: увеличить лимиты и ослабить проверки
Для решения проблемы нужно настроить Postfix более гибко. Вот что рекомендуют эксперты:
1. Увеличьте лимит на количество команд в конверте
Добавьте в файл /etc/postfix/main.cf параметр:
smtpd_hard_error_limit = 10По умолчанию значение равно 5. Увеличение даёт больше попыток на завершение передачи, даже если клиент отправляет лишние команды.
2. Отключите строгий контроль pipelining после DATA
В /etc/postfix/master.cf для сервиса smtpd добавьте флаг -o smtpd_data_restrictions= (пустой), чтобы снять все ограничения на этапе DATA. Пример строки:
smtp inet n - y - - smtpd -o smtpd_data_restrictions=3. Используйте ограничение на размер конверта
Добавьте smtpd_recipient_limit = 100 - это снизит вероятность, что клиент попытается отправить много команд после DATA.
Проверка после изменений
После внесения правок перезагрузите Postfix:
systemctl restart postfixПроверьте логи на наличие ошибок. Если письма от Яндекса начали проходить - проблема решена. Если нет, временно отключите все non-SMTP проверки, добавив в main.cf:
smtpd_helo_required = no smtpd_delay_reject = yesАльтернативное решение: запретить pipelining для конкретных отправителей
Если нужно сохранить строгие проверки для остальных, можно создать отдельную политику для Яндекса через access-файл или check_policy_service. Однако проще всего ослабить глобальные настройки - это не снизит безопасность, так как основная защита (SPF, DKIM, DMARC) остаётся активной.
Помните: проблема характерна не только для Яндекса - аналогичное поведение встречается у серверов Google, Mail.ru и других крупных провайдеров. Настройка Postfix на допуск pipelining после DATA - стандартная практика для совместимости.