Stream模块用于TCP/UDP四层代理,需启用--with-stream编译选项,配置包含upstream、server监听、超时及安全参数,支持SSH、MySQL、Kafka等非HTTP流量转发。

Stream 模块用于四层(TCP/UDP)代理,适合 SSH、MySQL、Redis、Kafka 等非 HTTP 流量。它不解析协议内容,只做原始连接转发,因此配置核心是:**确保网络可达、正确映射端口、合理设置超时与安全控制**。
确认 Stream 模块已启用
这是前提,缺一不可:
- 运行
nginx -V 2>&1 | grep with-stream,有输出说明已编译支持 - 若无结果,需重编译 Nginx 并添加
--with-stream参数 - Debian/Ubuntu 推荐安装
nginx-full;CentOS/RHEL 建议用官方源或手动编译,避免默认包缺失该模块 - 主配置中需启用 stream 配置加载,如:
include /etc/nginx/stream-enabled/*.conf;
基础 TCP 代理配置结构
stream 块与 http 块同级,不能嵌套在 http 内。典型结构如下:
- 定义 upstream 组,列出真实内网服务地址(如
192.168.1.10:22) - server 块监听公网端口(如
listen 2201;),并指向对应 upstream - 务必设置
proxy_timeout和proxy_connect_timeout,避免连接僵死 - 数据库类协议建议加
proxy_responses 1;,防止粘包或响应错乱
按场景选配关键参数
不同服务对代理行为要求不同:
-
SSH 代理:推荐端口映射法(如 2201→内网A、2202→内网B),可加
limit_conn addr 3;防暴力尝试 -
MySQL/RDS 代理:若走明文,直接转发;若需加密,server 块启用
ssl,配证书,并要求客户端强制 SSL 连接 -
Kafka 代理:注意 advertised.listeners 返回的是内网地址,Nginx 仅透传流量,不改写元数据;SSL 场景需在 server 块配置
ssl_certificate和ssl_protocols -
高可用需求:upstream 中可加
max_fails=2 fail_timeout=30s实现简单健康检查(依赖后端支持 TCP 探针)
安全与调试注意事项
生产环境不能忽略这些细节:
- 防火墙必须放行 Nginx 监听端口,且 Nginx 服务器能直连目标内网 IP(路由通、端口开)
- stream 模块不支持
X-Forwarded-For,如需传递客户端真实 IP,需前置设备开启 PROXY 协议,并在 server 块加proxy_protocol on; - 双向 TLS(mTLS)需 Nginx 校验客户端证书(
ssl_verify_client on),同时后端数据库也要启用 SSL 并绑定证书用户 - 修改配置后执行
nginx -t校验语法,再systemctl reload nginx生效


















