欢迎光临本地信息咨询网
详情描述

方案概述

使用 Nginx 的 ngx_stream_proxy_module 模块实现 TCP 级别的 SSH 端口转发,通过 SSL/TLS 加密通道。

配置步骤

1. 安装 Nginx(包含 Stream 模块)

# Ubuntu/Debian
sudo apt update
sudo apt install nginx libnginx-mod-stream

# CentOS/RHEL
sudo yum install nginx nginx-mod-stream

2. 配置 Nginx Stream 模块

编辑 /etc/nginx/nginx.conf,在 http 块同级添加 stream 配置:

# /etc/nginx/nginx.conf
events {
    worker_connections 1024;
}

# SSH 代理配置(TCP 层)
stream {
    # 上游 SSH 服务器组
    upstream ssh_backend {
        server 192.168.1.100:22;  # 目标服务器1
        server 192.168.1.101:22;  # 目标服务器2
        server 192.168.1.102:22;  # 目标服务器3
    }

    # SSH 代理服务器配置
    server {
        listen 8022;  # 代理监听端口
        proxy_pass ssh_backend;
        proxy_connect_timeout 30s;
        proxy_timeout 1h;

        # 可选:SSL/TLS 加密
        # ssl_preread on;
        # ssl_certificate /path/to/cert.pem;
        # ssl_certificate_key /path/to/key.pem;
    }

    # 基于 SNI 的多域名转发
    map $ssl_preread_server_name $backend_name {
        host1.example.com   192.168.1.100:22;
        host2.example.com   192.168.1.101:22;
        default            ssh_backend;
    }

    server {
        listen 8023 ssl;
        ssl_preread on;
        proxy_pass $backend_name;
        ssl_certificate /etc/nginx/ssl/cert.pem;
        ssl_certificate_key /etc/nginx/ssl/key.pem;
    }
}

http {
    # 原有的 HTTP 配置...
}

3. 使用 SSL/TLS 加密(推荐)

# 生成自签名证书
sudo mkdir -p /etc/nginx/ssl
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/nginx/ssl/ssh-proxy.key \
    -out /etc/nginx/ssl/ssh-proxy.crt \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=Company/CN=ssh-proxy.example.com"

4. 客户端连接方式

方式一:直接连接(无 SSL)
# 使用 ProxyCommand
ssh -o ProxyCommand="nc -X connect -x nginx-host:8022 %h %p" user@target-host

# 或配置 ~/.ssh/config
Host jump-host
    HostName nginx-host
    Port 8022
    User your-username
方式二:通过 SSL/TLS 连接
# 使用 sslh 或自定义代理
# 安装 sslh(应用层分流)
sudo apt install sslh

# sslh 配置(将 SSH 和 HTTPS 分流到不同端口)

5. 高级配置:基于认证的转发

stream {
    # 带认证的 SSH 代理
    server {
        listen 8024;

        # 使用 nginx 的 auth 模块或结合 Lua 脚本
        # proxy_pass ssh_backend;

        # 通过变量控制访问
        set $allow_access 0;

        # 这里可以结合 nginx 的 http 认证模块
        # 或使用 nginx-stream-lua-module
    }
}

6. 完整示例:HTTP + SSH 混合配置

# /etc/nginx/nginx.conf
user nginx;
worker_processes auto;

events {
    worker_connections 1024;
}

# SSH 隧道配置
stream {
    # 日志格式
    log_format proxy '$remote_addr [$time_local] '
                     '$protocol $status $bytes_sent $bytes_received '
                     '$session_time "$upstream_addr"';

    access_log /var/log/nginx/ssh-access.log proxy;
    error_log /var/log/nginx/ssh-error.log;

    # 目标服务器映射
    map $ssl_preread_server_name $target_backend {
        web-server     192.168.1.100:22;
        db-server      192.168.1.101:22;
        app-server     192.168.1.102:22;
        default        192.168.1.100:22;
    }

    # SSL 加密的 SSH 代理
    server {
        listen 443 ssl reuseport;
        ssl_preread on;
        proxy_pass $target_backend;
        proxy_connect_timeout 30s;
        proxy_timeout 2h;

        ssl_certificate /etc/nginx/ssl/cert.pem;
        ssl_certificate_key /etc/nginx/ssl/key.pem;
    }

    # 明文 SSH 代理(内网使用)
    server {
        listen 8022 reuseport;
        proxy_pass 192.168.1.100:22;
        proxy_buffer_size 16k;
    }
}

