nginx stream模块通过tcp/udp层透明转发实现内网服务对外代理,不解析协议,仅中继字节流;需确认启用--with-stream编译选项,配置位于顶层stream块,支持upstream与server定义端口映射和连接透传,并需配套安全加固措施。

Nginx 的 Stream 模块通过四层(TCP/UDP 层)透明转发实现内网服务的对外代理,不解析协议内容,只做原始字节流中继。它适用于 SSH、MySQL、Redis、Git over SSH 等非 HTTP 服务,核心是端口映射 + 连接透传。
确认 Stream 模块已启用
这是所有配置的前提,缺一不可:
- 运行
nginx -V 2>&1 | grep with-stream,输出含--with-stream表示已支持 - Ubuntu/Debian 推荐安装
nginx-full包;CentOS/RHEL 建议使用官方源或手动编译 - 若无输出,需重新编译 Nginx 并追加
--with-stream(可同步加--with-stream_ssl_module支持 TLS 透传)
在顶层配置 stream 块
Stream 配置必须与 http { } 同级,不能嵌套其中。典型结构如下:
- 用
upstream定义内网后端(支持单台或多台,可配负载策略) - 用
server声明公网监听地址和端口(如listen 2222或listen 1.2.3.4:3307) -
proxy_pass指向 upstream 名称,完成流量转发 - 建议设置
proxy_timeout 1h防止 NAT/防火墙中断空闲连接
按服务类型配置示例
不同服务对参数敏感度不同,需针对性调整:
-
SSH:监听非标准端口(如 2201),避免被暴力扫描;可加
limit_conn addr 3控制单 IP 并发数 -
MySQL:建议设
proxy_responses 1,确保握手响应一到达即转发 - Git over SSH:后端保持默认 22 端口,公网暴露 2222 等替代端口,提升隐蔽性
- 多台机器统一接入:为每台内网服务器分配独立公网端口(如 2201→A、2202→B),无需改客户端配置
配套安全与可用性措施
Stream 本身不提供认证或加密,需额外加固:
- 用
ufw或iptables限制监听端口仅允许可信 IP 访问 - 禁止直接暴露数据库、Redis 等敏感端口到公网;必要时前置 SSH 隧道或 TLS 终止层
- 如需用户级鉴权,应搭配
auth_http模块或部署独立认证网关 - 通过
ss -tlnp | grep :端口和nginx -t验证监听状态与配置语法











