MySQL 公网连接
MySQL 公网连接教程(带 TLS/隧道支持)#
在云服务器或 VPS 上部署 MySQL 时,有时需要让远程客户端或另一台服务器直接访问 MySQL 数据库。为了保证安全性和可用性,本文整理了两种方案:stunnel 隧道方案和MySQL/TLS 直连方案。
前提条件#
- MySQL 服务器部署在 Docker 容器或本地服务器上。
- 数据库已创建,并可以本地访问。
- 服务器可被公网访问(有公网 IP 或域名)。
- 服务器防火墙已允许 MySQL/TLS 端口(3306/3307)或 stunnel 映射端口。
方案 1:stunnel 隧道方案(推荐)#
1. 服务端配置#
假设数据库服务器 IP/域名为 db.850899.xyz,MySQL 容器端口为 3306:
- 安装 stunnel(以 CentOS/Fedora 为例):
sudo yum install stunnel- 创建配置文件
/etc/stunnel/stunnel.conf:
pid = /var/run/stunnel-mysql.pid
foreground = no
debug = 7
output = /var/log/stunnel-mysql.log
[mysqld]
accept = 0.0.0.0:3307 # 公网监听端口
connect = 127.0.0.1:3306 # 本地 MySQL 容器端口
cert = /etc/ssl/850899.xyz/fullchain.pem
key = /etc/ssl/850899.xyz/privkey.pem- 启动 stunnel:
systemctl enable stunnel
systemctl restart stunnel
systemctl status stunnel -l注意:
accept可以绑定0.0.0.0以允许公网访问。
2. 客户端配置#
在本地机器(或另一台服务器)上:
- 安装 stunnel:
sudo pacman -S stunnel # Arch Linux
sudo apt install stunnel4 # Ubuntu/Debian- 创建客户端配置
/etc/stunnel/mysql-client.conf:
client = yes
debug = 7
output = /tmp/stunnel-mysql-client.log
[mysqld]
accept = 127.0.0.1:3308 # 本地映射端口
connect = db.850899.xyz:3307 # 服务器公网 stunnel 端口- 启动 stunnel 客户端:
sudo stunnel /etc/stunnel/mysql-client.conf- 使用本地端口连接 MySQL:
mariadb -h 127.0.0.1 -P 3308 -u wordpress -p好处:客户端无需直接处理 TLS 证书,自带隧道加密,兼容性最好。
方案 2:MySQL/TLS 直连方案#
如果希望直接连接 MySQL 的 TLS 端口:
1. 服务端 MySQL 配置#
在 Docker MySQL 或宿主机上:
- 修改 MySQL 配置
/etc/my.cnf或容器挂载的my.cnf:
[mysqld]
bind-address = 0.0.0.0
require_secure_transport = ON
ssl_cert = /etc/ssl/850899.xyz/fullchain.pem
ssl_key = /etc/ssl/850899.xyz/privkey.pem- 重启 MySQL 容器或服务:
docker compose down
docker compose up -d
# 或者 systemctl restart mysql- 确认 MySQL 公网端口开放(3306):
ss -lntp | grep 33062. 客户端配置#
使用自签名证书或 CA 证书:
scp user@db.850899.xyz:/etc/ssl/850899.xyz/fullchain.pem ~/fullchain.pem连接 MySQL:
mariadb -h 45.205.28.138 -P 3306 -u wordpress -pwordpress \
--ssl-ca=/home/ding/fullchain.pem \
--ssl-verify-server-cert=0
--ssl-verify-server-cert=0允许自签名证书,否则会报self-signed certificate错误。
如果使用官方 MySQL 客户端,可能需要--ssl-mode=PREFERRED或DISABLED,注意 MariaDB 客户端旧版本不支持。
常见问题#
- 端口仍显示 127.0.0.1:3306
- Docker 容器重启前请确保
docker-compose.yml的ports配置绑定了0.0.0.0:3306:3306。
- Docker 容器重启前请确保
- TLS/SSL 证书错误
- 自签名证书需要客户端使用
--ssl-ca=fullchain.pem并允许验证关闭。 - 更安全做法是使用由可信 CA 签发的证书。
- 自签名证书需要客户端使用
- RSA 加密错误(2061)
- 某些 MySQL 客户端编译不支持 GnuTLS 或 caching_sha2_password 插件,需要换用 MariaDB 客户端或启用
mysql_native_password。
- 某些 MySQL 客户端编译不支持 GnuTLS 或 caching_sha2_password 插件,需要换用 MariaDB 客户端或启用
总结#
| 方案 | 安全性 | 客户端要求 | 备注 |
|---|---|---|---|
| stunnel 隧道 | 高 | 不需直接配置 TLS | 推荐用于跨公网访问 |
| MySQL/TLS 直连 | 高 | 需配置证书 | 简单但自签名证书需要额外设置 |
不管哪种方案,客户端都必须知道如何处理 TLS 或隧道,否则无法安全直连。
📚 Digital Library