![为什么 nginx 需要 smtp 反向代理的 auth_http 条目?](https://linux22.com/image/682434/%E4%B8%BA%E4%BB%80%E4%B9%88%20nginx%20%E9%9C%80%E8%A6%81%20smtp%20%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E7%9A%84%20auth_http%20%E6%9D%A1%E7%9B%AE%EF%BC%9F.png)
答案1
基本上你的工作流程有三个主要步骤
- 通过 STARTTLS 或 SMTPS 进行加密和解密过程
- 身份验证过程,即检查您是否允许进行 SMTP 交易
- SMTP 转录(MAIL FROM、RCPT TO 等)
据我所知,您希望使用 nginx 执行步骤 1,并透明地将其余事务传递到后端。不幸的是,由于 nginx 的设计,您无法使用它来执行此操作。Nginx 始终在将请求传递到后端之前执行步骤 1 和 2。
这就是参数auth_http
变得至关重要的原因。基本上,nginx 从 SMTP 身份验证进程获取用户名和密码,通过协议并且它期望有关身份验证状态(是否可以继续交易)以及应将 SMTP 数据传递到哪个地址和端口的响应。
因此,如果您只是想要一些用于 SMTP 的 SSL 剥离代理,那么 nginx 可能不适合您。
答案2
在较新版本的 Nginx(从 1.19.4 开始),auth_http
使用您自己的指令Nginx HTTP 身份验证服务器不再需要用于身份验证。
您现在可以设置proxy_smtp_auth on;
代理 SMTP 服务器,让它们将 SMTP 身份验证中继到代理服务器(请参阅手动的,相关答案)。auth_http
在这种情况下,您的服务器只需验证所有客户端的身份,但仍需履行另外两个强制性职责:
认证服务器将对电子邮件客户端进行认证,选择上游服务器进行电子邮件处理[并将客户端转交给该服务器],并报告错误。
完整的 Nginx 配置示例如下所示(未经测试,可能尚未完全发挥作用,并且省略了所有 SSL 内容):
mail {
server_name smtp.example.com;
proxy_pass_error_message on;
# Your Nginx HTTP Authentication server.
auth_http localhost:9000/nginxauth.php;
# Proxy server config.
# (NOT proxied servers. These are only know to the HTTP Auth Server.)
server {
listen 25;
protocol smtp;
proxy_smtp_auth on;
smtp_auth login plain cram-md5;
}
}
如果您只想将客户端引至单个后端 SMTP 服务器,则无需实现自定义 Nginx HTTP 身份验证服务器。您可以使用这种技术反而。