Если вы администрируете почтовый сервер на Postfix, рано или поздно может возникнуть необходимость ограничить доступ для отдельных учётных записей – например, разрешить отправку писем только с определённых IP-адресов. Это особенно актуально для системных пользователей, которые работают с критически важными сервисами.
Но как это сделать, если стандартные методы вроде check_client_access
не срабатывают? Давайте разбираться вместе, без лишней теории, но с конкретными примерами.
Почему check_client_access не работает для SASL-аутентификации?
В исходной конфигурации используется параметр check_client_access
, который проверяет IP-адрес клиента. Однако тут есть нюанс: SASL-аутентификация происходит после проверки клиентских ограничений. То есть Postfix сначала разрешает подключение на уровне IP, а уже потом проверяет учётные данные. Если пользователь проходит аутентификацию, ограничения из sasl_access
файла просто игнорируются – сервер считает его «легитимным».
Вот типичная ошибка в настройке (обратите внимание на порядок действий):
smtpd_client_restrictions = check_client_access hash:/etc/postfix/hatters/sasl_access
smtpd_recipient_restrictions = permit_sasl_authenticated
После успешной аутентификации правило permit_sasl_authenticated разрешает отправку, даже если IP-адрес не совпадает.
Решение: связка check_sasl_access и mynetworks
Чтобы ограничить SASL-пользователей по IP, нужно:
- Добавить доверенные IP-адреса в
mynetworks
. - Использовать
check_sasl_access
, который проверяет доступ после аутентификации.
Шаг 1: Настройка mynetworks
Откройте main.cf
и укажите разрешённые сети (IPv4 и IPv6):
mynetworks = 208.x.x.50/32, 2001:xxx:x:xxx::53/128, 127.0.0.0/8
Не забудьте заменить адреса на свои. Если список большой, вынесите его в отдельный файл через mynetworks = hash:/etc/postfix/network_access.
Шаг 2: Изменение master.cf
В секции submission
файла master.cf
настройте правила проверки:
submission inet n - n - - smtpd
-o smtpd_tls_security_level=encrypt
-o smtpd_client_restrictions=check_sasl_access hash:/etc/postfix/sasl_access
-o smtpd_recipient_restrictions=
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
permit_mynetworks,
permit_sasl_authenticated,
reject
Здесь:
check_sasl_access
сверяет учётную запись и IP из файлаsasl_access
;permit_mynetworks
разрешает отправку для IP изmynetworks
;permit_sasl_authenticated
применяется только если IP не входит в доверенные сети.
Шаг 3: Создание sasl_access
Файл /etc/postfix/sasl_access
должен содержать записи вида:
user1 permit_mynetworks, reject
user2 permit_mynetworks, reject
Это значит:
- Если user1 подключился с IP из
mynetworks
– разрешить; - В противном случае – отклонить, даже если аутентификация прошла успешно.
После редактирования выполните:
postmap /etc/postfix/sasl_access
systemctl reload postfix
Возможные ошибки и как их избежать
- Неправильный порядок правил в smtpd_recipient_restrictions. Если поставить
permit_sasl_authenticated
передpermit_mynetworks
, проверка IP будет игнорироваться. - Опечатки в sasl_access. Убедитесь, что имя пользователя написано точно так же, как в SASL-логах (иногда добавляется домен, например
user1@domain.com
). - Забыли обновить mynetworks. Если добавили новый IP в файл, выполните
postmap
и перезагрузите Postfix.
Кстати, если вам нужно разрешить разные IP для разных пользователей (например, user1 – IPv6, user2 – IPv4), просто укажите их в отдельных строках файла sasl_access
. А вот группировать через запятую не получится – Postfix обрабатывает только одну запись за раз.
Альтернатива: postfwd
Если вариант с check_sasl_access
кажется сложным, можно использовать postfwd – гибкий фильтр для Postfix. Но учтите:
– Настройка требует установки дополнительного пакета;
– Конфигурация пишется на отдельном языке правил;
– Не все дистрибутивы включают актуальную версию с поддержкой IPv6.
Пример правила для postfwd:
id:RULE1; action=dunno; sasl_username=user1; client_address=2001:xxx:x:xxx::53
id:RULE2; action=reject; sasl_username=user1
Но лично я рекомендую оставаться в рамках штатных средств Postfix – меньше зависимостей и проще отладка.
Заключение
Ограничение доступа по IP для SASL-пользователей в Postfix – задача нетривиальная, но решаемая за 20–30 минут. Главное:
– Использовать check_sasl_access
вместо check_client_access
;
– Чётко прописать порядок правил в master.cf
;
– Не забывать про postmap
после изменения файлов.
Если что-то пошло не так, проверьте логи командой tail -f /var/log/mail.log
– там будут подробные сообщения о причинах отклонения подключения. Удачи в настройке!