mysql远程连接需依次配置bind-address=0.0.0.0(或指定ip)、禁用skip-networking、用户host设为具体ip/cidr、云安全组与宝塔防火墙均放行3306端口,并用telnet验证端口连通性。

MySQL 配置文件里 bind-address 必须改对,否则监听无效
宝塔默认安装的 MySQL 只监听 127.0.0.1,这意味着它压根不接收外部 IP 的连接请求——哪怕你开了防火墙、建了用户,也连不上。这不是权限问题,是网络层直接拒收。
- 登录宝塔 → 【文件】→ 打开
/www/server/mysql/etc/my.cnf - 找到
bind-address = 127.0.0.1这一行,改成bind-address = 0.0.0.0(允许所有 IPv4 地址)或具体外网 IP(如bind-address = 192.168.10.5) - 确认配置中没有
skip-networking这行;如果有,必须删掉或加#注释 - 保存后,回到【数据库】页面,点击对应 MySQL 实例右侧的【重启】按钮
用户主机字段填 % 是最常见误操作,安全风险极大
很多教程直接让你把 phpMyAdmin 里用户的 Host 改成 %,结果整个数据库暴露在公网。这不是“能连上”就行的事,而是等于把锁孔焊开扔在路边。
- 更稳妥的做法:在 phpMyAdmin 【用户】页点【+添加用户】,Host 填具体客户端 IP(如
203.0.113.25)或 CIDR 段(如203.0.113.0/24) - 如果必须用通配符,至少配合宝塔防火墙的 IP 白名单功能,在【安全】→【MySQL(3306)】→【设置】里勾选【IP白名单】并填入可信 IP
- 不要用 root 用户远程连接;新建专用账号,权限只给到具体数据库,避免
GRANT ALL ON *.*
云服务器安全组和宝塔防火墙是两道独立关卡,漏一个就失败
很多人只开了宝塔防火墙的 3306 端口,却忘了云厂商(阿里云/腾讯云等)的安全组才是第一道网关。两者都得配,且规则要一致。
- 先去云控制台 → 安全组 → 添加入方向规则:
协议类型 TCP,端口范围 3306/3306,源 IP建议填具体 IP 或网段,别写0.0.0.0/0 - 再回宝塔 → 【安全】→ 放行端口
3306;若已存在,点右侧【设置】确认没被禁用 - Linux 系统级防火墙(如 firewalld)也可能干扰,可临时关闭测试:
systemctl stop firewalld,确认连通后再按需放行
测试连接前先验证端口是否真通,别让错误信息误导判断
Navicat 报 “Connection refused” 不一定代表配置错,可能是端口不通;报 “Access denied” 才说明认证或权限出问题。得先分清是哪一层挂了。
- 从客户端机器执行:
telnet 你的服务器IP 3306或nc -zv 你的服务器IP 3306,能通才说明网络链路没问题 - 如果 telnet 失败,优先查云安全组和宝塔防火墙;如果成功但 mysql -h 连不上,再查用户 Host、密码、
bind-address - MySQL 8.x 用户注意:
GRANT语句不再支持IDENTIFIED BY,必须先CREATE USER,再GRANT,最后FLUSH PRIVILEGES
真正麻烦的从来不是改哪几行配置,而是每层网络策略(云平台、系统防火墙、MySQL 自身绑定、用户授权)都得对得上号,而且顺序不能乱:先确保端口可达,再谈权限分配。










