NGINX 将 SMTP 身份验证凭据转发到下一个服务器?

ste*_*eve 5 nginx nginx-reverse-proxy

使用此处描述的 NGINX SMTP 中继功能来代理商业 SMTP 服务器,有效地“白标”中继地址(包括证书),同时保留身份验证。

配置 NGINX 如下:

mail {
    server_name smtp.proxy.mydomain.net;
    auth_http   127.0.0.1:9000/auth;
    proxy_pass_error_message on;
    xclient off;
    smtp_capabilities "8BITMIME" "STARTTLS" "PIPELINING" "ENHANCEDSTATUSCODES";
    starttls on;
    ssl_certificate     /etc/letsencrypt/live/smtp.proxy.mydomain.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/smtp.proxy.mydomain.net/privkey.pem;
    ssl_protocols       TLSv1.2;
    ssl_session_cache   shared:SSL:10m;

    server {
        listen    587;
        protocol  smtp;
        smtp_auth login plain;
    }
}
Run Code Online (Sandbox Code Playgroud)

当客户端请求 STARTTLS 时,NGINX 使用该证书,并且客户端(在我的例子中swaks)将 AUTH LOGIN 凭据发送到 NGINX。

NGINX 然后调用mail_auth_http_module OK。我有一个简单的 Python Flask 应用程序,它返回指示始终接受身份验证的标头以及服务器地址。您可以在此处查看身份验证服务器对curl请求的响应:

$ curl -v localhost:9000/auth
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 9000 (#0)
> GET /auth HTTP/1.1
> Host: localhost:9000
> User-Agent: curl/7.61.1
> Accept: */*
> 
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Content-Type: text/html; charset=utf-8
< Content-Length: 2
< Auth-Status: OK
< Auth-Server: 52.214.232.65
< Auth-Port: 587
< Server: Werkzeug/0.15.2 Python/3.6.8
< Date: Tue, 07 May 2019 23:10:29 GMT
< 
* Closing connection 0
Run Code Online (Sandbox Code Playgroud)

然后,NGINX 将按照预期尝试向前传送到服务器。我可以看到它正在访问正确的服务器端点。

不幸的是,就我而言,服务器需要(并且始终需要)提供与客户端最初提供的相同的登录凭据。此时,交付失败并显示“需要 5.7.1 授权”,因为 NGINX 不再继续提供它们。

我怀疑 NGINX 假设,因为它已经调用了 auth 模块,所以服务器将不需要进一步的凭据,因此不会提供它们。

有没有办法让 NGINX 将身份验证凭据“传递”到服务器?

ins*_*der 1

根据nginx 邮件列表, nginx 不会将 AUTH 命令传递到 SMTP 后端。有一个nginx 补丁可以为 Postfix 执行此操作,但它不是官方的。

或者,您可以尝试使用此openresty 解决方案