Назад | Перейти на главную страницу

Docker Mailcow: Nginx как обратный прокси-сервер Mail для образов контейнеров докеров с использованием SMTP, POP3 и IMAP

На моем сервере я использую mailcow: dockerized решение на сервере Debian, и я хочу использовать nginx не только как обратный прокси-сервер http, но и как SMTP imap и pop3, как показано на https://www.nginx.com/resources/admin-guide/mail-proxy/

Но чем дальше я читаю ссылку, тем сложнее становится понять, как это будет сделано. В http очевидно, как это будет сделано:

 server {
   listen 80;
   server_name mail.example.tk;

   location /.well-known {
        proxy_pass http://127.0.0.1:8080/.well-known ;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        client_max_body_size 100m;

   }

   location / {
        rewrite ^(.*) https://$server_name$1 permanent;
   }

}

server {
 listen 443 ssl;
 server_name mail.example.tk;

 ssl_certificate     /opt/docker-mailcow/data/assets/ssl/cert.pem;
 ssl_certificate_key /opt/docker-mailcow/data/assets/ssl/key.pem;
 ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
 ssl_ciphers         HIGH:!aNULL:!MD5;


 location / {
        proxy_pass http://127.0.0.1:8080/;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        client_max_body_size 100m;
 }

}

Но как это сделать с помощью smtp, pop3 и imap? Пожалуйста, имейте в виду, что образы докеров запускаются на одном сервере с nginx, а именно:

827c20cee898        mailcow/dovecot:1.0     "/docker-entrypoin..."   50 minutes ago      Up 50 minutes             24/tcp, 10001/tcp, 0.0.0.0:2110->110/tcp, 0.
76a977a8064e        mailcow/postfix:1.0     "/bin/sh -c 'exec ..."   50 minutes ago      Up 50 minutes             588/tcp, 0.0.0.0:2525->25/tcp, 0.0.0.0:2465-

Любые идеи?

Судя по комментариям, похоже, что вопрос касается HTTP-сервера аутентификации для почтового прокси. Об этом говорится в части руководства:

Каждый запрос POP3 / IMAP / SMTP от клиента сначала аутентифицируется на внешнем сервере аутентификации HTTP или с помощью сценария аутентификации. Наличие сервера аутентификации обязательно для прокси почтового сервера NGINX. Сервер можно создать самостоятельно в соответствии с протоколом аутентификации NGINX, который основан на протоколе HTTP.

Он ссылается на http://nginx.org/en/docs/mail/ngx_mail_auth_http_module.html#protocol который идет дальше в том, как должны выглядеть запрос и ответ. Он дает это как пример запроса:

GET /auth HTTP/1.0
Host: localhost
Auth-Method: plain # plain/apop/cram-md5/external
Auth-User: user
Auth-Pass: password
Auth-Protocol: imap # imap/pop3/smtp
Auth-Login-Attempt: 1
Client-IP: 192.0.2.42
Client-Host: client.example.org

Это то, что твое auth_http сервер получит. Тогда ваш auth_http серверу нужно будет ответить примерно так:

HTTP/1.0 200 OK
Auth-Status: OK
Auth-Server: 198.51.100.1
Auth-Port: 143

Ответ вашего сервера содержит IP-адрес сервера и порт, на который будет проксироваться запрос.

К сожалению, они не приводят ни одного примера HTTP-сервера или кода для запуска. Однако я нашел другую статью, в которой в качестве примера приводится сценарий сервера PHP на https://www.nginx.com/resources/wiki/start/topics/examples/imapauthenticatewithapachephpscript/.