MySQL连接被拒绝主因是bind-address设为127.0.0.1或skip-networking启用,需改为0.0.0.0并关闭skip-networking;其次检查防火墙(ufw/firewalld)及云平台安全组;再确认用户权限是否允许远程host;最后排查max_connections和DNS反查问题。
bind-address 和 skip-networking
绝大多数“Connection refused”错误不是防火墙导致的,而是 MySQL 服务压根没监听外部网络。默认配置下,mysqld 往往只绑定 127.0.0.1 或启用 skip-networking,这时即使防火墙全开,远程也连不上。
检查方法:
mysql -u root -e "SHOW VARIABLES LIKE 'bind_address';" mysql -u root -e "SHOW VARIABLES LIKE 'skip_networking';"
bind_address 是 127.0.0.1,需改为 0.0.0.0(监听所有接口)或具体内网 IPskip_networking 为 ON,必须在 my.cnf 的 [mysqld] 段中显式设为 skip-networking = OFF 或直接删掉该行sudo systemctl restart mysql(或 mariadb)ufw 和 firewalld 的区别处理ufw(Ubuntu/Debian)和 firewalld(CentOS/RHEL 8+)规则语法不同,混用会导致端口看似开放实则拦截。
确认当前防火墙状态:
sudo ufw status verbose # Ubuntu sudo firewall-cmd --state # CentOS/RHEL
ufw:运行 sudo ufw allow 3306/tcp,不要只写 allow 3306(默认是 deny)firewalld:需指定 zone,例如 sudo firewall-cmd --permanent --add-port=3306/tcp --zone=public,然后 sudo firewall-cmd --reload
Host 'x.x.x.x' is not allowed to connect:权限与主机名解析问题这个错误和网络通不通无关,是 MySQL 用户权限限制。即使防火墙和 bind 都正确,root@localhost 也无法从远程登录。
CREATE USER 'appuser'@'%' IDENTIFIED BY 'strongpass';
GRANT ALL ON *.*):GRANT SELECT,INSERT,UPDATE ON mydb.* TO 'appuser'@'%';
FLUSH PRIVILEGES; 生效'%' 换成 '192.168.1.%' 或具体 IP;'%' 不匹配 IPv6 地址,如需支持得单独加 '::1' 或 '::/0'
max_connections 和 DNS 反查telnet your-server 3306 成功,只说明 TCP 层可达,不代表 MySQL 服务能响应认证请求。
mysql -u root -e "SHOW STATUS LIKE 'Threads_connected';" && mysql -u root -e "SHOW VARIABLES LIKE 'max_connections';"
my.cnf 的 [mysqld] 下加 skip-name-resolve,然后用户权限里的 host 必须用 IP 或 %,不能用域名--prot
ocol=tcp 强制走 TCPMySQL 的网络问题往往卡在「你以为是防火墙,其实是配置」,或者「防火墙开了,但用户权限或 DNS 拦住了」。逐层验证比盲目关防火墙更可靠。