20251029-MySQL-公网连接教程

明白,我帮你整理一篇详细的教程笔记,涵盖 MySQL 公网连接的两种方案、配置细节和客户端设置。下面是整理好的内容,可直接作为博客或笔记使用:


MySQL 公网连接教程(带 TLS/隧道支持)

在云服务器或 VPS 上部署 MySQL 时,有时需要让远程客户端或另一台服务器直接访问 MySQL 数据库。为了保证安全性和可用性,本文整理了两种方案:stunnel 隧道方案MySQL/TLS 直连方案


前提条件


方案 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 或隧道,否则无法安全直连


我可以帮你再画一张 方案对比和端口流向图,把客户端、服务器和 stunnel 的关系直观显示出来,这样读者一看就明白。

你希望我画吗?