2003错误大概率是防火墙拦截3306端口,需检查系统防火墙(firewalld/ufw/Windows防火墙)及云服务器安全组是否放行,并用telnet或nc验证端口可达性,同时确认MariaDB监听0.0.0.0:3306且未启用skip-networking。
检查防火墙是否放行3306端口
navicat 连接 mariadb 报错 2003 - can't connect to mysql server on 'xxx' (10061),如果服务已运行、配置正确、用户权限无误,那大概率是防火墙拦住了 3306 端口的入站连接。这个环节常被跳过,但恰恰是远程连接失败最顽固的卡点。
Linux 上默认启用 firewalld 或 ufw,Windows 则走系统自带防火墙规则。不检查端口通断,光改配置等于白调。
- 在 MariaDB 服务器上执行:
sudo ss -tlnp | grep :3306—— 确认 MariaDB 确实在监听0.0.0.0:3306(而非仅127.0.0.1:3306) - 检查防火墙状态:
sudo firewall-cmd --state(firewalld)或sudo ufw status verbose(Ubuntu) - 若未开放 3306,立即添加规则:
sudo firewall-cmd --add-port=3306/tcp --permanent+sudo firewall-cmd --reload - Windows 用户请进「高级安全 Windows 防火墙」→「入站规则」→ 新建规则 → 端口 → TCP 3306 → 允许连接 → 作用域设为“任何 IP”(测试阶段)
- 别忘了云服务器(如阿里云、腾讯云)还有安全组——必须单独在控制台放行 3306,它比系统防火墙更外层,漏掉就彻底不通
验证 3306 是否真能从外部访问
改完防火墙不验证,等于没改。本地 telnet xxx.xxx.xxx.xxx 3306 或用 nc -zv xxx.xxx.xxx.xxx 3306 是最直接的检测方式。失败 ≠ 防火墙问题,也可能是 MariaDB 没监听公网地址,或中间网络设备(如路由器、NAT)做了拦截。
- 从 Navicat 所在机器执行:
telnet your-mariadb-server-ip 3306;如果显示 “Connected”,说明端口通了;如果超时或拒绝连接,继续往下排查 - 若 telnet 失败但
ss -tlnp显示监听0.0.0.0:3306,立刻检查云厂商安全组和物理网络路径 - 若 telnet 成功但 Navicat 仍报 2003,问题已移出网络层,转向 MariaDB 用户权限或 SSL 配置
- 注意:某些 ISP 或企业内网会屏蔽 3306,可临时换端口测试(如改 MariaDB 的
port=3307并同步放行)来交叉验证
firewalld/ufw 规则常见陷阱
加了端口却没生效?不是命令写错,就是规则没持久化或作用域不对。尤其 firewalld 默认只对 public zone 生效,而很多服务器初始化后实际在 default zone 或其他 zone。
-
firewall-cmd --list-all查当前 zone 的所有规则,确认 3306 在ports:列表里,且 zone 名是你正在用的那个(常用public或trusted) -
ufw allow 3306后必须sudo ufw reload,否则不生效;ufw status输出中要看到3306/tcp在 ALLOW 行 - CentOS 7+ 默认用 firewalld,但有人手动装了 iptables-services 并启用,会导致 firewalld 规则被覆盖——查
systemctl status iptables,开着就关掉:sudo systemctl stop iptables && sudo systemctl disable iptables - 不要用
iptables -A INPUT ...直接加规则,firewalld 和 iptables 混用极易冲突,统一用 firewalld 命令管理
为什么 telnet 通了,Navicat 还连不上?
这是最让人抓狂的阶段:端口开着,服务跑着,用户授权了,结果 Navicat 依旧报 2003。此时重点看 MariaDB 的 bind-address 和客户端解析行为。
- 即使防火墙开了 3306,若 MariaDB 配置了
bind-address = 127.0.0.1,它只接受本机回环连接,外部请求会被静默丢弃 —— 必须改成0.0.0.0或具体服务器 IP - 修改
/etc/my.cnf或/etc/mysql/mariadb.conf.d/50-server.cnf中的[mysqld]段,加一行:bind-address = 0.0.0.0,然后sudo systemctl restart mariadb - Navicat 连接时填的主机名如果是
localhost,Windows/macOS 会优先走 socket 连接(绕过 TCP),而 socket 文件路径可能不对;改用127.0.0.1强制走 TCP,能更快暴露真实问题 - 某些 MariaDB 版本(如 10.6+)默认启用
skip-networking = off,但若误配为on,会直接禁用所有 TCP 连接 —— 检查配置文件里有没有这行,有就删掉或设为off
防火墙端口放开只是必要条件,不是充分条件。真正卡住人的,往往是 bind-address 和 skip-networking 这两个配置项被忽略,或者云安全组与系统防火墙双层遗漏。动手前,先用 telnet 定位到底卡在哪一层。


















