MySQL 5.7安装后远程连接拒绝访问的权限配置方法

栗子
栗子
发布时间:2026-09-23 | 5人浏览过
原创

在全新安装 MySQL 5.7 后,使用 Navicat、DBeaver 或应用端远程连接时,最常见的阻碍通常分为两类:一是网络连接被直接拒绝(无法建立 TCP 握手),二是数据库返回 1045 拒绝访问错误(Access denied)。解决该问题的核心路径十分明确:解除 MySQL 默认仅监听本地回环地址的限制,并在 mysql.user 表中为目标用户配置允许远程主机(% 或指定 IP)访问的权限。

MySQL 5.7安装后远程连接拒绝访问的权限配置方法
图 1:远程连接拒绝的三个排查层级与对应现象

第一步:解除本地监听绑定(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 5.7安装后远程连接拒绝访问的权限配置方法
图 2:MySQL 用户 Host 字段的访问权限匹配机制

首先通过本地终端登录 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;
注意事项:在 MySQL 5.7 中,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 的放行规则。

MySQL 5.7安装后远程连接拒绝访问的权限配置方法
图 3:远程连接配置的标准执行步骤序列

验证连接与常见异常处理

配置完成后,无需直接盲目尝试图形化客户端。在远程电脑的命令行中使用测试工具,可以更准确地判断卡在哪一层:

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;
MySQL 5.7安装后远程连接拒绝访问的权限配置方法
图 4:MySQL 5.7 远程连接常见报错排查总结表

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表