NGINX 通过 stream 模块实现 IMAP/POP3 的四层 TCP 代理,需启用 with-stream、配置顶层 stream 块、定义 upstream 和监听端口,并注意 SSL 透传、权限、防火墙及日志调试。

NGINX 本身不支持对 IMAP/POP3 等邮件协议做传统意义上的“反向代理”(即像 HTTP 那样解析、改写、负载均衡请求),但它可以通过 stream 模块 实现基于 TCP/UDP 层的透明转发——也就是常说的“四层代理”或“TCP 代理”。这是配置邮件网关最常用且可行的方式。
确认 NGINX 编译时启用了 stream 模块
IMAP/POP3 是 TCP 协议,必须依赖 NGINX 的 stream 模块。检查方式:
- 运行
nginx -V 2>&1 | grep -o with-stream,若输出with-stream,说明已启用; - 若无输出,需重新编译 NGINX 并添加
--with-stream参数; - Debian/Ubuntu 用户可安装
nginx-full包(默认含 stream);CentOS/RHEL 用户建议用 EPEL 源安装 nginx 或自行编译。
在主配置中引入 stream 块
NGINX 的 http 块无法处理非 HTTP 流量,所有邮件代理配置必须放在顶层 stream 块中(通常写在 nginx.conf 最外层,与 http 同级):
stream {
# 全局超时等基础设置(可选)
resolver 8.8.8.8 valid=30s;
proxy_timeout 1h;
proxy_responses 1;
<pre class="brush:php;toolbar:false;"># IMAP 代理(端口 143)
server {
listen 143;
proxy_pass mail_backend;
proxy_protocol on; # 如后端支持 PROXY 协议,可开启
}
# IMAPS 代理(端口 993)
server {
listen 993 ssl;
ssl_certificate /path/to/imaps.crt;
ssl_certificate_key /path/to/imaps.key;
proxy_pass mail_backend;
}
# POP3 代理(端口 110)
server {
listen 110;
proxy_pass mail_backend;
}
# POP3S 代理(端口 995)
server {
listen 995 ssl;
ssl_certificate /path/to/pop3s.crt;
ssl_certificate_key /path/to/pop3s.key;
proxy_pass mail_backend;
}
# 上游邮件服务器组
upstream mail_backend {
server 192.168.10.5:143; # 实际 IMAP/POP3 服务地址
# 可加多台,支持简单轮询
# server 192.168.10.6:143;
}
}
注意:SSL 终止仅适用于明文协议(如 143/110)加 TLS 封装场景;若后端本身用 STARTTLS 或纯 SSL(993/995),NGINX 的 SSL 配置只是透传加密连接,不参与解密——即不做 TLS 卸载,只做 TCP 转发 + SSL 握手代理。
关键配置说明与常见问题
- 不要在 stream 块里写 location / proxy_set_header:这些是 HTTP 模块指令,stream 中无效;
- 证书路径必须绝对且 NGINX 进程有读取权限;SELinux 或 AppArmor 启用时需额外放行;
- 防火墙需放行 110/143/993/995 端口,并确保后端服务器允许来自 NGINX IP 的连接;
-
客户端连接时使用公网 IP 或域名 + 对应端口,例如:
imap.example.com:143,DNS 解析到 NGINX 所在机器; -
健康检查需手动实现:stream 模块原生不支持 SMTP/IMAP 健康探测,可用
check指令(需打补丁)或外部脚本 +upstream_check_module(第三方模块);简单部署可先省略,靠 keepalive 和连接失败自动剔除。
验证与调试方法
启动前先检查语法:nginx -t;成功后重载:nginx -s reload。
- 用
telnet your-nginx-ip 143测试是否能连通并收到 * OK 响应; - 用
openssl s_client -connect your-nginx-ip:993 -servername imap.example.com验证 TLS 握手和证书; - 查看 NGINX error 日志(
error_log /var/log/nginx/stream_error.log debug;)定位连接拒绝、超时等问题; - 后端邮件服务日志中应看到客户端 IP 显示为 NGINX 服务器 IP(非原始用户 IP)——stream 默认不透传真实 IP,如需传递,需配合
proxy_protocol on+ 后端支持(如 Dovecot 配置protocol = proxy)。










