编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

MySQL开放远程权限,竟然连不上?可能是这几个地方没做好

wxchong 2024-10-24 18:02:46 开源技术 65 ℃ 0 评论


  • 现象描述:

在一次基于公有云ubuntu 24.04的测试环境中,通过内置软件源安装了MySQL应用,配置访问主机名已改为%,但通过公网IP无法连接

  • 原因分析:

公有云的云主机默认是关闭系统防火墙功能的,而且我的安全组默认开放所有端口,这样方便测试。因此,首先这两项已经排除了

下面可以从这几个方面排查问题,包括刷新权限列表、主机绑定、认证插件类型

  1. 未刷新权限表

如果将root的主机名修改为%后,需要刷新权限列表使其生效

# 刷新权限表
flush privileges;
  1. 主机绑定

这是遇到的第一个错误,错误10061表示“由于目标计算机积极拒绝,无法连接”。这可能意味着你尝试连接的 MySQL 服务器没有监听指定的端口,或者防火墙阻止了连接请求。

公有云主机防火墙是默认关闭的,因此,不存在防火墙拦截的问题。那么可以从其他原因排查

查看[mysqld]配置中是否存在bind-address = 127.0.0.1,该配置会限制MySQL客户端只能在本机访问,可以注释掉,或者修改为0.0.0.0

修改完成记得重启MySQL服务

  1. 密码认证插件类型

配置文件修改了,此时再次尝试连接MySQL,提示错误号码1698,这个就是密码认证插件的问题了

查看认证插件类型

# 查看认证插件类型
use mysql
select user,host,plugin from user;

可以看到,此时root用户的认证类型为auto_socket,并不是默认的mysql_native_password

小贴士:

auth_socket 是一个插件,通常用于 MySQL 数据库服务器中。它允许客户端通过操作系统本身的认证机制来连接到 MySQL 服务器,而不需要在 MySQL 中单独设置密码。这意味着,如果操作系统的用户账户与 MySQL 用户账户相匹配,并且该用户具有使用 auth_socket 插件的权限,那么该用户就可以直接登录到 MySQL 而无需输入密码。

----------------- 我是一条分割线

这个功能一般用于一些需要自动化的场景中,比如脚本或服务需要定期连接到数据库执行任务,而避免了硬编码数据库凭证的风险。此外,这也提高了安全性,因为减少了因密码泄露而导致的安全风险。

修改密码插件认证类型

# 修改认证插件为默认的mysql_native_password
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '密码';

执行修改命令

这是修改后的结果

经过以上操作,问题终于解决了。主要的原因是主机绑定密码认证插件类型的问题

  1. 反向域名解析(只是警告)

这个可以在MySQL的错误日志当中查看到,路径为/var/log/mysql/error.log

出现错误的原因是MYSQL Server在本地内存中维护了一个非本地的Client TCP cache,这个cache中包含了远程Client的登录信息,比如IP地址,hostname等信息。
如果Client连接到服务器后,Mysql首先会在本地TCP池中根据IP地址解析客户端的hostname或者反向解析,如果解析不到,就会去DNS中进行解析,如果还是解析失败就是在error log中写入这样的警告信息。

严格来说,这不算是一个错误,只是警告,服务端也能够正常连接。但建议禁用掉,毕竟远程访问多了,会消耗一部分服务端性能,这也算是一种优化措施

解决办法:

在配置文件[mysqld]块中添加如下参数

[mysqld]
# 跳过主机缓存,减少服务端性能消耗
skip-host-cache
# 跳过对主机的反向域名解析
# 它将禁止MySql Server对外部连接进行DNS解析,使用这一选项可以消除MySql进行DNS解析的时间
skip-name-resolve

修改完成,记得重启MySQL服务


Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表