Nginx自1.9.0起原生支持TCP/UDP四层代理,需启用stream模块,配置须置于顶层;可反向代理SMTP/POP3/IMAP等协议,不解析应用层,低延迟高吞吐,但不支持TLS卸载、协议语义路由及内容日志。
Nginx 从 1.9.0 版本起原生支持 TCP/UDP 四层代理(需启用
模块),可用于对 SMTP、POP3、IMAP 等邮件协议做反向代理与负载分发。这不同于传统的 HTTP 七层代理,不解析应用层内容,只转发原始 TCP 流,因此低延迟、高吞吐,适合部署在邮件网关、多后端邮件服务器集群前。
确认 Nginx 已启用 stream 模块
默认编译的 Nginx(如 Ubuntu 官方包、CentOS 的 EPEL 包)通常已包含
模块,但需验证:
运行
,输出含
表示已启用
若无,需重新编译并添加
参数
配置不能写在
块内,必须置于顶层(与
同级)
基础 SMTP 反向代理配置示例
以下配置将公网 25 端口流量按轮询方式分发到两台后端 SMTP 服务器:
}
注意:
建议设为较大值(如 3600s),因邮件传输可能持续数分钟;
表示等待至少一个响应字节后再关闭连接,避免客户端误判失败。
支持多协议共存与端口映射
可同时代理 SMTP(25/465/587)、POP3(110/995)、IMAP(143/993)等,只需为每类协议定义独立
块:
SMTP 提交端口(587)建议单独监听,便于与接收端口(25)策略分离
SSL/TLS 端口(如 465、993、995)直接透传,Nginx 不解密——证书由后端邮件服务器管理
若需 TLS 终止(如统一证书、审计需求),则需用支持 TLS 的四层代理(如 HAProxy),Nginx 开源版
不支持 TLS 卸载
关键注意事项与限制
Nginx stream 代理邮件协议虽轻量,但有几点务必注意:
无法识别邮件协议语义(如 MAIL FROM、RCPT TO),故不支持基于发件人/收件人的路由规则
不记录邮件内容或会话日志(
在 stream 中仅支持连接级日志,如 client ip、backend ip、连接时长)
后端服务器需正确配置 HELO/EHLO 响应及反向 DNS,否则可能被外部邮件服务器拒收
若后端使用认证(如 SASL),确保认证流程不依赖客户端 IP 绑定——代理后真实客户端 IP 是 Nginx 机器地址,需通过
透传(需后端支持)
streamstreamnginx -V 2>&1 | grep -o with-streamwith-stream--with-streamstreamhttp{}http
stream {
upstream smtp_backend {
server 192.168.1.10:25 weight=1;
server 192.168.1.11:25 weight=1;
# 可选:开启健康检查(Nginx Plus 支持;开源版需配合外部脚本或 keepalived)
}
server {
listen 25;
proxy_pass smtp_backend;
proxy_timeout 1h;
proxy_responses 1; # 防止连接空闲超时断开
}proxy_timeoutproxy_responses 1serverstreamlog_formatproxy_protocol