最简洁做法是在 Nginx stream 模块中用 allow/deny 控制源 IP,需先确认启用 --with-stream 编译选项,再在 stream 块中配置白名单及 deny all,并可叠加超时、限连、日志与系统防火墙实现双重防护。

直接在 Nginx stream 模块中用 allow/deny 控制源 IP,是最简洁、最贴近需求的做法。它不依赖外部工具,规则与代理逻辑同级生效,适合跳板机这类固定可信入口的场景。
确认并启用 stream 模块
运行 nginx -V,检查输出是否含 --with-stream。若没有,需重新编译 Nginx 并加上该参数。这是所有 stream 功能的前提,缺省不可用。
配置白名单只放行跳板机 IP
在 nginx.conf 顶层(与 http 块平级)添加 stream 块,写明允许的跳板机地址,其余一律拒绝:
- 每个
allow行写一个跳板机 IP 或 CIDR 网段,例如allow 10.20.30.40;或allow 192.168.5.0/24; - 末尾必须加
deny all;,否则默认全部放行 - 规则按顺序匹配,先匹配到即生效,无需额外条件判断
示例配置:
stream {allow 10.20.30.40;
allow 10.20.30.41;
deny all;
upstream ssh_backend {
server 192.168.1.100:22;
}
server {
listen 2222;
proxy_pass ssh_backend;
proxy_timeout 1h;
}
}
补充连接行为控制
IP 白名单是第一道防线,再叠加基础连接管理可进一步防滥用:
- 设短连接超时:
proxy_timeout 3s;防慢速攻击或空闲连接堆积 - 限制单 IP 并发数(需加载
ngx_stream_limit_conn_module):limit_conn_zone $binary_remote_addr zone=ssh_limit:10m;limit_conn ssh_limit 2;(每个跳板机最多 2 个并发 SSH 连接) - 开启连接日志:
access_log /var/log/nginx/stream_ssh.log proxy;,便于事后追溯来源和状态
建议搭配系统防火墙做双重防护
仅靠 Nginx stream 的 allow/deny 虽够用,但操作系统级防火墙更底层、更高效:
- 用
nftables(推荐)或iptables,在 INPUT 链直接拦截非跳板机对代理端口(如 2222)的访问 - 例如只允跳板机访问 2222 端口:
nft add rule inet filter input tcp dport 2222 ip saddr { 10.20.30.40, 10.20.30.41 } acceptnft add rule inet filter input tcp dport 2222 drop - 防火墙规则优先于 Nginx 处理,能更快丢弃非法请求,减轻 Nginx 负担


















