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 将身份验证凭据“传递”到服务器?
根据nginx 邮件列表, nginx 不会将 AUTH 命令传递到 SMTP 后端。有一个nginx 补丁可以为 Postfix 执行此操作,但它不是官方的。
或者,您可以尝试使用此openresty 解决方案。
| 归档时间: |
|
| 查看次数: |
7115 次 |
| 最近记录: |