Вопрос или проблема
Я настроил почтовый прокси-сервер 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 и избежать открытого реле для непроверенных доменов:
-
Проверка конфигурации Nginx: Убедитесь, что часть вашей конфигурации Nginx для порта 25 выглядит следующим образом:
server { listen 25; listen [::]:25; protocol smtp; smtp_auth none; # Здесь важно не включать аутентификацию. xclient off; # Вы можете включить xclient, если это необходимо. }
-
Настройка обработчика аутентификации: Вам необходимо настроить ваш скрипт аутентификации (
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, и избежать открытого реле. -
Перевод заголовков в нижний регистр: Чтобы избежать ошибок с доступом к заголовкам, рекомендуется преобразовать их в нижний регистр перед обработкой:
array_change_key_case($headers, CASE_LOWER);
-
Настройка разрешений для XClient: Если вы используете Postfix, убедитесь, что только ваш Nginx Proxy может использовать
xclient
, добавив следующее в конфигурацию Postfix:smtpd_authorized_xclient_hosts = IP_ВАШЕГО_NGINX
Это позволит удостоверяться, что только ваши доверенные клиенты могут использовать информацию о подключающихся клиентах.
-
Тестирование конфигурации: После внесения всех изменений не забудьте протестировать свою конфигурацию. Вы можете использовать такие инструменты, как
telnet
илиswaks
, чтобы отправить тестовое сообщение и проверить, правильно ли работает конфигурация для входящей почты.
Важные Замечания
- Убедитесь, что ваш сервер правильно настроен для обработки TLS, так как это критически важно для безопасности вашей почтовой системы.
- Регулярно проверяйте логи Nginx и вашего почтового сервера на предмет ошибок или ненормального поведения.
- Всегда поддерживайте актуальность систем безопасности, чтобы предотвратить потенциальные атаки и уязвимости.
Следуя этим рекомендациям, вы сможете правильно настроить ваш Nginx Mail Proxy для приема почты и избежать проблем с аутентификацией.