跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

Nginx利用TCP代理实现邮件协议反向代理分发

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

相关文章