如何在宝塔面板中创建支持远程连接的数据库?

在宝塔面板(BT Panel)中创建支持远程连接的数据库,核心逻辑在于修改数据库用户的权限范围以及配置服务器防火墙/安全组。仅创建用户是不够的,必须明确赋予该用户从任意 IP 或指定 IP 访问的权限。

以下是基于主流 Linux 环境(CentOS/Ubuntu/Debian)使用 MySQL/MariaDB 的标准操作流程:

一、 前提条件检查

  1. 确认已安装数据库:确保已在宝塔软件商店安装 MySQL 5.7/8.0 或 MariaDB 10.3+。
  2. 端口监听状态:默认情况下,宝塔安装的 MySQL 通常只监听 127.0.0.1(本地回环地址),这是出于安全考虑。要实现远程连接,必须解除此限制。

二、 操作步骤详解

步骤 1:通过命令行修改数据库用户权限(关键步骤)

虽然宝塔面板有“数据库”管理界面,但强烈建议通过 SSH 终端执行 SQL 命令来设置远程权限,因为图形界面有时无法正确更新底层权限表,尤其是对于 MySQL 8.0+ 版本。

  1. 登录服务器 SSH

    ssh root@your_server_ip
  2. 进入 MySQL 控制台

    mysql -u root -p
    # 输入你的 root 密码
  3. 创建新用户并授权(推荐方式)
    不要直接使用 root 账号进行远程连接,应创建一个专用账号。

    对于 MySQL 5.7 / MariaDB:

    -- 创建用户 'dbuser',密码为 'StrongPassword123!',允许从任何 IP (% 表示通配符) 连接
    CREATE USER 'dbuser'@'%' IDENTIFIED BY 'StrongPassword123!';
    
    -- 授予对所有数据库的全部权限(生产环境建议限定具体数据库)
    GRANT ALL PRIVILEGES ON *.* TO 'dbuser'@'%';
    
    -- 刷新权限
    FLUSH PRIVILEGES;

    对于 MySQL 8.0+:
    MySQL 8.0 改变了用户创建和授权的语法,需分开执行:

    -- 1. 创建用户
    CREATE USER 'dbuser'@'%' IDENTIFIED BY 'StrongPassword123!';
    
    -- 2. 授予权限
    GRANT ALL PRIVILEGES ON *.* TO 'dbuser'@'%';
    
    -- 3. 刷新权限
    FLUSH PRIVILEGES;
  4. 退出 MySQL

    EXIT;

验证是否生效
可尝试从另一台机器测试连接:
mysql -h your_server_ip -P 3306 -u dbuser -p


步骤 2:修改 MySQL 配置文件以监听外部 IP

即使授权成功,如果 MySQL 进程未监听公网 IP,也无法连接。

  1. 编辑 MySQL 配置文件

    vi /etc/my.cnf
    # 或 Ubuntu/Debian: vi /etc/mysql/mysql.conf.d/mysqld.cnf
  2. 查找 bind-address

    • 找到类似 bind-address = 127.0.0.1 的行。
    • 将其注释掉或删除,或改为:
      bind-address = 0.0.0.0

      ⚠️ 注意:设置为 0.0.0.0 表示监听所有网卡 IP。若你希望更严格控制,可保留 127.0.0.1 并在应用层使用跳板机,但一般远程直连需改为 0.0.0.0

  3. 重启 MySQL 服务

    systemctl restart mysqld
    # 或 CentOS 7+: service mysqld restart
  4. 验证监听状态

    netstat -tuln | grep 3306

    输出应包含 0.0.0.0:3306 而非 127.0.0.1:3306


步骤 3:配置云平台安全组与服务器防火墙

这是最容易被忽略的一步!即使 MySQL 配置正确,云厂商的安全策略也会拦截流量。

A. 云服务器安全组(如阿里云 ECS、腾讯云 CVM、华为云等)
  1. 登录云控制台 → 找到你的实例 → 安全组规则
  2. 添加入方向规则
    • 协议类型:TCP
    • 端口范围:3306
    • 授权对象(源 IP):
      • 最佳实践:填写你本地的固定公网 IP(如 114.114.114.114/32)。
      • 高风险0.0.0.0/0(允许所有 IP 访问,极易被暴力破解)。
  3. 保存规则。
B. 服务器内部防火墙(iptables/firewalld/ufw)

宝塔面板通常会管理防火墙,但需确认:

  1. 如果使用 firewalld(CentOS 7+ 默认)

    firewall-cmd --zone=public --add-port=3306/tcp --permanent
    firewall-cmd --reload
  2. 如果使用 ufw(Ubuntu 默认)

    ufw allow from <your_local_ip> to any port 3306
    ufw reload
  3. 如果使用 iptables
    确保规则中包含允许 3306 端口的条目。

💡 提示:宝塔面板自带“安全”菜单,可在其中放行 3306 端口,但优先检查云安全组,因为云安全组在更早的网络层级过滤。


三、 常见问题排查

问题现象 可能原因 解决方案
Can't connect to MySQL server on 'xxx' (111) 网络不通或防火墙拦截 检查云安全组、服务器防火墙是否开放 3306;ping 测试连通性
Access denied for user 'dbuser'@'...' 权限不足或密码错误 重新执行 GRANT 语句;确认用户名/密码无误;检查 % 是否匹配来源 IP
Host 'xxx' is not allowed to connect to this MySQL server MySQL 用户权限未配置 % 执行 CREATE USER 'dbuser'@'%' ...FLUSH PRIVILEGES
MySQL 8.0 连接失败 认证插件兼容性问题 修改用户认证方式为 mysql_native_password
ALTER USER 'dbuser'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

四、 安全建议(重要)

  1. 避免使用 0.0.0.0/0 开放 3306:MySQL 是高频攻击目标。务必限制源 IP 为你的开发机或应用服务器的 IP。
  2. 使用强密码:避免弱口令导致字典攻击。
  3. 启用 SSL/TLS 加密:在生产环境中,建议配置 MySQL SSL 连接,防止数据在传输中被窃听。
  4. 定期审计日志:查看 /var/log/mysqld.log 或宝塔“数据库”中的错误日志,监控异常登录尝试。

总结流程
SSH 登录 → 创建带 % 权限的用户 → 修改 my.cnfbind-address → 重启 MySQL → 配置云安全组放行 3306 → 测试连接。

按照以上步骤操作,即可安全、稳定地实现远程数据库连接。

未经允许不得转载:CLOUD云枢 » 如何在宝塔面板中创建支持远程连接的数据库?