nginx stream模块通过四层tcp透传代理邮件协议,不解析应用层内容,仅转发字节流;需编译启用--with-stream,配置置于顶层stream{}块中,支持负载分发但无tls卸载、协议感知与语义健康检查能力。

Nginx 的 Stream 模块通过四层(L4)TCP 透传方式代理邮件协议流量,不解析 SMTP/POP3/IMAP 应用层内容,仅转发原始字节流。它适合做轻量级网关或负载分发,但不能替代专业邮件服务器。
确认模块已启用
Stream 模块需在编译时加入 --with-stream 参数。验证方法:
- 运行
nginx -V 2>&1 | grep with-stream,输出含该字符串即支持 - 若无输出,需重新编译或换用官方预编译包(如 nginx.org stable 版)
- 配置必须放在顶层
stream { ... }块中,不可嵌套在http{}内
基础 SMTP 代理配置
监听 25 端口并转发至内网 MTA,示例如下:
stream {upstream smtp_backend {server 192.168.10.10:25 weight=2;server 192.168.10.11:25 max_fails=3 fail_timeout=30s;}server {listen 25;proxy_pass smtp_backend;proxy_timeout 30s;-
proxy_responses 1;(防止连接复用干扰单次邮件会话) }}
关键限制与注意事项
Stream 模块用于邮件协议存在硬性约束,部署前必须明确:
- 不支持 TLS 卸载:STARTTLS 或 SMTPS 流量只能直通,证书由后端 MTA 管理
- 无协议感知能力:无法识别 AUTH、HELO、CAPABILITY 等指令,也不能做会话保持
- 健康检查仅限 TCP 连通性:无法探测后端是否能正常响应 SMTP 命令,可能误判“可连但认证失败”的节点为健康
- 不记录应用层日志:无法审计邮件地址、主题或命令交互,仅能记录连接建立/断开
替代方案建议
若需协议识别、统一 TLS 终止或认证干预,应考虑:
- 启用 Nginx 的 mail 模块(需
--with-mail编译),配合auth_http脚本实现基础认证中继 - 使用 HAProxy:支持 SNI、SSL 卸载、SMTP/IMAP 语义探活(如
smtp-check) - 部署专用邮件网关(如 Mailu、Mailcow 或商业方案),兼顾安全、审计与协议兼容性











