验证 SMTP 代理

验证 SMTP 代理

我拥有一些邮件用户,我想将他们从当前的邮件服务器转移到我的邮件服务器。我已将 perdition 设置为代理,这样我就可以代理 IMAP 和 POP 连接 - 并且我可以控制用于将他们引导到相应邮件服务器的 DNS。我无法访问旧邮件服务器。

邮件代理服务器运行的是Linux

不幸的是,我怀疑很多人都使用同一个 POP3 和 SMTP 服务器。

我想设置一个 SMTP 代理,这样我就可以在过渡期间无缝地向客户提供 SMTP 服务 - 无需开放邮件中继。Perdition 似乎不提供此解决方案。

是否有人知道一种解决方案,可以代理 SMTP 请求(包括 AUTH 请求)——理想情况下,能够映射哪些请求发送到哪个后端?[我没有尝试过 IPTables DNAT 规则——我怀疑这可能会起作用,但我失去了根据每个域/客户端对不同服务器进行身份验证的能力,这使得迁移变得更加困难]。

编辑

我尝试将 Dovecot 配置为导演/代理来代替 Perdition。这对于 IMAP 和 POP 来说很有效,但对于 SMTP 则不行 - 具体来说,它将根据用户名或域名进行身份验证 - 它不会根据 SMTP 服务器检查实际凭据。

答案1

对于 Postfix,请参阅 Andy Beverley 的文章SMTP 身份验证和 Postfix

START=yes
MECHANISMS="rimap"
MECH_OPTIONS="imap.example.com"

我还将配置 postfix 以将其作为中继直接路由到您的新 SMTP 服务器。将新服务器的 IP 添加到“我的网络”并将中继主机设置为新的 smtp 服务器。

将其指向 imap 服务器所在的 dovecot 的 perdition 代理,它是 saslauthd 系统和 imap 之间的简单身份验证,因此您需要将 perdition 代理用作对 localhost 的非安全代理(或者只是阻止对 143 的外部访问,等待您的设置详细信息)

答案2

有没有人知道一个解决方案,它可以代理 SMTP 请求(包括 AUTH 请求)——理想情况下,能够映射哪些请求发送到哪个后端

从 Nginx 1.19.4 开始,Nginxmail模块可以满足所有这些要求。

指示

  1. 关注官方“将 NGINX 配置为邮件代理服务器“。但只能server { … }为 SMTP 代理创建一个条目。

  2. proxy_smtp_auth on;通过向您的服务器块添加指令来启用代理身份验证(手动的相关答案)。这是在 Nginx 版本 1.19.4 中首次出现的功能。(请查看nginx -v。例如,Ubuntu 20.04 仍具有 1.18.0。)

  3. 运行Nginx HTTP 身份验证服务器。这是一个使用 Nginx 定义的特殊 HTTP 协议的小型服务器,它既可以用于身份验证,也可以将请求映射到不同的 SMTP 后端服务器。

HTTP 身份验证服务器选项

  • 自定义服务器脚本。有示例在 Python 中PHP, 或者Perl. 最适合简单情况,特别是当您只需要身份验证服务器来选择后端,同时通过 将身份验证外包给该后端时proxy_smtp_auth on

  • 服务器和 SQL 数据库。对于更高级的用例,有Nginx 邮件认证 HTTP 服务器,用 Go 编写。它可以根据 SQL 数据库中的数据进行身份验证和后端选择。

  • Nginx 配置用于单一后端引用。最简单的情况是,您希望将每个客户端引向同一个后端服务器。这可以通过 Nginx 本身来实现()。(虽然这可能有效,但我发现很难调试。)

  • Nginx 配置用于身份验证和单一后端引用。如果您只需要身份验证和转介到单个后端服务器,您仍然可以使用 Nginx 本身来执行此操作。这使用 HTTP Basic Auth,将用户名和散列密码存储在文件中。(虽然这可能有效,但我发现很难调试。)

例子

完整的 Nginx 配置示例如下所示(未经测试,可能尚未完全发挥作用):

mail {
    server_name smtp.example.com;

    # Configure host and port of your Nginx HTTP Authentication server.
    auth_http localhost:8278;

    proxy_pass_error_message on;

    starttls on;
    ssl_certificate     /data/cert/fullchain.pem;
    ssl_certificate_key /data/cert/privkey.pem;

    server {
        listen           25;
        listen           587;
        listen           465 ssl;
        protocol         smtp;
        smtp_auth        login plain cram-md5;
        proxy_smtp_auth  on;
    }
}

答案3

Stackoverflow 用户有同样的问题,并针对此场景创建了自己的解决方案:go-smtpproxy. 来自 README:

其目的是提供充当服务器的功能,以接收来自下游客户端的 SMTP 消息。这些 SMTP 消息被中继到上游服务器。

命令/响应交换以透明方式传递。

相关内容