# Web 服务配置
http {
    # ... 原有的 HTTP 配置
    server {
        listen 80;
        server_name jump.example.com;

        # 跳板机管理页面
        location / {
            root /usr/share/nginx/html;
            index index.html;
        }

        # SSH over WebSocket 示例(使用 websockify)
        location /ssh/ {
            proxy_pass http://127.0.0.1:6080;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    }
}

7. 客户端配置示例

~/.ssh/config 文件配置:

# 通过 Nginx 代理连接
Host *.internal
    ProxyCommand nc -X connect -x nginx-proxy:8022 %h %p
    ServerAliveInterval 60
    TCPKeepAlive yes

# 具体主机配置
Host web-server
    HostName web-server.internal
    User admin
    Port 22

Host db-server
    HostName db-server.internal
    User root
    Port 22

8. 安全加固建议

# 限制访问 IP
server {
    listen 8022;
    allow 10.0.0.0/8;    # 内网 IP 段
    allow 192.168.1.0/24;
    deny all;

    proxy_pass ssh_backend;

    # 连接速率限制
    proxy_upload_rate 512k;
    proxy_download_rate 2m;
}

# 连接数限制
limit_conn_zone $binary_remote_addr zone=ssh_conn:10m;

server {
    listen 8022;
    limit_conn ssh_conn 5;  # 每个 IP 最多 5 个连接
    proxy_pass ssh_backend;
}

9. 启动和测试

# 检查配置
sudo nginx -t

# 重启 Nginx
sudo systemctl restart nginx

# 查看日志
sudo tail -f /var/log/nginx/ssh-access.log

# 测试连接
ssh -p 8022 user@nginx-proxy -t 'ssh user@target-server'

替代方案考虑

如果需求更复杂,可以考虑:

OpenSSH 内置跳板机:使用 SSH 的 ProxyJumpProxyCommand 专业堡垒机:如 Jumpserver、Teleport SSH over HTTPS:使用 SSLH 或 GoTTY

这种 Nginx 方案适合简单的 TCP 端口转发需求,如果需要完整的会话审计、用户管理、权限控制等功能,建议使用专业的堡垒机解决方案。

相关帖子
为什么很多人用四象限法安排时间还是觉得乱,是不是第一步就搞错了?
为什么很多人用四象限法安排时间还是觉得乱,是不是第一步就搞错了?
未来生育津贴政策可能会有哪些调整趋势,个人应如何提前了解?
未来生育津贴政策可能会有哪些调整趋势,个人应如何提前了解?
冷水澡能否作为一种自然方式,辅助提升日常专注力与工作效率?
冷水澡能否作为一种自然方式,辅助提升日常专注力与工作效率?
2026年税务机关是否会进一步简化个人养老金账户的个税抵扣申报流程?
2026年税务机关是否会进一步简化个人养老金账户的个税抵扣申报流程?
作为返乡创业青年,2026年可以申请哪些类型和标准的创业扶持补贴?
作为返乡创业青年,2026年可以申请哪些类型和标准的创业扶持补贴?
淄博市专业网站开发制作%精准获客系统,收费标准
淄博市专业网站开发制作%精准获客系统,收费标准
自由职业者或灵活就业人员,是否可以为自己设立交通通讯补贴以降低税负?
自由职业者或灵活就业人员,是否可以为自己设立交通通讯补贴以降低税负?
2026年,社会舆论和年轻人对彩礼“限高”政策的普遍看法是什么?
2026年,社会舆论和年轻人对彩礼“限高”政策的普遍看法是什么?
计算经济补偿金时,工资基数是指应发工资还是实发工资?
计算经济补偿金时,工资基数是指应发工资还是实发工资?
到2026年,社保“第六险”的评估标准是否更加统一和规范了?
到2026年,社保“第六险”的评估标准是否更加统一和规范了?
贷款期间房产信息变更,讲解信息修改及二次抵押备案调整流程
贷款期间房产信息变更,讲解信息修改及二次抵押备案调整流程
从千兆宽带降级到百兆,运营商要求缴纳高额设备调测费是否合理?
从千兆宽带降级到百兆,运营商要求缴纳高额设备调测费是否合理?
2026年新的食品标识规定,是否让预制菜配料表更透明易懂?
2026年新的食品标识规定,是否让预制菜配料表更透明易懂?
智能汽车记录的行车轨迹信息是否属于个人隐私信息范畴
智能汽车记录的行车轨迹信息是否属于个人隐私信息范畴
如何区分是为了实际需求购物,还是为了短暂的情绪抚慰而进行消费?
如何区分是为了实际需求购物,还是为了短暂的情绪抚慰而进行消费?
2026年,企业的加班审批制度如果过于严格,是否会催生更多隐形加班?
2026年,企业的加班审批制度如果过于严格,是否会催生更多隐形加班?
企业内部非正式的社交活动,如何可能加深某些群体的“隐性”排斥感?
企业内部非正式的社交活动,如何可能加深某些群体的“隐性”排斥感?
对于有过敏性鼻炎的人,在特定季节应如何护理以减少鼻子出血风险?
对于有过敏性鼻炎的人,在特定季节应如何护理以减少鼻子出血风险?
小满节气“苦菜秀”的说法从何而来,这种植物背后有哪些有趣的故事与文化?
小满节气“苦菜秀”的说法从何而来,这种植物背后有哪些有趣的故事与文化?
对维修基金的使用情况有疑问,业主可以通过哪些合法途径进行监督?
对维修基金的使用情况有疑问,业主可以通过哪些合法途径进行监督?
2026年国际原油市场价格波动,主要受全球哪些非政治性供需因素影响?
2026年国际原油市场价格波动,主要受全球哪些非政治性供需因素影响?