Logo 📚 Digital Library

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:

  1. 安装 stunnel(以 CentOS/Fedora 为例):
sudo yum install stunnel
  1. 创建配置文件 /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
  1. 启动 stunnel:
systemctl enable stunnel
systemctl restart stunnel
systemctl status stunnel -l

注意:accept 可以绑定 0.0.0.0 以允许公网访问。


2. 客户端配置#

在本地机器(或另一台服务器)上:

  1. 安装 stunnel:
sudo pacman -S stunnel  # Arch Linux
sudo apt install stunnel4  # Ubuntu/Debian
  1. 创建客户端配置 /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 端口
  1. 启动 stunnel 客户端:
sudo stunnel /etc/stunnel/mysql-client.conf
  1. 使用本地端口连接 MySQL:
mariadb -h 127.0.0.1 -P 3308 -u wordpress -p

好处:客户端无需直接处理 TLS 证书,自带隧道加密,兼容性最好。


方案 2:MySQL/TLS 直连方案#

如果希望直接连接 MySQL 的 TLS 端口:

1. 服务端 MySQL 配置#

在 Docker MySQL 或宿主机上:

  1. 修改 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
  1. 重启 MySQL 容器或服务:
docker compose down
docker compose up -d
# 或者 systemctl restart mysql
  1. 确认 MySQL 公网端口开放(3306):
ss -lntp | grep 3306

2. 客户端配置#

使用自签名证书或 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=PREFERREDDISABLED,注意 MariaDB 客户端旧版本不支持。


常见问题#

  1. 端口仍显示 127.0.0.1:3306
    • Docker 容器重启前请确保 docker-compose.ymlports 配置绑定了 0.0.0.0:3306:3306
  2. TLS/SSL 证书错误
    • 自签名证书需要客户端使用 --ssl-ca=fullchain.pem 并允许验证关闭。
    • 更安全做法是使用由可信 CA 签发的证书。
  3. RSA 加密错误(2061)
    • 某些 MySQL 客户端编译不支持 GnuTLS 或 caching_sha2_password 插件,需要换用 MariaDB 客户端或启用 mysql_native_password

总结#

方案安全性客户端要求备注
stunnel 隧道不需直接配置 TLS推荐用于跨公网访问
MySQL/TLS 直连需配置证书简单但自签名证书需要额外设置

不管哪种方案,客户端都必须知道如何处理 TLS 或隧道,否则无法安全直连