Postfix “Клиентский хост отклонен: Доступ запрещен” как диагностировать точную причину?

Вопрос или проблема

Я вижу, как этот вопрос задается снова и снова на 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 сообщить нам, почему он отклоняет клиентский хост?

Не имея никаких подсказок, один из рабочих процессов, который я попробовал, выглядит следующим образом:

  1. Закомментировать одно из ограничений
  2. postfix reload (чтобы перезагрузить настройки)
    3 postconf smtpd_recipient_restrictions (чтобы подтвердить)
  3. 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

Таким образом, проблемы, которые надо решить:

  1. Почему postfix выдает таймаут, когда ограничение reject_unauth_destination удалено
  2. Почему это ограничение, похоже, отклоняет электронное письмо, даже несмотря на то, что:
    • SQL наблюдается в журналах PostgreSQL и возвращает mydomain.tld
    • Я добавил mydomain.tld в mydestination
  3. Как мы можем вытянуть из 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.

В случае, если вам требуется еще больше демонстративных данных о работе вашего почтового сервера, стоит дополнительно рассмотреть возможность активирования расширенных логов для подробного анализа всех соединений и их статусов.

Оцените материал
Добавить комментарий

Капча загружается...