MySQL 5.7安装后远程连接拒绝访问的权限配置方法
在全新安装 MySQL 5.7 后,使用 Navicat、DBeaver 或应用端远程连接时,最常见的阻碍通常分为两类:一是网络连接被直接拒绝(无法建立 TCP 握手),二是数据库返回 1045 拒绝访问错误(Access denied)。解决该问题的核心路径十分明确:解除 MySQL 默认仅监听本地回环地址的限制,并在 mysql.user 表中为目标用户配置允许远程主机(% 或指定 IP)访问的权限。
第一步:解除本地监听绑定(bind-address)
在 Debian、Ubuntu 等发行版中,通过 APT 安装的 MySQL 5.7 默认会将监听地址限定为本地回环(127.0.0.1)。这种设置下,服务器虽然启动了 3306 端口,但它只接收来自本机的流量。客户端尝试从外部连接时,操作系统在内核协议栈层面就会直接向客户端发送 RST 包,报出“Connection refused”。
可以通过检查端口监听情况来确认这一状态:
netstat -tlpn | grep 3306
示例输出:
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1420/mysqld
如果输出显示的是 127.0.0.1:3306,说明服务未对外开放监听。需要编辑 MySQL 配置文件,根据不同的发行版,配置文件路径通常为:
- Debian / Ubuntu:
/etc/mysql/mysql.conf.d/mysqld.cnf或/etc/mysql/my.cnf - CentOS / RHEL:
/etc/my.cnf
在 [mysqld] 区域下找到 bind-address 配置项,将其修改为允许所有网卡接入,或者直接注释掉:
[mysqld]
# 将原来的 127.0.0.1 修改为 0.0.0.0,表示监听本机所有网络接口
bind-address = 0.0.0.0
保存文件后,重启 MySQL 服务使网络配置生效:
systemctl restart mysql # Ubuntu/Debian
# 或
systemctl restart mysqld # CentOS/RHEL
第二步:配置数据库用户的主机授权(Host)
解决了网络监听后,连接进入 MySQL 内部的鉴权体系。MySQL 识别一个用户不仅看用户名,还要结合来源客户端的主机地址,即 'username'@'host'。在全新安装的 MySQL 5.7 中,默认的 root 账号其 Host 均为 localhost,这意味着数据库只允许本机登录。若外部客户端发起连接,MySQL 无法匹配到可用的身份规则,便会返回“Access denied for user 'root'@'x.x.x.x'”。
首先通过本地终端登录 MySQL 控制台:
mysql -u root -p
进入控制台后,查看当前用户的 Host 设定状态:
SELECT user, host FROM mysql.user;
示例输出:
+---------------+-----------+
| user | host |
+---------------+-----------+
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+-----------+
在 MySQL 5.7 中,可以使用 GRANT 语法同时完成权限授予与密码确认。有两种推荐的授权策略:
方式一:允许该用户从任意远程 IP 连接(开发测试环境常用)
-- 授权 root 用户从任意主机 (%) 访问所有数据库,并设定登录密码
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你的复杂密码' WITH GRANT OPTION;
-- 刷新权限使其生效
FLUSH PRIVILEGES;
方式二:仅允许特定静态公网 IP 或跳板机连接(生产环境规范做法)
如果服务器直接面向公网,将 Host 设为 % 会带来较高的爆破风险。可以限定具体来源 IP:
-- 仅允许来自 203.0.113.15 的主机以 dev_user 身份连接 app_db
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'dev_user'@'203.0.113.15' IDENTIFIED BY '你的复杂密码';
FLUSH PRIVILEGES;
GRANT ... IDENTIFIED BY 会直接更新或指定该用户在对应 Host 下的密码散列值。请确保指定的密码符合 MySQL 5.7 当前启用的密码安全策略(validate_password 插件的长度与复杂度要求),否则该语句会报错。
第三步:排查操作系统防火墙与云厂商安全组
如果完成上述两步后,远程连接依然停留在“连接超时”(并非立即提示密码错误),说明数据包在到达 MySQL 进程之前被网络边界丢弃。通常需要依次排查服务器本身的防火墙与云平台安全组。
对于使用 ufw 的 Debian/Ubuntu 系统:
# 检查状态
sudo ufw status
# 放行 3306 端口
sudo ufw allow 3306/tcp
对于使用 firewalld 的 CentOS/RHEL 系统:
# 放行 3306 端口
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 重新加载规则
sudo firewall-cmd --reload
如果服务器部署在阿里云、腾讯云或 AWS 等云基础设施上,云平台的“安全组(Security Group)”是一个独立的虚拟防火墙。必须登录对应的云控制台,在实例关联的安全组“入方向规则”中,添加一条协议为 TCP、端口范围为 3306 的放行规则。
验证连接与常见异常处理
配置完成后,无需直接盲目尝试图形化客户端。在远程电脑的命令行中使用测试工具,可以更准确地判断卡在哪一层:
1. 测试端口链路连通性
在远程机器上使用 telnet 或 nc 测试端口是否已开放响应:
telnet 198.51.100.10 3306
如果连接成功,屏幕会输出类似 5.7.xx-log 的版本标识字符并挂起;如果显示 Connection refused,检查第一步的 bind-address;如果一直等待并提示 timed out,检查第三步的防火墙与安全组。
2. 客户端依然报错 1045(Access denied)的处理
若端口已通但提示认证失败,常见原因有两个:一是授权后未执行 FLUSH PRIVILEGES;;二是存在同名但 Host 匹配优先级更高的规则干扰。可以通过以下 SQL 语句重新检查授权视图:
SELECT User, Host, authentication_string, plugin FROM mysql.user WHERE User='root';
若使用的是非 root 用户,还需确认该用户被授予的库表权限是否满足连接要求。如果需要修改已有远程用户的密码,可以使用标准更新语句:
ALTER USER 'root'@'%' IDENTIFIED BY '新设定的强密码';
FLUSH PRIVILEGES;
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













