原文引用 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
附:最后决定利用周末时间写一个 patch,希望会被 nginx 接纳.
http://www.dup2.org/files/nginx-0.5.35-xclient.patch