众所周知,mysql传输默认明文传输,导致数据库不在本地时远程传输容易泄露信息,虽然5.7版本之后是支持ssl加密,但很多源码和程序默认走明文,修改源码会对后期迁移或者管理添加不必要的麻烦。这时候可以使用中间件进行加密传输,这里选择Stunnel。好处就是不需要修改源码增加不必要的麻烦,其次就是可以一对多。服务端只需要配置一个程序,用户端的配置可以复用。不管对接多少台服务器只要把配置复制过去就能直接使用。缺点就是会有额外性能开销,每1000条tcp连接大概要用百分之七左右的性能开销,视服务器性能为定。
Stunnel是什么?
Stunnel 是一个开源的跨平台网络通信加密工具,主要用于为原本不支持 SSL/TLS 加密的 TCP 连接提供安全的加密通道。它可以在不改动原有应用程序代码的前提下,为如 POP3、IMAP、FTP、Telnet、HTTP 等明文协议提供加密支持。简言之,Stunnel 是一个“SSL 包装器”,让不安全的网络服务也能安全通信。
安装
Debian/Ubuntu安装
sudo apt update
sudo apt install stunnel4
RHEL/CentOS/Fedora 系统
sudo dnf install stunnel # Fedora / RHEL 8+
sudo yum install stunnel # CentOS 7 / RHEL 7
#如果默认仓库没有,可启用 EPEL(Extra Packages for Enterprise Linux)
sudo yum install epel-release # CentOS 7
sudo dnf install epel-release # RHEL 8+/CentOS Stream
sudo yum/dnf install stunnel
管理命令
sudo systemctl start stunnel4 # 启动
sudo systemctl stop stunnel4 # 停止
sudo systemctl status stunnel4 # 查看状态
sudo systemctl enable stunnel4 # 开机自启
安装后配置文件通常位于 /etc/stunnel/目录,启动会默认加载该目录下的所有配文件。
生成自签ssl证书,使用自有证书可以跳过这一步。
这里太长了就不写了使用一键脚本生成。详细可以百度或者使用自己熟悉工具自签
wget -N https://drive.ecve.cn/f/XLKcw/ssl.sh && bash ssl.sh
这是一键生成脚本会在Stunnel配置目录生成ssl证书文件夹并保存在里面。
编辑Stunnel配置文件
配置文件通常位于 /etc/stunnel/目录,编辑.conf后缀的配置文件,没有就自己创建一个,只要是conf后缀就行,填入一下配置
; MySQL over SSL via stunnel
pid = /run/stunnel4.pid
foreground = no
debug = 3
output = /var/log/stunnel4/mysql.log
; 全局证书(所有服务共享)
cert = /etc/stunnel/ssl/server.pem
key = /etc/stunnel/ssl/server.key
CAfile = /etc/stunnel/ssl/ca.crt
[mysql]
accept = 0.0.0.0:3307
connect = 127.0.0.1:3306
mysql数据库的3306端口会进行ssl加密从3307端口和用户端进行通信
然后重启Stunnel
sudo systemctl restart stunnel4
至此服务端配置完成
用户端安装和服务端一样,区别在于配置不同
安装好后编辑conf配置,写入以下配置
; stunnel 客户端配置
client = yes
pid = /run/stunnel4.pid
output = /var/log/stunnel4/stunnel.log
debug = 3
[remote_service]
accept = 127.0.0.1:3306
connect = xx.xx.xx.xx:3307
CAfile = /etc/stunnel/ssl/ca.crt
verify = 1
; checkHost = xxxx.com ; 如果使用域名
client 参数为yes,代表为用户端模式
accept 参数修改为服务端地址,端口为服务端的3307端口
accept 参数为用户端端口,本地有数据库运行的话请修改为其他端口避免冲突
CAfile 参数用户端证书需要把服务端ssl目录的ca.crt证书复制到用户端的ssl目录。
保存后重启stunnel 即可。方法适合一切传输加密。
mysql和应用程序配置一切照旧无需修改源码,mysql和应用程序并不知道传输进行了加密
另类方法:当然你也可以使用其他的组网或者内网穿透工具,工具本身自带加密的可以。例如frp或者nps之类的工具都可以,本身是支持传输加密或者手动配置加密。只是灵活性没有stunnel好,这类工具不支持一对多。每连接一台服务器都需要在服务端运行一个对应的程序