linux中mysql的设置是root和test都是%,且密码正确,但是远程连接不上,超时

1.检查防火墙端口是否开放了
firewall-cmd --list-ports
2.检查ip是否能够ping
3.补充问题场景:之前是可以远程连接的且没配置没变过,
4.关闭了防火墙(systemctl stop firewalld)后,成功访问到了

5.现有状态,只启用了firewalld,没启用iptables

### 🔍 问题的核心:Docker 与 Firewalld
Docker 默认会创建自己的 `iptables` 规则进行端口转发,即使你关闭了系统级的 `iptables` 服务,Docker 为了正常运行也会重新启用相关模块。而 `firewalld` 运行时,Docker 创建的规则可能会被干扰,导致数据包转发失败。

因此,你看到的现象是:**仅开放端口 3307,远程连接超时;但关闭防火墙(`firewalld`)却能连通**。这表明问题很可能出在 `firewalld` 和 Docker 的网络规则冲突上。

### 💡 解决方案:让 Firewalld 信任 Docker
要解决此冲突,你需要将 Docker 的网桥接口(如 `docker0`)添加到 `firewalld` 的“信任区域”(trusted zone)。信任区域内的流量不受任何规则限制。


1. **将 Docker 接口加入信任区**:首先,找出 Docker 使用的网络接口(通常是 `docker0`)。然后将其永久添加到 `firewalld` 的信任区。
```bash
# 查看 Docker 使用的网络接口
ip addr show | grep docker
# 通常输出中包含 docker0
# 将 docker0 接口加入 firewalld 的信任区
sudo firewall-cmd --permanent --zone=trusted --add-interface=docker0
```
2. **重新加载 firewalld 配置**:使更改生效。
```bash
sudo firewall-cmd --reload
```
3. **验证配置**:检查信任区设置和已开放的端口是否包含 3307。
```bash
# 查看 trusted 区域包含的接口
sudo firewall-cmd --zone=trusted --list-all
# 再次确认 public 区域的开放端口
sudo firewall-cmd --zone=public --list-ports
```

### 📝 后续检查清单
完成上述步骤后,请按以下顺序检查,这能帮你快速定位剩余问题:
1. **确认端口监听**:在宿主机执行 `ss -tlnp | grep :3307`,确保 Docker 的代理进程正在监听。
2. **重启 Docker 服务**:执行 `sudo systemctl restart docker` 让 Docker 在 `firewalld` 新规则下重新配置网络。
3. **重启 MySQL 容器**:执行 `docker restart <容器名或ID>`。
4. **测试连接**:从远程机器再次尝试连接 `mysql -h 192.168.31.80 -P 3307 -u root -p`。
5. **检查容器内 MySQL 配置**:如果仍有问题,需进入容器确认 MySQL 是否绑定到 `0.0.0.0`(例如,检查配置文件中的 `bind-address` 参数)。在容器内执行 `cat /etc/mysql/my.cnf | grep bind-address` 查看。

posted @ 2025-12-15 15:52  爱晒太阳的懒猫。。  阅读(2)  评论(0)    收藏  举报