【问题标题】:NGINX forwarding SMTP auth credentials to next server?NGINX 将 SMTP 身份验证凭据转发到下一个服务器?
【发布时间】:2019-09-25 15:32:07
【问题描述】:

使用 here 中描述的 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;
    }
}

当客户端请求 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

NGINX 正按预期尝试向前传递到服务器。我可以看到它访问了正确的服务器端点。

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

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

有没有办法让 NGINX 将 Auth 凭据“传递”到服务器?

【问题讨论】:

    标签: nginx nginx-reverse-proxy


    【解决方案1】:

    根据nginx mail list nginx 不会将 AUTH 命令传递给 SMTP 后端。 有一个 nginx patch 可以为 Postfix 执行此操作,但这不是官方的。

    您也可以尝试使用这个openresty solution

    【讨论】:

    • 谢谢。我没有尝试过 Openresty,重建它的代码包括 openssl 补丁有点超出我的能力。最后我通过在 Go 中编写自己的代理解决了这个问题 - github.com/tuck1s/go-smtpproxy
    【解决方案2】:

    自 nginx 1.19.4 起,支持 SMTP 本地后端身份验证 (SMTP AUTH)。

    见:http://nginx.org/en/docs/mail/ngx_mail_proxy_module.html#proxy_smtp_auth

    您可以通过启用 proxy_smtp_auth 来启用后端身份验证;指令。

    例如:

    server {
         server_name smtp.company.com;
         listen 587;
         protocol smtp;
    
         proxy_smtp_auth on; # <- enable native SMTP AUTH
    
         smtp_auth plain login cram-md5;
         starttls on;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-05-26
      • 2022-09-28
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      相关资源
      最近更新 更多