Nginx反向代理SSH实战:5分钟搞定外网安全登录(附IP黑白名单配置)
每次把SSH端口暴露在公网上,就像把自家大门的钥匙挂在门外,总有些不速之客想试试手气。我见过太多服务器因为默认的22端口开放,日志里塞满了来自全球各地的暴力破解尝试,轻则账号被锁,重则防线被破。对于运维和开发者来说,既要保证远程访问的便捷,又得把安全门槛筑高,这中间的平衡点其实有更优雅的解法——用Nginx给SSH加一道智能门卫。
传统的做法可能是改端口、用密钥登录,或者上更重的堡垒机。但今天我想分享的,是一种利用Nginx stream模块实现的反向代理方案。它妙在哪儿?你无需改动SSH服务本身的任何配置,就能在流量抵达SSH之前,完成端口转发、访问控制、甚至简单的负载均衡。相当于在SSH外面套了一层“过滤壳”,所有连接先经过Nginx的规则审查,合法的放行,可疑的直接挡在门外。接下来,我会带你一步步搭建这个“门卫系统”,并深入每个配置参数背后的逻辑,最后给你一套能直接用的企业级IP过滤模板。
1. 为什么Nginx能代理SSH?理解Stream模块
很多人对Nginx的印象还停留在HTTP/HTTPS的反向代理和负载均衡上。确实,http模块是它的看家本领。但自从Nginx 1.9.0版本引入了stream模块,它的能力边界就扩展到了TCP和UDP流量的代理。SSH协议正是基于TCP的,这扇门就此打开。
stream模块的工作原理,可以理解为在传输层(TCP/UDP)进行流量转发。它不解析SSH协议的具体内容(那是SSH客户端和服务端的事),只负责把客户端发来的TCP数据包,原封不动地转发到后端的SSH服务器。这个过程对客户端是透明的,它依然觉得自己在直接连接SSH服务。
与HTTP代理的核心区别:
http模块:工作在应用层,能理解HTTP协议,可以修改请求头、根据URL做路由、进行内容压缩等。stream模块:工作在传输层,对应用层协议无感知,只进行简单的四层转发,性能开销极低。
对于SSH代理这种场景,我们不需要解析SSH协议内容,只需要控制“谁可以连接”以及“连接到哪里”,因此stream模块是绝配。它的配置语法和http模块很像,学习成本很低。
注意:确保你的Nginx版本在1.9.0以上,并且编译时包含了
--with-stream模块。可以通过nginx -V命令查看编译参数。
2. 实战部署:从零搭建SSH反向代理网关
理论清楚了,我们动手搭建。假设你有一台公网服务器(IP: 203.0.113.10),SSH服务运行在默认的22端口。我们的目标是让Nginx监听22端口,然后将流量转发到内部SSH服务的另一个端口(比如1022),同时实施访问控制。
2.1 环境准备与依赖检查
首先,登录你的服务器,确认Nginx的版本和模块支持。
# 查看Nginx版本及编译参数
nginx -V 2>&1 | grep -o with-stream
如果输出中包含 with-stream,说明已支持。如果没有,你需要重新编译Nginx或通过包管理器安装包含stream模块的版本(例如,在Ubuntu上,nginx-extras 包通常包含该模块)。
接下来,为我们的代理配置创建一个独立的配置文件。良好的习惯是将不同功能的配置分离,便于管理。
# 进入Nginx配置目录(通常为 /etc/nginx)
cd /etc/nginx
# 创建stream配置的目录(如果不存在)
sudo mkdir -p stream.conf.d
# 创建我们SSH代理的专属配置文件
sudo nano stream.conf.d/ssh-proxy.conf
2.2 核心配置解析与编写
现在,打开刚创建的 ssh-proxy.conf 文件,我们将逐段编写并解释配置。
第一步:定义上游SSH服务器组
在stream上下文中,我们使用 upstream

&spm=1001.2101.3001.5002&articleId=152361505&d=1&t=3&u=a821049bcc184b908e58087c196eec58)
345

被折叠的 条评论
为什么被折叠?



