IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    使用 Stunnel 安全代理 SSH 连接(macOS客户端 + Debian服务器)

    血衫非弧の一存发表于 2025-06-24 00:00:00
    love 0

    Stunnel 是一个自由的跨平台软件,用于提供全局的TLS/SSL服务。针对本身无法进行TLS或SSL通信的客户端及服务器,Stunnel可提供安全的加密连接。

    Stunnel可在许多操作系统下运行,包括Unix-like系统,以及Windows。

    Stunnel 基于OpenSSL,要求已经安装了OpenSSL。Stunnel是开源的,支持所有SSL或TLS库所支持的。

    为什么需要SSH代理?

    在某些网络环境(如严格防火墙限制)中,直接SSH连接可能被阻断。通过 stunnel 建立 TLS 加密隧道:

    1. 将SSH流量伪装成HTTPS流量
    2. 添加额外的TLS加密层
    3. 绕过端口限制(使用标准443端口)

    环境准备

    • 客户端: macOS (安装stunnel: brew install stunnel)
    • 服务器: Debian (安装: apt install stunnel4)
    • 有效域名证书 (我使用Let’s Encrypt)

    客户端配置 (macOS)

    创建 ~/Workspace/bin/stunnel-ssh.conf:

    # 全局配置
    pid = /Users/kelu/run/stunnel.pid
    foreground = yes
    output = /Users/kelu/log/stunnel.log
    debug = info
    fips = no
    
    # 客户端服务定义
    [ssh-forward]
    client = yes
    accept = 127.0.0.1:2222  # 本地监听端口
    connect = 你的服务器IP:22  # 替换为实际服务器IP
    
    # SSL/TLS 配置
    sslVersion = TLSv1.2
    ciphers = AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL
    
    # 证书验证
    verifyPeer = yes
    CAfile = /etc/letsencrypt/live/blog.abc.com/fullchain.pem
    checkHost = blog.abc.com  # 证书域名验证
    
    # 连接优化
    socket = l:TCP_NODELAY=1
    socket = r:TCP_NODELAY=1
    TIMEOUTidle = 86400  # 超时设置
    options = NO_TICKET
    options = ALLOW_NO_DHE_KEX
    

    启动隧道

    stunnel ~/Workspace/bin/stunnel-ssh.conf
    

    image-20250624午後34622363

    服务端配置 (Debian)

    创建 /etc/stunnel/stunnel.conf:

    # 全局配置
    pid = /var/run/stunnel.pid
    foreground = no
    output = /var/log/stunnel4/stunnel.log
    debug = info
    fips = no
    
    # SSH代理服务
    [ssh-forward]
    accept = 0.0.0.0:22    # 监听所有接口的22端口
    connect = 127.0.0.1:22  # 转发到本地SSH
    # protocol = proxy   
    
    # 证书配置
    cert = /etc/letsencrypt/live/blog.abc.com/fullchain.pem
    key = /etc/letsencrypt/live/blog.abc.com/privkey.pem
    
    # 加密设置
    sslVersion = TLSv1.2
    ciphers = AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL
    sessionCacheSize = 1000
    sessionCacheTimeout = 300
    

    服务器配置中注释了protocol = proxy,这是因为我这里使用了stunnel客户端直接连服务端,如果使用 proxy 会导致 Stunnel 在转发流量时添加额外的代理头(包含源地址和目的地址等信息),而 SSH协议无法处理这些头信息,从而导致连接失败。

    注意:PROXY协议通常用于需要传递客户端真实IP的场景(如HTTP反向代理),但SSH这类原生TCP协议不支持该扩展。移除后即可恢复正常通信。

    重启服务:

    sudo systemctl restart stunnel4
    

    image-20250624午後34857765

    连接方式

    1. 启动本地stunnel隧道

      stunnel ~/Workspace/bin/stunnel-ssh.conf
      
    2. 通过代理连接SSH

      ssh -p 2222 username@127.0.0.1
      

    此时流量路径: SSH客户端 → 本地2222端口 → TLS加密隧道 → 服务器22端口 → SSH守护进程

    关键配置说明

    配置项 客户端作用 服务端作用
    accept 创建本地监听端口 指定服务监听端口
    connect 目标服务器地址 本地SSH服务地址
    CAfile/cert 验证服务器证书 提供有效TLS证书
    checkHost 验证证书域名匹配 -
    TCP_NODELAY 禁用Nagle算法降低延迟 同上
    options 优化TLS协议参数 优化TLS协议参数

    TLS指纹识别

    TLS深度包检测(DPI) 系统,可以通过识别 Stunnel 的 TLS 指纹特征进行阻断。



沪ICP备19023445号-2号
友情链接