leoyin
作者leoyin·2014-03-07 22:16
软件开发工程师·海康

Nginx 实现Domino 邮件(pop3/imap及smtp)服务统一域名(ip)

字数 3168阅读 15352评论 1赞 1
           随着企业员工人数增长,domino邮件服务器一变二,二变四。用户通过outlook等收发邮件逐渐成为麻烦事。
           统一域名一般回考虑反向代理,IBM推荐使用Perdition,说是简单,配置一下就OK了,网络搜索半天找到一点资料介绍的也很少。Nginx虽然国内一直用来做Http反向代理实现统一域名、web加速、cdn服务等,但其最初也是为解决邮寄反向代理而设计,二期文档看起来比较清晰,百度(因为一些你懂得的原因,google有时候不如baidu方便)内容比较多。经过两天的查阅资料和尝试,居然成功了,现将从问题现状,方案思路、实现步骤及主要点意义进行介绍。

一。问题现状
开始之前,我们需要先简单介绍一下POP3/IMAP与SMTP的差异。
SMTP,投递邮寄用的,可以理解为邮筒。我们投递邮件的邮筒时,一般都是寄件地附近的邮筒,这不是固定的,可以时任何一个邮筒。POP3/IMAP,收件服务,帮助我们把邮寄从自己的邮箱取出。我们的邮箱是固定再一个地方的。POP3/IMAP收件时需要准确知道我们的邮箱在哪里。不然我们就无法正确收到邮寄。
基于上面说所说,我们假设企业有mailserverA,mailserverB两台邮寄服务器。用户userA的邮箱在mailserverA上,用户userB的邮箱在mailserverB上,那么我们userA发送邮寄时,他的SMTP使用mailserverA或者mailserverB都可以,而同样userB也可以使用任意一台mailserver作为其SMTP投递邮寄的服务器。但对于pop3/imap来说,userA只能从mailserverA服务收取邮寄,userB只能从mailserverB获取邮寄。
       对于发送邮寄,我们可以通过(反向代理等)负载均衡策略,对用户提供一个SMTP地址,实现两台mailserver之一为用户提供邮寄投递服务。单对邮寄收取,我们通过反向代理提供的统一地址收取邮寄时,反向代理服务器必须准确知道当前用户的邮箱所在服务器,才可以正常完成邮件的收取,如果服务器错误,找不到mailbox,则将表现为无邮寄可收。
  

         二。解决方案
理清楚现状只后,可以看出POP3和IMAP的除了方式应该和SMTP分开处理,对POP3/IMAP,我们需要代理服务器根据用户获取用户邮箱所在服务器,SMTP相对比较简单,只要做好负载均衡即可。

        再看Nginx,通过文档我们清楚,Nginx通过auth_http模块进行认证,并返回目标一个服务器ip以及一个端口或错误给nginx的pop3/imap/smtp 服务(关于auth_http的更多介绍吸参考nginx官方文档),nginx再根据饭后服务器ip和端口进行相应的收发操作并返回给请求者,或者将错误返回给请求者。
        auth_http模块在pop3/imap下提供的是认证(可不认证),返回用户邮箱所在服务器ip的功能,而auth_http本身是通过一个http请求CGI程序获取信息的,既然如此,我们的CGI程序就可以使用php或者domino的http服务提供了。
        实际上,我们通过domino代理(根据用户名称通过names库获取用户文档得到用户服务器名称,或者namelookup获取)和php(通过ldap获取用户信息得到服务器名称)都实现了根据用户信息获取用户邮箱所在服务器的功能。
       对smtp,nginx是提供smtp服务,然后根据auth_http饭后打server地址,将邮寄投递给对于的smtp服务器。这时,不是用户直接通过客户端将邮寄投递给domino,因此用户之前的认证信息讲话失效。auth_http此时一个主要的作用就是认证。而domino服务器也需要将nginx的smtp加入白名单。当然后下我们会讲到,smtp如何进行负载均衡的处理。


三。实现步骤

Step1.准备服务器(笔者使用的是Centos6.3)
Step2.修改防火墙,开发相关端口。笔者为方便直接关闭防火墙。
Step3.安装Nginx,关于Nginx的安装百度资料一大巴,这里不再赘述。需要注意在Centos下不能使用yum安装。需要自行编译安装,并将 --with-mail --with-mail_ssl_module 两个模块安装上
Step4.配置Nginx.conf. 参照nginx文档 nginx-mail-core 部分即可。
Step5.编写auth_http CGI 程序(domino代理或者php)
Step6.修改domino 消息配置文件,将 nginx smtp服务器加入白名单。
Step7.重启Domino smtp (tell smtp q  , load smtp)
Step8.使用Outlook添加账户,测试

以上为简单步骤描述,具体操作细节如Centos 安装,Nginx安装,防火墙设置,Nginx具体配置等由于对应文档百度一大把,这里不再赘述。

四.注意点
1.如果使用domino代理进行auth_http 的认证CGI实现,可以将 auth_http ,指向如:localhost:80/mailauth.nsf/auth?openagent。然后nginx配置一个proxy_pass 指向一个 upstream进行负载均衡处理(因为一个domino server 的agent并发只有10个,通过负载均衡除了可以提高并发数量)。另外 mailauth.nsf/auth需要允许匿名访问,同时auth代理需要设置安全级别为2或者3,这样才可以访问names。获取从names获取用户邮箱服务器,可以使用 name lookup公式获取。
另外也可以使用表单来实现auth?open agent的返回输出,有情趣的同学可以试一下,如果可行,可以解决agent并发限制问题。
     2.auth_http饭后server地址需要是ip地址,否则nginx将不能正确识别
     3.pop3/IMAP服务与SMTP服务在Nginx的除了不同,用发给nginx的验证信息会再次发给domino服务器,因此auth_http的cgi程序可以对pop3/imap不进行身份验证
    4.nginx可以启用ssl,nginx代理转发给domino,domino可以不启用;启用ssl需要证书,可以使用Domino的ssl证书,也可以自己制作证书。关于制作正式相关内容百度有大量openssl 制作、发布证书的内容。
   5.关于smtp发送邮寄,可以使用iptables 转发进行负载均衡,这样不需要对domino配置进行修改。
   6.使用smtp转发,如果auth_http 的cgi时domino代理,并且安上面所属使用了负载均衡,则可以在不同服务器上的cgi返回当前服务器ip,从而一起实现负载均衡,当然也可以使用用户邮寄所在服务器,这样可能不如前者更均衡。




如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论1 条评论

sungm1984sungm1984系统运维工程师Beyondsoft
2015-05-29 16:30
我们用perdition实现的,我当时是按照perdition官网的参数一个一个试出来的。后来看到Nginx瞬间觉得还是Nginx配置简单,除了自己写一段auth的代码将要求的格式添加到response的http header中。
这有一个链接,不过这个家伙没有写完整:http://gaowenlong.blog.51cto.com/451336/1282071
Ctrl+Enter 发表

作者其他文章

相关问题

相关资料

X社区推广