`
xiaolin0199
  • 浏览: 565495 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

如何用 nginx 做 postfix 的 SMTP 反向代理,以及 XCLIENT 的支持

 
阅读更多

原文引用 http://www.dup2.org/node/946

 

 

作为 lighttpd 的竞争者,轻量级web服务器 nginx 最近才开始崭露头角,知道它还可以用来做 pop3/imap4 反向代理的估计就比较少了,至于用 nginx 做 smtp 的反向代理,估计全中国现在和我一样想到这个需求的人一只手就能数过来。

 

需要 smtp 反向代理是因为我们的 vip 邮箱是可以免费试用的,希望在策略上对已交费用户和免费试用用户(其中有相当部分是 spammer)做出不同处理。前面用 nginx 把不同的用户请求代理到后台不同的 postfix 上,然后 postfix 再各自配置不同的 Milter Server 做过滤。另外需要前台能支持 XCLIENT,这样 postfix/milter 可以得到客户端的 IP,对于 anti-spam 来说是很有意义的。

 

nginx 在大约一年前增加了对 XCLIENT 的支持,对于 webmail 服务来说,nginx 可以说是再完美不过的反向代理前台了。

 

nginx 配置 smtp 反向代理需要在配置文件里加这么一段:

mail {
    auth_http http://127.0.0.1/auth;
    server {
        listen 26;
        protocol smtp;
        proxy on;
        smtp_auth login plain;
    }
}

 

 

用 python 写一个简单的 auth 服务来做测试

import SimpleHTTPServer

class handler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        if (self.path == '/auth'):
            # verify 'Auth-User', 'Auth-Pass', 'Client-IP'
            if self.headers.get('Auth-Protocol') == 'smtp':
                self.send_response(200)
                self.send_header("Auth-Status", "OK");
                self.send_header("Auth-Server", "127.0.0.1");
                self.send_header("Auth-Port", "25");
                self.end_headers()
                return

addr = ('', 80)
httpd = SimpleHTTPServer.BaseHTTPServer.HTTPServer(addr, handler)
httpd.serve_forever()

 

 

修改 postfix 的 main.cf 配置,允许 nginx 代理服务器发送 XCLIENT 命令

smtpd_authorized_xclient_hosts = 127.0.0.0/8

 

写道
理论来说,到这里就应该就都配置好了。但是 nginx 会带上一个 LOGIN=foobar 的属性发给后台,而 postfix 是不支持该属性的,这将导致 postfix 报告一个 Bad XCLIENT attribute name: LOGIN 的 501 错误。很疑惑当初贡献这段代码的人是用什么 smtp server 做后台的,总之和 postfix 配合的话,必须修改 nginx 的程序(比修改 postfix 要简单些): 找到 src/mail/ngx_mail_proxy_module.c 里 "case ngx_smtp_helo:" 的那一部分,把和 "LOGIN" 相关的代码去掉就好了

 

附:最后决定利用周末时间写一个 patch,希望会被 nginx 接纳.

http://www.dup2.org/files/nginx-0.5.35-xclient.patch

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics