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 { } 块:
- 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)中显式放行。











