Stunnel的核心价值是为不支持加密的网络服务提供TLS/SSL封装,无需修改程序代码即可实现明文通信加密。它作为独立代理,在客户端与服务端间建立加密中转,通过client/server双模式分工实现端到端安全传输。

Stunnel 的核心价值,就是给原本不支持加密的网络服务“套一层 TLS/SSL 外壳”,无需改动原有程序代码,就能让明文通信变安全。它不替代服务本身,而是作为独立代理,在客户端与服务端之间建立加密中转。
明确角色分工:client 模式 vs server 模式
Stunnel 总是成对使用——一端是 client(发起加密连接),一端是 server(接受加密连接并转发到真实服务)。关键看你要保护哪一端:
- 服务端加固:真实服务(如 NFS、MySQL、Telnet)运行在内网或本地,不对外暴露明文端口;Stunnel server 监听一个新端口(如 3307),接收加密请求,解密后转发给本地 3306 的 MySQL。
- 客户端加固:你本地运行的程序(如浏览器、邮件客户端、NFS mount)只认明文协议;Stunnel client 在本机监听一个端口(如 127.0.0.1:3128),接收本地请求,加密后发往远端 Stunnel server。
证书准备:自签名足够常用场景
Stunnel 依赖 X.509 证书完成 TLS 握手。生产环境建议用 CA 签发,测试或内部使用可快速生成自签名证书:
- 在服务端执行:
openssl req -new -x509 -days 3650 -nodes -out stunnel.pem -keyout stunnel.pem - 过程中 Common Name 填写服务实际访问地址(如
sfs-turbo-abc.region.myhuaweicloud.com或服务器 IP),否则客户端可能报证书不匹配 - 生成后设权限:
chmod 400 stunnel.pem,并确保配置中cert = /path/to/stunnel.pem路径正确
典型配置要点:以 NFS 加密挂载为例
华为云 SFS Turbo 场景中,NFS v3 协议本身无加密,Stunnel 是官方推荐加固方式:
- 选一个空闲本地端口(如 20050),避免与已有服务冲突(可用
netstat -anp | grep 127.0.0.1查) - 客户端配置文件(
/etc/stunnel/stunnel_20050.conf)写入:client = yes<br> sslVersion = TLSv1.2<br> [nfs]<br> ciphers = ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256<br> accept = 127.0.0.1:20050<br> connect = your-sfs-domain.sfsturbo.region.myhuaweicloud.com:2052
- 启动:
stunnel /etc/stunnel/stunnel_20050.conf - 挂载命令指向本地监听端口:
mount -t nfs -o vers=3,nolock,tcp,port=20050,mountport=20050 127.0.0.1:/ /mnt/sfs
稳定性与排错建议
Stunnel 进程一旦退出,依赖它的服务(如 NFS 挂载)会卡住或断连:
- 加日志便于追踪:
debug = 7和output = /var/log/stunnel.log写入配置 - 用 systemd 或 crontab 实现自动拉起,例如每分钟检查进程是否存在:
*/1 * * * * pgrep -f "stunnel.*20050" > /dev/null || stunnel /etc/stunnel/stunnel_20050.conf - 常见失败原因:端口被占、证书路径错误、域名解析失败、目标服务未监听对应端口(如 SFS Turbo 的 2052 端口需确认开通)、防火墙拦截加密端口

















