为什么 nginx 需要 smtp 反向代理的 auth_http 条目?

为什么 nginx 需要 smtp 反向代理的 auth_http 条目?

我通常是 apache 用户,但我需要开始使用 nginx 作为 smtp(postfix)的反向代理。

我在网上看到过几十个例子。比如。它们都有一个auth_http条目,我完全不明白。这不是我第一次使用代理,我目前使用哈普罗西几个月以来。那么为什么我必须提供 php 身份验证页面?为什么我不能像使用 haproxy 一样简单地使用 nginx,然后告诉它:在这里设置一个前端,用这个密钥解密 ssl,然后将其带到那个后端/端口?

有人能解释一下这个auth_http条目有多必要吗?nginx 手册似乎没多说什么。

感谢您的一切努力。

答案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 Plus 管理指南:将 NGINX 配置为邮件代理服务器

完整的 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 身份验证服务器。您可以使用这种技术反而。

相关内容