远程MySQL连接被拒绝求助:端口开放仍无法连接
看起来你已经做了不少基础排查:Telnet能通3307端口、取消了bind-address限制、给对应IP授权了权限,但还是遇到ERROR 2003 (HY000): Can't connect to MySQL server on '176.35.197.115' (111 "Connection refused")和PHP脚本里的2002连接拒绝警告,下面是几个容易被忽略的排查方向,帮你定位问题:
确认MySQL服务是否真的监听了3307端口
有时候修改配置后没重启服务,或者配置文件里有隐藏的监听限制。在MySQL服务器上执行以下命令,检查端口监听状态:netstat -tulpn | grep mysql # 或者用更现代的ss命令 ss -tulpn | grep mysql正常情况下应该能看到
0.0.0.0:3307或:::3307的输出(表示监听所有IP)。如果只显示127.0.0.1:3307,说明服务还是只监听本地,可能是my.cnf里有其他子配置文件覆盖了设置,或者重启服务没生效,记得执行systemctl restart mysql(或service mysql restart)重新加载配置。检查防火墙/安全组的深层规则
Telnet能连通端口不代表防火墙没有拦截MySQL的握手流量。有些防火墙会允许初始TCP连接,但过滤MySQL协议的数据包。你可以:- 用
ufw status(如果用ufw防火墙)查看3307端口的入站规则是否为ALLOW - 用
iptables -L -n | grep 3307检查iptables规则,确保存在ACCEPT条目 - 如果是云服务器,还要确认云服务商的安全组是否开放了3307端口的入站权限(有些云安全组默认只开放常见端口)
- 用
验证授权权限是否真正生效
虽然你提到已经授权,但可能授权语句的host字段不匹配。登录MySQL服务器,执行:SELECT user, host FROM mysql.user;检查对应账号的
host字段是否是你要连接的远程IP(比如176.35.197.115),或者用'%'(允许所有IP,不推荐生产环境)。如果host是localhost,那这个权限只适用于本地连接,远程连接会被拒绝。正确的授权语句应该是:GRANT ALL PRIVILEGES ON *.* TO 'your_username'@'176.35.197.115' IDENTIFIED BY 'your_password'; FLUSH PRIVILEGES;执行完授权后一定要用
FLUSH PRIVILEGES;刷新权限。查看MySQL错误日志找线索
这是最直接的排查方法,错误日志会记录连接失败的具体原因。找到日志路径(通常在/var/log/mysql/error.log,或者my.cnf里log_error配置的路径),查看连接失败时段的日志内容,可能会看到权限不足、端口配置错误、SSL强制要求等具体提示。确认PHP连接脚本的端口参数
PHP的mysqli_connect默认使用3306端口,你需要明确指定3307端口才能连接。正确的连接代码应该是:$conn = mysqli_connect('176.35.197.115', 'your_username', 'your_password', 'your_database', 3307); if (!$conn) { die('Connect Error: ' . mysqli_connect_error()); }检查你的脚本是否遗漏了端口参数,导致用默认的3306端口连接,从而触发拒绝错误。
内容的提问来源于stack exchange,提问作者Owen Lewis

