背景
在阿里云 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_database 和 your_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 配置正确,安全组未放行端口时公网连接仍会被拦截。
- 登录阿里云控制台,进入目标 ECS 实例的安全组配置。
- 在入方向规则中添加或确认以下规则:
| 配置项 | 建议值 |
|---|---|
| 协议类型 | TCP |
| 端口范围 | 3306/3306 |
| 授权对象 | 客户端的固定公网 IP 或可信网段 |
注意:
0.0.0.0/0表示所有 IPv4 地址均可访问。除临时排障外,不建议将其用于 MySQL 的公网访问。
4. 检查系统防火墙
Linux 系统中的 firewalld 或 iptables 也可能拦截 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 错误日志中的认证或网络错误。
Comments