背景

在阿里云 ECS 上安装 MySQL 后,本地电脑或其他服务器无法建立远程连接。问题通常出在 MySQL 用户授权、bind-address 监听地址、ECS 安全组、系统防火墙或端口监听状态。

本文按由内到外的顺序排查这些配置,并给出远程连接的验证方法。

环境信息

  • 云平台:阿里云 ECS
  • 数据库:MySQL 5.7 或 MySQL 8.0
  • 操作系统:CentOS、Alibaba Cloud Linux、Ubuntu 等 Linux 发行版
  • 默认端口:3306

注意:生产环境不要将 MySQL 端口对所有公网地址开放,也不要长期使用可远程登录的 root 账户。应创建专用数据库账户,并将安全组来源限制为可信 IP 或网段。

排查步骤

1. 检查 MySQL 用户是否允许远程连接

先登录 MySQL,查看账户允许从哪些主机连接:

# 使用 root 账户登录本机 MySQL
mysql -u root -p
-- 查看用户及其允许连接的来源主机
SELECT host, user FROM mysql.user;

如果目标账户的 host 列仅为 localhost,则该账户不能远程连接。建议创建权限最小化的专用账户:

-- 创建仅允许从指定公网 IP 连接的业务账户
CREATE USER 'app_user'@'203.0.113.10' IDENTIFIED BY 'your_password';

-- 授予业务库所需权限
GRANT ALL PRIVILEGES ON your_database.* TO 'app_user'@'203.0.113.10';

-- 重新加载权限表
FLUSH PRIVILEGES;

203.0.113.10 替换为实际客户端公网 IP,your_databaseyour_password 替换为实际值。若确实需要允许任意来源访问,可将主机部分改为 %,但应同时通过安全组严格限制来源。

说明:MySQL 8.0 不支持在 GRANT 语句中直接设置密码,应先使用 CREATE USER 创建账户,再执行授权。

2. 检查 bind-address 配置

MySQL 默认可能只监听 127.0.0.1。编辑配置文件,将监听地址改为可接受远程连接的地址。

常见配置文件为 /etc/my.cnf/etc/mysql/my.cnf/etc/mysql/mysql.conf.d/mysqld.cnf

# 编辑 MySQL 配置文件,按实际路径替换
sudo vim /etc/my.cnf

[mysqld] 节中找到或添加以下配置:

[mysqld]
# 监听所有 IPv4 网络接口
bind-address = 0.0.0.0

保存后重启 MySQL 服务:

# systemd 系统重启 MySQL 服务,服务名可能为 mysql 或 mysqld
sudo systemctl restart mysqld

3. 放行 ECS 安全组的 3306 端口

即使 MySQL 配置正确,安全组未放行端口时公网连接仍会被拦截。

  1. 登录阿里云控制台,进入目标 ECS 实例的安全组配置。
  2. 在入方向规则中添加或确认以下规则:
配置项 建议值
协议类型 TCP
端口范围 3306/3306
授权对象 客户端的固定公网 IP 或可信网段

注意:0.0.0.0/0 表示所有 IPv4 地址均可访问。除临时排障外,不建议将其用于 MySQL 的公网访问。

4. 检查系统防火墙

Linux 系统中的 firewalldiptables 也可能拦截 3306 端口。以 firewalld 为例:

# 查看 firewalld 服务状态
sudo systemctl status firewalld

# 永久放行 TCP 3306 端口
sudo firewall-cmd --permanent --add-port=3306/tcp

# 重新加载防火墙规则
sudo firewall-cmd --reload

如果系统使用 iptables 或未启用防火墙,请根据实际防火墙工具确认是否存在拦截规则。

5. 检查 MySQL 是否正在监听端口

在 ECS 上执行以下命令,确认 MySQL 正在监听 3306

# 查看 TCP 3306 端口的监听进程
sudo ss -lntp | grep ':3306'

正常输出通常包含以下任一种监听地址:

LISTEN 0 70 0.0.0.0:3306 0.0.0.0:*
LISTEN 0 70 [::]:3306 [::]:*

若只看到 127.0.0.1:3306,说明 MySQL 仍仅监听本地地址,应重新检查 bind-address 配置并重启服务。

6. 测试远程连接

在已获安全组授权的客户端执行连接测试:

# 从客户端连接 ECS 上的 MySQL,替换为实际公网 IP 和数据库账户
mysql -h <ECS_IP> -P 3306 -u app_user -p

连接成功后,可执行以下 SQL 确认当前登录账户和来源:

-- 确认当前认证账户和客户端地址
SELECT USER(), CURRENT_USER();

验证与总结

完成配置后,按下表逐项确认:

检查项 验证结果
数据库账户允许指定来源连接 已确认
MySQL 监听非本地地址 已确认
ECS 安全组仅放行可信来源的 3306 端口 已确认
系统防火墙已放行 3306/tcp 已确认
客户端可使用专用账户连接 已确认

若仍无法连接,可继续检查 ECS 的网络 ACL、VPC 路由表、客户端公网 IP 是否变化,以及 MySQL 错误日志中的认证或网络错误。

参考资源