nginx stream模块可四层代理ssh,仅tcp透传、不解析协议;需确认启用--with-stream,配置upstream与server实现端口映射,支持ip白名单、超时控制、连接限速及日志,并建议结合nftables/iptables双重防护。

Nginx 的 Stream 模块能以四层方式代理 SSH 连接,本质是 TCP 透传,不解析协议内容,只做端口映射和连接转发。它不能识别用户名或主机名(SSH 协议无 Host 字段),但能统一入口、控制访问、隐藏内网结构。
确认 Stream 模块已启用
这是硬性前提,否则配置无效:
- 运行
nginx -V 2>&1 | grep with-stream,有输出说明已编译支持 - 若无结果,需重新编译 Nginx 并添加
--with-stream参数 - Debian/Ubuntu 用户可直接安装
nginx-full包;CentOS/RHEL 建议使用官方源或手动编译
配置端口映射实现多机接入
最常用也最可靠的方式:为每台内网服务器分配独立公网端口
- 公网 2201 → 内网 192.168.1.10:22(服务器 A)
- 公网 2202 → 内网 192.168.1.11:22(服务器 B)
- 公网 2203 → 内网 192.168.1.12:22(服务器 C)
配置写在 nginx.conf 顶层(与 http { } 同级):
stream {
upstream ssh_a { server 192.168.1.10:22; }
upstream ssh_b { server 192.168.1.11:22; }
upstream ssh_c { server 192.168.1.12:22; }
server { listen 2201; proxy_pass ssh_a; proxy_timeout 1h; }
server { listen 2202; proxy_pass ssh_b; proxy_timeout 1h; }
server { listen 2203; proxy_pass ssh_c; proxy_timeout 1h; }
}
加 IP 白名单限制访问来源
适合跳板机或固定办公出口场景:
- 在
stream { }块开头添加allow和deny all - 每个
allow行写一个可信 IP 或 CIDR 段,例如allow 10.20.30.40;或allow 192.168.5.0/24; - 必须以
deny all;结尾,否则默认全部放行 - 规则按顺序匹配,先中即止
补充连接行为控制
增强稳定性和安全性:
- 设置合理超时:
proxy_connect_timeout 5s; proxy_timeout 1h; - 限制单 IP 并发数(需启用
ngx_stream_limit_conn_module):limit_conn_zone $binary_remote_addr zone=ssh_limit:10m; limit_conn ssh_limit 3;
- 开启连接日志便于排查:
access_log /var/log/nginx/stream_ssh.log proxy;
建议搭配系统防火墙双重防护
Nginx 层的 allow/deny 是应用层控制,nftables 或 iptables 可在内核层提前拦截:
- 只允许跳板机访问代理端口(如 2201):
nft add rule inet filter input tcp dport 2201 ip saddr { 10.20.30.40 } accept nft add rule inet filter input tcp dport 2201 drop - 防火墙规则优先执行,能更快丢弃非法请求,减轻 Nginx 负担
不复杂但容易忽略











