Nginx Stream 可安全代理 RDP/SSH,核心是控制入口、透传协议与强化边界;需启用 stream 模块,配置 upstream 与 server,配合 IP 白名单和故障转移提升安全性。
用 Nginx Stream 实现 RDP 或 SSH 的安全代理,核心不是“加密流量”,而是“控制连接入口 + 透传协议 + 强化访问边界”。它不替代 TLS 或 Windows NLA,但能显著缩小暴露面、阻断无效扫描、统一接入策略。
确认 Nginx 已支持 Stream 模块
这是前提,缺一不可:
运行nginx-V 2>&1 | grep with-stream,有输出才说明已启用;
若无结果,需重新编译安装(加--with-stream参数),或改用官方预编译包(如 nginx.org 提供的 stable 版);
Debian/Ubuntu 用户可尝试安装nginx-full包,通常含 Stream 支持。
基础代理配置:RDP 和 SSH 共用一套逻辑在nginx.conf顶层(与http { }平级)添加stream { }
块:
Nginx在宝塔面板中轻松管理Nginx高性能Web服务器。提供可视化配置反向代理、负载均衡、SSL证书及HTTP缓存功能,一键优化高并发性能,助您高效搭建稳定、快速的网站运行环境。
下载RDP 示例(端口 3389):stream {upstream rdp_pool {hash $remote_addr consistent;server 192.168.1.10:3389 weight=5;server 192.168.1.11:3389 weight=5;}server {listen 3389;proxy_pass rdp_pool;proxy_timeout 1h;proxy_responses 1;}}SSH 示例(监听非标端口提升隐蔽性):stream {upstream ssh_pool {server 192.168.0.2:22;}server {listen 11682;proxy_pass ssh_pool;proxy_connect_timeout 1h;proxy_timeout 1h;}}
关键点:
–hash $remote_addr对 RDP 必须,确保同一用户始终连到同一后端,避免会话中断;
– SSH 不强制要求哈希,但若后端启用了会话复用或密钥绑定,也建议加上;
–proxy_timeout设长(如 1h),避免 Nginx 主动断开空闲连接(RDP/SSH 的空闲策略由终端系统控制);
–proxy_responses 1提升首次握手成功率,尤其对 RDP 这类多轮协商协议有效。
安全增强:IP 白名单 + 故障转移仅做透传远远不够,真正起防护作用的是访问控制层:在stream块中无法直接写allow/deny(那是 http 模块的功能),但可通过系统防火墙或 stream 的map指令实现粗粒度过滤;
更推荐做法:在 Nginx 前部署一层iptables或nftables,只放行可信办公网段(如
192.168.10.0/24
)或企业出口 IP;
故障转移配置示例:
upstream rdp_pool {server 192.168.1.10:3389 max_fails=3 fail_timeout=30s;server 192.168.1.11:3389 backup;}当主节点连续三次 TCP 握手失败,Nginx 自动将其剔除 30 秒,期间流量切至 backup 节点。
兼容性注意事项避免因协议细节导致连接失败:RDP 的 NLA(网络级别身份验证)一般无需关闭——Stream 是纯 TCP 透传,TLS 握手由客户端和 Windows 主机完成;
若出现“由于发生错误,连接被终止”,先检查后端服务器时间是否同步、证书是否有效,再考虑临时禁用 NLA 排查;
SSH 场景下,客户端完全无感知,Xshell、MobaXterm 等工具直连 Nginx 监听端口即可,无需额外配置;
所有代理端口必须在系统防火墙(firewalld或ufw)中显式放行。
