无法从外部连接MariaDB数据库的问题排查求助
问题场景
家用PC通过DBeaver/HeidiSQL连接VPS上的MariaDB时出现超时(错误码10060),已完成以下操作但未解决:
- 确认IP、端口、账号密码正确,能ping通服务器,本地可通过phpMyAdmin访问数据库
- 修改
/etc/mysql/mariadb.conf.d/50-server.cnf设置bind-address = 0.0.0.0 - 创建主机为
%的授权用户并赋予GRANT OPTION权限 - 服务器内
iptables -L显示3306端口放行,未安装UFW netstat -tlnp | grep 3306显示端口处于监听状态,但外部端口检测工具显示端口关闭
排查与解决步骤
检查云服务商安全组规则
多数VPS服务商的云安全组独立于服务器内部防火墙,即使服务器内放行3306,安全组未开放则外部无法访问。登录服务商后台,找到对应服务器的安全组,添加入站规则:允许TCP协议3306端口,源地址设为游戏服务器IP(推荐)或0.0.0.0/0(全开放,不建议)。验证MariaDB用户授权有效性
登录服务器本地MariaDB,执行以下命令确认授权:FLUSH PRIVILEGES; SELECT user, host FROM mysql.user WHERE user = '你的用户名';确保查询结果中用户的
host为%或游戏服务器IP。若存在同一用户的host为localhost的条目,优先匹配本地规则会导致远程连接失败,可删除该冗余条目。确认iptables规则正确性
执行sudo iptables -L -n查看规则,需存在如下条目:ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306若缺失,添加规则并保存:
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT sudo iptables-save > /etc/iptables/rules.v4 # 防止重启后规则丢失注意:若iptables默认规则为DROP所有入站流量,需确保ACCEPT规则在DROP规则之前。
验证端口监听配置
执行ss -tlnp | grep 3306(比netstat更准确),确认监听地址为0.0.0.0:3306或:::3306,而非127.0.0.1:3306。若为后者:- 检查是否有其他配置文件(如
/etc/mysql/my.cnf、/etc/mysql/conf.d/下的文件)覆盖了bind-address设置 - 修改配置后执行
sudo systemctl restart mariadb重启服务
- 检查是否有其他配置文件(如
跨节点端口连通性测试
在游戏服务器上执行nc -zv 1.2.3.4 3306或telnet 1.2.3.4 3306:- 若游戏服务器也无法连接,问题在VPS端;
- 若游戏服务器能连接但家用PC不行,需排查家用网络(如运营商屏蔽3306、路由器防火墙限制)
查看MariaDB错误日志
查看/var/log/mariadb/mariadb.log(路径可能因系统不同略有差异),查找连接失败的具体报错信息,进一步定位问题。
内容的提问来源于stack exchange,提问作者Michael Griffith

