Вопрос или проблема
Я вижу, как этот вопрос задается снова и снова на serverfault, и каждый раз он, кажется, сопровождается копией конфигураций и результатами успешной или неуспешной диагностики от чудесно полезных читателей.
Я хотел бы воспользоваться такой добротой, если это возможно, но немного повысить ставку. Как я это вижу, в большинстве случаев это сводится к настройке smtpd_recipient_restrictions
. Но в общем-то это довольно длинный список, например, мой:
# Правила ограничения получателей
smtpd_recipient_restrictions =
check_policy_service inet:127.0.0.1:9999
permit_mynetworks
permit_sasl_authenticated
check_recipient_access
proxy:pgsql:/etc/postfix/sql-maintain.cf
proxy:pgsql:/etc/postfix/sql-relay-recipient-verification.cf
reject_unverified_recipient
reject_unauth_destination
reject_non_fqdn_sender
reject_non_fqdn_recipient
reject_non_fqdn_helo_hostname
Но там происходит много всего, и более широкий вопрос, который я никогда не вижу, что обсуждается, это:
Существует ли способ попросить postfix сообщить нам, почему он отклоняет клиентский хост?
Не имея никаких подсказок, один из рабочих процессов, который я попробовал, выглядит следующим образом:
- Закомментировать одно из ограничений
postfix reload
(чтобы перезагрузить настройки)
3postconf smtpd_recipient_restrictions
(чтобы подтвердить)swaks --port 587 -tls --server smtp.mydomain.tld --to [email protected] --from [email protected]
(чтобы протестировать это)
Этот последний тест с конфигурацией выше дает замечательный трассировочный вывод, с основным выводом:
<~* 554 5.7.1 <_gateway[192.168.0.1]>: Клиентский хост отклонен: Доступ запрещен
Если я попробую то же самое с немецкого сервера (я в Тасмании), я вижу:
<~* 554 5.7.1 <static.244.6.251.148.clients.your-server.de[148.251.6.244]>: Клиентский хост отклонен: Доступ запрещен
Теперь, чтобы попытаться найти причину отклонения, я работаю в цикле, как указано выше, и открытие является интересным.
Я могу закомментировать их все, кроме reject_unauth_destination
и я все равно получаю то же самое отклонение. Если я закомментирую reject_unauth_destination
(и не имеет значения, какие другие ограничения активны или закомментированы), я получаю вместо этого:
<** Таймаут (30 секунд) в ожидании ответа сервера
Что совершенно не имеет смысла. Postfix не отвечает, когда у него отсутствует это правило.
Это задокументировано как:
reject_unauth_destination
Отклонить запрос, если одно из следующих условий верно:
Postfix является почтовым переадресовщиком: домен разрешенного RCPT TO совпадает с $relay_domains или его подсистемой и не содержит указания маршрута от отправителя (user@elsewhere@domain),
Postfix является конечным пунктом назначения: домен разрешенного RCPT TO совпадает с $mydestination, $inet_interfaces, $proxy_interfaces, $virtual_alias_domains или $virtual_mailbox_domains, и не содержит указания маршрута от отправителя (user@elsewhere@domain).
Углубляясь в это, я могу проверить все упомянутые конфигурации с помощью:
postconf mydestination myhostname inet_interfaces proxy_interfaces virtual_alias_domains virtual_mailbox_domains
что дает (редактировано)
mydestination = $myhostname, mydomain.tld
myhostname = smtp.mydomain.tld
inet_interfaces = all
proxy_interfaces =
virtual_alias_domains = proxy:pgsql:/etc/postfix/sql-domain-aliases.cf
virtual_mailbox_domains = proxy:pgsql:/etc/postfix/sql-domains.cf
Я подтвердил, что SQL-запрос в /etc/postfix/sql-domains.cf
возвращает mydomain.tld
и могу видеть точный запрос, который выполнил postfix с помощью SELECT * FROM pg_stat_activity
в PostgreSQL (в его внутренних журналах).
Честно говоря, я добавил mydomain.tld
в mydestination
, чтобы увидеть, помогло ли это, но нет, я все равно получаю Клиентский хост отклонен
Я пытался следить за /var/log/mail.err
и /var/log/mail.log
, запуская swaks с другого компьютера, и я не вижу ничего добавленного в mail.err
, а в mail.log
только эти строки (редактировано):
Jan 2 15:18:27 mailserver postfix/submission/smtpd[2160301]: connect from _gateway[192.168.0.1]
Jan 2 15:18:27 mailserver postfix/submission/smtpd[2160301]: Anonymous TLS connection established from _gateway[192.168.0.1]: TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256
Jan 2 15:18:27 mailserver postfix/submission/smtpd[2160301]: NOQUEUE: reject: RCPT from _gateway[192.168.0.1]: 554 5.7.1 <_gateway[192.168.0.1]>: Клиентский хост отклонен: Доступ запрещен; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<myswaksbox>
Jan 2 15:18:27 mailserver postfix/submission/smtpd[2160301]: disconnect from _gateway[192.168.0.1] ehlo=2 starttls=1 mail=1 rcpt=0/1 quit=1 commands=5/6
Таким образом, проблемы, которые надо решить:
- Почему postfix выдает таймаут, когда ограничение
reject_unauth_destination
удалено - Почему это ограничение, похоже, отклоняет электронное письмо, даже несмотря на то, что:
- SQL наблюдается в журналах PostgreSQL и возвращает
mydomain.tld
- Я добавил
mydomain.tld
вmydestination
- SQL наблюдается в журналах PostgreSQL и возвращает
- Как мы можем вытянуть из postfix конкретную причину этого отклонения?
Пока что это меня ставит в тупик.
Использование опции debug_peer_list
и тщательный анализ результатов показывают то, что должно было быть очевидным, ох! Мне нужно войти на SMTP-сервер, и аргументы swaks
--auth-user
и --auth-password
, добавленные с действительными учетными данными, делают запрос SMTP успешным.
Лучшее, что мы можем сделать, похоже, это изучить отладочную информацию, записанную в журналы, когда debug_peer_list
активен. Это не совсем то, на что я надеялся, так как было бы неплохо, если бы там был указан точный критерий и причина отклонения (чего, к сожалению, нет), но это, похоже, лучшее, что у нас есть, если кто-то не знает о чем-то лучшем (что делает то, о чем я мечтаю для анализа отклонений, записывая каждый критерий, который проверяется, и статус, прошел или провалился).
Ответ или решение
Проблема «Client host rejected: Access denied» в Postfix может быть следствием различных настроек конфигурации и политики отклонения почты. Для диагностики точной причины этой ошибки необходимо пройти через несколько шагов и обратить внимание на детали настройки вашего почтового сервера.
1. Проверка настроек smtpd_recipient_restrictions
Как вы правильно заметили, все начинается с проверки параметра smtpd_recipient_restrictions
. Это ключевой элемент, определяющий, какие входящие сообщения могут быть приняты вашим почтовым сервером. Ваша конфигурация выглядит следующим образом:
smtpd_recipient_restrictions =
check_policy_service inet:127.0.0.1:9999
permit_mynetworks
permit_sasl_authenticated
check_recipient_access
proxy:pgsql:/etc/postfix/sql-maintain.cf
proxy:pgsql:/etc/postfix/sql-relay-recipient-verification.cf
reject_unverified_recipient
reject_unauth_destination
reject_non_fqdn_sender
reject_non_fqdn_recipient
reject_non_fqdn_helo_hostname
Основные моменты внимания:
- Убедитесь, что функции
check_recipient_access
корректно работают, а SQL-запросы возвращают ожидаемые результаты. - Проверьте, что адреса, которые вы ожидаете получить, действительно соответствуют настройкам в
mydestination
,virtual_alias_domains
иvirtual_mailbox_domains
.
2. Логи Postfix
Для более глубокого анализа давайте посмотрим на логи Postfix. Используйте следующие команды, чтобы запустить отладку:
postconf -n | grep 'reject'
Это даст вам текущие настройки, включая те, что вы добавили в smtpd_recipient_restrictions
.
Убедитесь, что в логах /var/log/mail.log
и /var/log/mail.err
нет дополнительных ошибок, которые могут указывать на другие проблемы, такие как неверные SQL-запросы или проблемы с авторизацией.
3. Анализ reject_unauth_destination
Функция reject_unauth_destination
отклоняет входящие соединения, если запрашиваемый адрес не соответствует вашему домену и не является маршрутом для него. Попробуйте добавить ваш домен в список mydestination
:
mydestination = $myhostname, mydomain.tld
После этого перезапустите Postfix, чтобы изменения вступили в силу:
postfix reload
4. Тестирование с использованием swaks
Как вы уже делали, используйте swaks
для отправки тестовых писем. Чтобы увидеть больше информации о соединении, используйте:
swaks --to recipient@example.com --from sender@example.com --server smtp.mydomain.tld --port 587 --auth-user user --auth-password password
Если авторизация проходит успешно, проблема может заключаться в том, что ваш сервер ожидает авторизации для использования SMTP, что соответствует вашей конфигурации.
5. Использование отладочных опций
Активируйте опцию debug_peer_list
в конфигурации Postfix для получения более детальной информации о том, какие критерии проверки были выполнены. Это поможет понять, на каком этапе происходит сбой.
debug_peer_list = 192.168.0.1
Затем проверьте логи, которые будут содержать дополнительную отладочную информацию.
Заключение
Решение проблемы «Client host rejected: Access denied» может потребовать анализа нескольких уровней. Подходите к этому системно: проверьте конфигурацию, убедитесь, что все параметры заданы корректно, и используйте логи для анализа проблемы. Если вы продолжаете сталкиваться с ошибками, возможно, вам потребуется пересмотреть промежуточные компоненты или обратиться к расширенной документации Postfix.
В случае, если вам требуется еще больше демонстративных данных о работе вашего почтового сервера, стоит дополнительно рассмотреть возможность активирования расширенных логов для подробного анализа всех соединений и их статусов.