Тематические термины: NGINX, SMTP, IMAP, POP3.
NGINX можно использовать не только в качестве веб-сервера или http-proxy, но и для проксирования почты по протоколам SMTP, IMAP, POP3. Это позволит настроить:
В данной статье установка выполняется на операционной системе Linux. В качестве почтового сервиса, на который передаются запросы можно использовать postfix, exim, dovecot, exchange, сборку iredmail и другое.
NGINX принимает запросы и выполняет аутентификацию на веб-сервере. В зависимости от результата проверки логина и пароля, прокси вернет ответ с несколькими заголовками.
В случае успеха:
Таким образом, сервер и порт почтового сервера мы определяем на основе аутентификации. Это дает много возможностей при соответствующих знаниях языков программирования.
В случае неудачи:
В зависимости от результата аутентификации и заголовком, клиент перенаправляется на нужный нам почтовый сервер.
Внесем некоторые правки в настройки безопасности сервера.
Отключаем SELinux, если используем CentOS или если используем данную систему безопасности на Ubuntu:
vi /etc/selinux/config
SELINUX=disabled
setenforce 0
Если используем firewalld (по умолчанию в CentOS):
firewall-cmd –permanent –add-port=25/tcp –add-port=110/tcp –add-port=143/tcp
firewall-cmd –reload
Если используем iptables (по умолчанию в Ubuntu):
iptables -A INPUT -p tcp –dport 25 -j ACCEPT
iptables -A INPUT -p tcp –dport 110 -j ACCEPT
iptables -A INPUT -p tcp –dport 143 -j ACCEPT
apt-get install iptables-persistent
iptables-save > /etc/iptables/rules.v4
* в данном примере мы разрешили SMTP (25), POP3 (110), IMAP (143).
В зависимости от операционной системы, установка NGINX немного отличается.
или Linux Centos:
yum install nginx
или Linux Ubuntu:
apt install nginx
Разрешаем автозапуск сервиса и запускаем его:
systemctl enable nginx
systemctl start nginx
Если в системе уже установлен NGINX, проверяем с какими модулями он работает:
Мы получим список опций, с которыми собран веб-сервер — среди них мы должны увидеть –with-mail. Если нужного модуля нет, нужно обновить nginx
Открываем конфигурационный файл nginx и добавляем опцию mail:
vi /etc/nginx/nginx.conf
mail { server_name mail.domain.local; auth_http localhost:80/auth.php;
proxy_pass_error_message on;
server { listen 25; protocol smtp; smtp_auth login plain cram-md5; }
server { listen 110; protocol pop3; pop3_auth plain apop cram-md5; }
server { listen 143; protocol imap; }}
* где:
В секции http – server дописываем:
http { …
server { listen 80 default_server; listen [::]:80 default_server; …
location ~ \.php$ { set $root_path /usr/share/nginx/html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name; include fastcgi_params; fastcgi_param DOCUMENT_ROOT $root_path; } …
* в данном примере мы добавили правило обработки файлов php через FastCGI, который будет работать на локальном сервере, порту 9000. Домашняя директория для хранения скриптов — /usr/share/nginx/html.
Перезапускаем сервер nginx:
systemctl restart nginx
Для выполнения аутентификации с помощью PHP, необходимо установить в систему следующие пакеты.
Если CentOS:
yum install php php-fpm
Если Ubuntu:
apt-get install php php-fpm
Запускаем PHP-FPM:
systemctl enable php-fpm
systemctl start php-fpm
Проверка логина и пароля выполняется скриптом, путь до которого задается опцией auth_http. В нашем примере, это скрипт на PHP.
Пример официальной заготовки для скрипта проверки логина и пароля:
vi /usr/share/nginx/html/auth.php
* данный скрипт принимает любые логин и пароль и перенаправляет запросы на серверы 192.168.1.22 и 192.168.1.33. Чтобы задать алгоритм аутентификации, редактируем строки 61 – 64. За возврат серверов, на которые идет перенаправление отвечают строки 73 – 77 — в данном примере если логин начинается на символы “a”, “c”, “f”, “g”, то перенаправление будет на сервер mailhost01, иначе, на mailhost02. Сопоставление имен серверов с IP-адресами можно задать на строках 31, 32, в противном случае, обращение будет идти по доменному имени.
Обмен данными между NGINX прокси и почтовым сервером идут в открытом виде. Необходимо добавить в исключение возможность аутентификации по механизму PLAIN. Например, для настройки dovecot, делаем следующее:
vi /etc/dovecot/conf.d/10-auth.conf
Добавляем строки:
remote 192.168.1.11 { disable_plaintext_auth = no}
* в данном примере мы разрешили PLAIN-запросы на аутентификацию с сервера 192.168.1.11.
Также проверяем:
* если ssl будет иметь значение required, проверка не будет работать, так как получится, что с одной стороны сервер разрешает запросы в открытом виде, но требует шифрование ssl.
Перезапускаем Dovecot сервис:
systemctl restart dovecot
Можно перейти к проверки настройки нашего прокси. Для этого в настройках клиента в качестве IMAP/POP2/SMTP указываем адрес или имя сервера nginx, например:
* в данном примере почтовый клиент настраивается для подключения к серверу 192.168.1.11 по открытым портам 143 (IMAP) и 25 (SMTP).
Теперь настроим SSL-подключение. Nginx должен быть собран с модулем mail_ssl_module — проверяем командой:
При отсутствии необходимого модуля, пересобираем nginx.
После редактируем наш конфигурационный файл:
mail { server_name mail.domain.local; auth_http localhost/auth.php;
ssl on; ssl_certificate /etc/ssl/nginx/public.crt; ssl_certificate_key /etc/ssl/nginx/private.key; ssl_ciphers HIGH:!aNULL:!MD5; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m;
Генерируем сертификат:
mkdir -p /etc/ssl/nginx
openssl req -new -x509 -days 1461 -nodes -out /etc/ssl/nginx/public.crt -keyout /etc/ssl/nginx/private.key -subj “/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=test.admins24.local/CN=test”
* где /etc/ssl/nginx/ — каталог хранения сертификатов, subj — индивидуальные настройки для сертификата.
Перезапускаем nginx:
Для анализа ошибок включаем сохранение лога в файл:
mail { … error_log /var/log/nginx/mail_proxy_error; …}
Просмотр лога запускаем командой:
tail -f /var/log/nginx/mail_proxy_error
Ошибка возникаем при попытке перезапустить службу nginx. При этом, проверка конфигурационного файла командой nginx -t проходит корректно.
Причина: срабатывает система безопасности SELinux.
Решение: отключить или настроить SELinux.
Продолжая использовать данный сайт вы принимаете политику конфиденциальности и cookies