使用Nginx实现SSH跳板机方式
在企业级IT架构中,为了保障内网服务器的安全,通常不允许开发人员或运维人员直接通过公网SSH登录到内网服务器。取而代之的是通过一台跳板机(堡垒机)进行中转。虽然市面上有很多专业的堡垒机产品,但在一些轻量级需求场景下,利用已有的Nginx服务来实现SSH协议的四层转发,不仅成本低,而且配置简单、性能高效。
本文将详细介绍如何使用Nginx的stream模块配置SSH跳板机。
一、 原理简析
SSH协议基于TCP进行通信。Nginx不仅是一款优秀的HTTP七层反向代理服务器,还能通过stream模块实现四层(传输层)协议的转发。通过监听跳板机上的某个端口,Nginx可以将接收到的TCP流量直接转发至内网目标服务器的22端口,从而实现SSH代理。
二、 环境准备
在开始配置之前,请确保你的Nginx版本包含了stream模块。你可以通过以下命令检查:
nginx -V 2>&1 | grep --color=auto stream
如果在输出结果中看到了--with-stream,说明你的Nginx支持该功能。如果未包含,则需要重新编译安装Nginx,并在编译参数中加上--with-stream。
三、 基础配置:单台内网服务器转发
假设跳板机的公网IP为114.114.114.114,内网有一台目标服务器IP为192.168.1.100。我们希望通过跳板机的2222端口SSH登录到内网服务器。
编辑Nginx的配置文件nginx.conf,注意stream块必须与http块处于同一层级(即在主配置文件的最外层,不要放在http块内部)。
stream {
upstream ssh_backend {
# 内网目标服务器的IP和SSH端口
server 192.168.1.100:22;
}
server {
# 跳板机监听的端口
listen 2222;
# 将流量转发至内网服务器
proxy_pass ssh_backend;
# 连接超时时间
proxy_connect_timeout 10s;
# 空闲超时时间
proxy_timeout 300s;
}
}配置完成后,测试并重载Nginx:
nginx -t systemctl reload nginx
此时,在客户端使用以下命令即可登录内网服务器:
ssh -p 2222 username@114.114.114.114
四、 进阶配置:多台内网服务器转发
如果内网存在多台服务器,可以为不同的服务器分配跳板机上的不同监听端口。
stream {
upstream ssh_dev {
server 192.168.1.100:22;
}
upstream ssh_prod {
server 192.168.1.200:22;
}
# 开发环境服务器
server {
listen 2222;
proxy_pass ssh_dev;
}
# 生产环境服务器
server {
listen 2223;
proxy_pass ssh_prod;
}
}五、 安全加固:访问控制与日志
作为跳板机,安全性至关重要。我们可以利用Nginx的访问控制功能限制特定IP访问,并开启日志记录以便审计。
stream {
log_format proxy_log '$remote_addr [$time_local] '
'$protocol $status $bytes_sent $bytes_received '
'$session_time "$upstream_addr" '
'"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
access_log /var/log/nginx/stream_access.log proxy_log;
upstream ssh_backend {
server 192.168.1.100:22;
}
server {
listen 2222;
proxy_pass ssh_backend;
# 仅允许特定IP网段访问
allow 203.0.113.0/24;
# 拒绝其他所有IP
deny all;
}
}如果你通过Web管理界面(例如 https://www.ipipp.com)来集中监控和审计Nginx的运行状态及日志,请确保该管理界面本身也做好了严格的访问控制,防止未授权的访问带来安全隐患。
六、 总结
使用Nginx的stream模块实现SSH跳板机,是一种非常轻量级且高效的方案。它避免了部署复杂堡垒机系统的开销,同时借助于Nginx的高并发处理能力,能够稳定地支撑大量的SSH连接。结合访问控制和日志审计功能,可以很好地满足中小型企业对内网服务器安全访问的基本需求。