Navicat连接Linux上MySQL 5.7提示“网络不可达”,本质是TCP连接未建立,需按序排查:一、telnet或nc测试3306端口是否可达;二、确认my.cnf中bind-address=0.0.0.0且无skip-networking;三、检查系统防火墙及云安全组是否放行3306/tcp。

Navicat 连接 Linux 上的 MySQL 5.7 提示“网络不可达”,基本可以断定问题卡在 TCP 连接建立之前——不是认证失败,也不是权限不足,而是客户端压根没摸到服务端的 TCP 端口。先别改 my.cnf 或跑 SQL,按链路顺序一层层验证。
telnet 3306 端口不通是第一信号
这是最直接的判断依据。“网络不可达”在 Navicat 里常对应底层 socket 错误(如 Connection refused 或超时),而 telnet 能绕过所有上层逻辑,直击 TCP 层:
- 在 Windows 客户端 cmd 中执行:
telnet 192.168.1.100 3306(把 IP 换成你的服务器地址) - 若提示“无法打开到主机的连接”,说明连接被拦截或服务未监听该地址+端口
- 若卡在“正在连接…”几秒后断开,大概率是防火墙 DROP 了包(不回 RST,只静默丢弃)
- Linux/macOS 用户用:
nc -zv 192.168.1.100 3306,效果等价
MySQL 5.7 默认不监听外网,bind-address 必须改
MySQL 5.7 的 my.cnf 默认设 bind-address = 127.0.0.1,意味着只接受本地回环连接。即使防火墙全开、用户授权正确,外部请求也会被内核直接拒绝。
- 编辑配置文件:
sudo vim /etc/my.cnf(或/etc/mysql/my.cnf,取决于发行版) - 在
[mysqld]段下添加或修改:bind-address = 0.0.0.0 - ⚠️ 注意:不要写成
bind-address = *—— MySQL 5.7 不识别该语法,会启动失败 - 重启服务:
sudo systemctl restart mysqld(CentOS/RHEL)或sudo systemctl restart mysql(Ubuntu/Debian) - 验证是否生效:
sudo ss -tlnp | grep :3306,输出中应含0.0.0.0:3306或*:3306
Linux 防火墙和云安全组要分开查
很多人只关了系统防火墙,却忘了云平台的安全组——它比 iptables 更优先拦截流量。
- 查本地防火墙:
sudo firewall-cmd --list-ports(CentOS 7+)或sudo ufw status(Ubuntu),确认3306/tcp在允许列表 - 若没开,加规则:
sudo firewall-cmd --permanent --add-port=3306/tcp && sudo firewall-cmd --reload - 云服务器(阿里云/腾讯云/AWS)必须进控制台 → 安全组 → 入方向规则 → 添加一条:
协议TCP,端口3306,源IP建议填具体客户端 IP,测试阶段可临时用0.0.0.0/0 - ⚠️ 安全组规则修改后无需重启服务器,但可能有 1–2 分钟延迟生效
服务状态和 skip-networking 参数不能漏
哪怕 systemctl status mysqld 显示 active,也可能因启动参数异常导致网络功能被禁用。
- 检查是否启用了
skip-networking:sudo grep -i "skip-networking" /etc/my.cnf,如果存在且未被注释,必须删掉或加#注释 - 确认 mysqld 进程实际加载的配置:
ps aux | grep mysqld,看启动命令里有没有--skip-networking或--bind-address覆盖项 - 查看错误日志定位启动问题:
sudo tail -20 /var/log/mysqld.log(CentOS)或/var/log/mysql/error.log(Ubuntu),关注 “Could not load” 或 “Failed to bind” 类报错
真正卡住人的地方,往往不是某一步做错了,而是多个环节都差一点:比如 bind-address 改了但没重启服务,或者安全组开了但防火墙还拦着,又或者 telnet 通了但 Navicat 里填了 localhost 而不是服务器真实 IP。每验证一步,就排除一个确定性因素,别跳步。


















