使用 Stunnel 安全代理 SSH 连接(macOS客户端 + Debian服务器)
2025-06-24 tech stunnel mac ssh linux 6 mins 2 图 2415 字
Stunnel 是一个自由的跨平台软件,用于提供全局的TLS/SSL服务。针对本身无法进行TLS或SSL通信的客户端及服务器,Stunnel可提供安全的加密连接。
Stunnel可在许多操作系统下运行,包括Unix-like系统,以及Windows。
Stunnel 基于OpenSSL,要求已经安装了OpenSSL。Stunnel是开源的,支持所有SSL或TLS库所支持的。
为什么需要SSH代理?
在某些网络环境(如严格防火墙限制)中,直接SSH连接可能被阻断。通过 stunnel 建立 TLS 加密隧道:
- 将SSH流量伪装成HTTPS流量
- 添加额外的TLS加密层
- 绕过端口限制(使用标准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
服务端配置 (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
连接方式
-
启动本地stunnel隧道
stunnel ~/Workspace/bin/stunnel-ssh.conf
-
通过代理连接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 指纹特征进行阻断。