🔥博客介绍`: EvLast
🎥系列专栏:
<< C++项目>>
<<数据结构与算法>>
<< 算法入门>>
🎥 当前专栏:<< C++项目>>
专题 : 解决开发中的日常Bug
👍👍👍👍👍👍👍👍👍👍👍👍
☆*: .。. o(≧▽≦)o .。.:*☆
❤️感谢大家点赞👍收藏⭐评论✍️
问题描述
远程连接AlpineLinux 中的Mysql出现 无法连接的情况, 从报错可以看出密码问题其实是无法连通的问题.
原因解释
从参考的资料来看是 AlpineLinux 没有mysql 其实是使用的 MariaDB 的框架 那么MySQL 与 MariaDB 可以参考文章 : MariaDB 和 MySQL 全面对比:选择数据库需要考虑这几点
既然数据库为 MariaDB 那么我便去找 相关文章发现 需要这么几步解决
- 更改配置文件
- 打开MySQL/MariaDB用户权限连接
- 配置MySQL/MariaDB防火墙的监听
解决步骤
找到配置文件并更改
MariaDB 与普通的MySQL数据库的一个不同在于它的配置文件不止一个,它将不同的数据放入到不同的配置文件中。
根据官方的说法, MariaDB为了提高安全性,默认只监听127.0.0.1中的3306端口并且禁止了远程的TCP链接,我们可以通过下面两步来开启MySQL的远程服务
- 注释掉skip-networking选项来开启远程访问.
- 注释bind-address项,该项表示运行哪些IP地址的机器连接,允许所有远程的机器连接
- 使用一下命令查看配置文件
bash
mysqld --help --verbose
- 注释配置文件
这时候只要找到某一配置文件中的 bind-address = 127.0.0.1
进行注释 或者改为 bind-address = 0.0.0.0
这时候即可 , bind-address = 0.0.0.0
可以无需注释, 但是 bind-address = 127.0.0.1
必须注释,
- 将
skip-networking
变为 0 即skip-networking=0
如果没有skip-bind-address
然后添加skip-bind-address
, 有者无需添加
注: 可能无法将全部配置文件找全,或者本来就没有那么多配置文件 请在找到的配置文件中添加 skip-networking=0
skip-bind-address
, 如果没有 skip-networking=0
和 skip-bind-address
请手动添加 达到覆盖的目的
打开MySQL/MariaDB用户权限连接
无法进行远程连接其中一个原因便是用户没有开启远程连接的权限
1、使用root登陆mysql (知道密码直接登入)
当你不知道root密码,登陆不了,请修改/etc/my.cnf文件, 在Mysqld 配置段下添加:
skip-grant-tables
可以跳过mysql登陆时密码验证,改好后重启mysql服务:
bash
service mariadb restart
用这个登陆:mysql -u root -p
需要密码直接回车
- 更新root账号密码(知道密码可以跳过)
- 使用mysql数据库:use mysql;
- 更改root密码:
mysql
update user set authentication_string = password('root'), password_expired = 'N', password_last_changed = now() where user = 'root';
注:我的mysql版本未5.7,密码字段为【authentication_string】,不同版本mysql字段不一样,可以使用【select * from user;】查看密码字段
- 开启root账号远程登陆权限
1、使用mysql数据库:
mysq
use mysql;
2、查看root账号权限:
mysql
select user,host from user;
如果root不是【%】,使用语句更新:
mysql
update user set host = '%' where user = 'root';
或者
root账户中的host项是localhost表示该账号只能进行本地登录,我们需要修改权限,输入命令:
mysql
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
修改权限。%表示针对所有IP,password表示将用这个密码登录root用户,如果想只让某个IP段的主机连接,可以修改为
mysql
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.100.%' IDENTIFIED BY 'my-new-password' WITH GRANT OPTION;
注意:此时远程连接的密码可能与你在本地登录时的密码不同了,主要看你在IDENTIFIED BY后面给了什么密码,具体的请参考GRANT命令
最后
mysql
FLUSH PRIVILEGES;
打开防火墙
在 Alpine Linux 中,firewall-cmd 并不是用于管理防火墙的工具,因为 Alpine 使用的是 iptables,并且有一个名为 awall (Alpine Wall) 的前端界面来帮助管理 iptables 规则
。如果想要检查防火墙状态或者管理防火墙规则,应该使用 iptables 相关的命令。
如果出现
bash
ash: iptables: not found
- 安装 iptables:
bash
apk add iptables
- 添加MySQL连接端口
bash
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
- 保存你的规则,以便它们在系统重启后依然有效:
bash
iptables-save > /etc/iptables/rules.v4
- 确保
iptables
在系统启动时自动启动:
bash
rc-update add iptables
- 如果你想要查看当前的 iptables 规则,可以使用以下命令:
bash
iptables -L
防火墙重复情况
如果你发现有重复的防火墙规则,你可以通过 iptables
命令来删除特定的规则。使用以下步骤来删除重复的防火墙规则:
-
列出当前的 iptables 规则 :
列出所有的
iptables
规则,以确定哪些规则是重复的:bashiptables -L --line-numbers
这将列出所有的规则,包括规则编号、协议、选项、源地址、目标地址和端口。
这将显示每条规则的编号,格式如下:
Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306 2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306
-
删除重复的规则 :
其中
num
为编号 一旦确定了要删除的规则的编号,就使用iptables -D
命令来删除特定的规则。例如,如果你想要删除第一个ACCEPT
规则,你可以使用:bashiptables -D INPUT 1
这里
INPUT
是链的名称,1
是规则的编号。请确保使用正确的链名称和规则编号。 -
保存新的 iptables 配置 :
删除规则后,你需要保存新的配置,以确保在系统重启后更改生效。在 Alpine Linux 中,你可以使用
iptables-save
命令来保存规则:bashiptables-save > /etc/iptables/rules.v4
或者,如果你的系统使用
rc-update
来管理启动脚本,你可以确保iptables
规则在启动时应用:bashrc-update add iptables
-
重启 iptables 服务 :
为了确保更改立即生效,你可以重启
iptables
服务:bashiptables-save iptables-restore < /etc/iptables/rules.v4
或者,如果你的系统使用
s6
或openrc
,你可以使用:bashrc-service iptables restart
或者
bashs6-rc unsupervisor iptables s6-rc supervisor iptables
-
检查防火墙状态 :
最后,检查防火墙规则确保重复的规则已被删除:
bashiptables -L -n -v
以上便是我对于这次问题的眼界与解决方案