Nginx反向代理SSH实战:5分钟搞定外网安全登录(附IP黑白名单配置)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值