Проблема порта 25 SMTP в прокси-сервере почты Nginx

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

Я настроил почтовый прокси-сервер Nginx и сконфигурировал его для распределения запросов на несколько почтовых серверов в качестве фронтенд-сервера. Однако мне нужно открыть порт 25 в конфигурации, иначе я не могу получить почту. Когда я открываю порт 25, я должен включить функцию smtp_auth с простым логином; в противном случае, если кто-то знает мой адрес электронной почты, он может отправлять письма без пароля.

Когда я включаю функцию smtp_auth, я не могу получать электронные письма, когда кто-то отправляет письмо на мой адрес снаружи.

Например, когда я пытаюсь отправить электронное письмо с Gmail на мой сервер, сообщение, возвращенное службой доставки Gmail, выглядит следующим образом:

Ответ удаленного сервера был:
530 5.7.1 Требуется аутентификация

Как я могу решить эту проблему?

/etc/nginx/nginx.conf (раздел mail {})

mail {

   server_name mail.proxyserver.com;
   auth_http localhost/auth/auth.php;
   pop3_capabilities "TOP" "USER" "UIDL" "PIPELINING" "SASL";
   imap_capabilities "IMAP4rev1" "UIDPLUS" "IDLE" "LITERAL+" "QUOTA";
   smtp_capabilities "SIZE 53477376" "8BITMIME" "ENHANCEDSTATUSCODES" "PIPELINING" "DSN";

   proxy on;
   proxy_pass_error_message on;
   proxy_timeout 300s;

    starttls                   on;
    ssl_protocols              TLSv1.2 TLSv1.3;
    ssl_ciphers                HIGH:!ADH:!MD5:@STRENGTH;
    ssl_session_cache          shared:TLSSL:16m;
    ssl_session_timeout        10m;
    ssl_certificate            /etc/letsencrypt/live/mail.proxyserver.com/fullchain.pem;
    ssl_certificate_key        /etc/letsencrypt/live/mail.proxyserver.com/privkey.pem;
    ssl_dhparam        /etc/ssl/certs/dhparam.pem;

    server {
            listen     25;
            listen     [::]:25;
            protocol   smtp;
            starttls   only;
            smtp_auth  none; # моя проблема :(
            xclient    off;
    }

    server {
            listen     465 ssl;
            listen     [::]:465 ssl;
            protocol   smtp;
    }

    server {
            listen     587;
            listen     [::]:587;
            protocol   smtp;
            starttls   only;
    }

    server {
            listen     110;
            listen     [::]:110;
            protocol   pop3;
            starttls   only;
    }

    server {
            listen     995 ssl;
            listen     [::]:995 ssl;
            protocol   pop3;
    }

    server {
            listen     143;
            listen     [::]:143;
            protocol   imap;
            starttls   only;
    }

    server {
            listen     993 ssl;
            listen     [::]:993;
            protocol   imap;
    }
}

У меня была такая же проблема, но я также нашел решение: для порта 25 не должно быть аутентификации (smtp_auth none;). Тогда запрос передается вашему скрипту аутентификации. В вашем скрипте вы должны проверить, что RCPT TO содержит домен, который вы обрабатываете на своем почтовом сервере. Если да, вы можете пропустить письмо, в противном случае вы должны отменить запрос аутентификации, отправив соответствующие заголовки и, таким образом, отклонить входящую почту.

ВНИМАНИЕ: если вы не отклоняете другие почтовые домены, у вас открыт реле!

if (!preg_match('/^RCPT TO:\s*<[^@]+@example\.com>/i', $headers['auth-smtp-to'])){
    header('Auth-Status: Authentication required');
    header('Auth-Error-Code: 530 5.7.1');
    exit(0);
}

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

Также я рекомендую использовать xclient. Если вы используете postfix, вы можете убедиться, что только прокси Nginx может получить доступ к параметрам xclient, используя:

smtpd_authorized_xclient_hosts = IP_ВАШЕГО_ХОСТА_NGINX

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

Ответ или решение

Проблема с SMTP-портом 25 на Nginx Mail Proxy и Рекомендации по Решению

Вы столкнулись с проблемой, когда при включении аутентификации SMTP на порту 25 не удается принимать входящие письма. Сообщение об ошибке "530 5.7.1 Authentication required" указывает на то, что ваш почтовый сервер требует аутентификации, и это мешает получению писем от отправителей, которые не представляют свои учетные данные.

Вот шаги, которые помогут вам правильно настроить Nginx Mail Proxy и избежать открытого реле для непроверенных доменов:

  1. Проверка конфигурации Nginx: Убедитесь, что часть вашей конфигурации Nginx для порта 25 выглядит следующим образом:

    server {
        listen     25;
        listen     [::]:25;
        protocol   smtp;
        smtp_auth  none; # Здесь важно не включать аутентификацию.
        xclient    off;   # Вы можете включить xclient, если это необходимо.
    }
  2. Настройка обработчика аутентификации: Вам необходимо настроить ваш скрипт аутентификации (auth.php), чтобы он пропускал только адреса, относящиеся к вашему домену. Ваша проверка должна выглядеть так:

    if (!preg_match('/^RCPT TO:\s*<[^@]+@yourdomain\.com>/i', $headers['auth-smtp-to'])) {
        header('Auth-Status: Authentication required');
        header('Auth-Error-Code: 530 5.7.1');
        exit(0);
    }

    Здесь вы заменяете yourdomain.com на ваш фактический домен. Это условие позволит только почте, адресованной к вашему домену, проходить через Nginx, и избежать открытого реле.

  3. Перевод заголовков в нижний регистр: Чтобы избежать ошибок с доступом к заголовкам, рекомендуется преобразовать их в нижний регистр перед обработкой:

    array_change_key_case($headers, CASE_LOWER);
  4. Настройка разрешений для XClient: Если вы используете Postfix, убедитесь, что только ваш Nginx Proxy может использовать xclient, добавив следующее в конфигурацию Postfix:

    smtpd_authorized_xclient_hosts = IP_ВАШЕГО_NGINX

    Это позволит удостоверяться, что только ваши доверенные клиенты могут использовать информацию о подключающихся клиентах.

  5. Тестирование конфигурации: После внесения всех изменений не забудьте протестировать свою конфигурацию. Вы можете использовать такие инструменты, как telnet или swaks, чтобы отправить тестовое сообщение и проверить, правильно ли работает конфигурация для входящей почты.

Важные Замечания

  • Убедитесь, что ваш сервер правильно настроен для обработки TLS, так как это критически важно для безопасности вашей почтовой системы.
  • Регулярно проверяйте логи Nginx и вашего почтового сервера на предмет ошибок или ненормального поведения.
  • Всегда поддерживайте актуальность систем безопасности, чтобы предотвратить потенциальные атаки и уязвимости.

Следуя этим рекомендациям, вы сможете правильно настроить ваш Nginx Mail Proxy для приема почты и избежать проблем с аутентификацией.

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

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