在腾讯云 Ubuntu 服务器上配置 MySQL 远程访问,需要完成以下关键步骤:修改 MySQL 用户权限、配置防火墙规则(包括安全组)、确保网络可达性。以下是详细操作指南:
✅ 前提条件
- 已安装 MySQL(或 MariaDB)服务
- 拥有
root或具有sudo权限的账号 - 知道要允许访问的客户端 IP(建议限制为具体 IP,避免全开放)
🔧 步骤一:登录并进入 MySQL
sudo mysql -u root -p
若未设置密码,可直接
sudo mysql;若使用 Debian/Ubuntu 默认 auth_socket 插件,可先跳过密码或使用sudo mysql。
📌 步骤二:创建/修改允许远程访问的用户
方案 A:修改现有 root 用户(不推荐生产环境)
-- 查看当前 host 限制
SELECT user, host FROM mysql.user;
-- 将 root 用户的 host 改为 '%'(允许任意 IP),或指定具体 IP
UPDATE mysql.user SET host = '%' WHERE user = 'root';
FLUSH PRIVILEGES;
⚠️ 注意:直接开放 root@'%' 存在严重安全风险。强烈建议新建专用远程用户。
✅ 推荐方案:创建专用远程用户
-- 创建新用户(替换 your_password 和 client_ip)
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'StrongPassword123!';
-- 授予必要权限(根据需求调整,例如只给特定数据库)
GRANT ALL PRIVILEGES ON mydb.* TO 'remote_user'@'%';
-- 或全部库(谨慎使用)
-- GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%';
FLUSH PRIVILEGES;
🔐 替代
%为具体 IP 更安全,例如'client.example.com'或'192.168.1.100'
多个 IP 可用逗号分隔(MySQL 8+ 支持IN ('ip1','ip2')需用子查询或多次授权)
🛡️ 步骤三:配置 MySQL 绑定地址(bind-address)
编辑 MySQL 配置文件:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# 或 Debian/Ubuntu 新版路径:/etc/mysql/mysql.conf.d/mysqld.cnf
找到并修改(或添加):
[mysqld]
# 注释掉 bind-address = 127.0.0.1
# bind-address = 127.0.0.1
bind-address = 0.0.0.0 # 监听所有网卡(生产环境建议结合防火墙控制)
✅ 保存后重启 MySQL:
sudo systemctl restart mysql
💡 若需仅监听内网 IP(如云私网),可改为服务器内网 IP(如
172.16.0.5),而非0.0.0.0。
🔥 步骤四:配置腾讯云安全组(关键!)
- 登录 腾讯云控制台
- 进入 云服务器 CVM → 选择实例 → 安全组
- 找到该实例绑定的安全组,点击 编辑规则
- 添加入站规则:
- 类型:
MySQL (3306) - 来源:填写客户端公网 IP(或 CIDR,如
192.168.1.0/24) - 协议:TCP
- 端口范围:
3306 - 策略:允许
- 类型:
⚠️ 切勿将来源设为
0.0.0.0/0(全网开放),除非用于测试且配合强密码 + 时间窗口。
🧪 步骤五:验证远程连接
从客户端机器执行:
mysql -h <服务器公网IP> -P 3306 -u remote_user -p
输入密码后应能成功登录。
若失败,检查:
- 安全组是否放行
bind-address是否正确- 防火墙(
ufw或iptables)是否拦截:sudo ufw status sudo ufw allow 3306/tcp from <客户端IP> to any port 3306
🔒 安全最佳实践建议
| 措施 | 说明 |
|---|---|
✅ 禁止 root 远程登录 |
使用普通用户 + 最小权限原则 |
| ✅ 限制来源 IP | 用具体 IP/CIDR 替代 % |
| ✅ 启用 SSL/TLS | 防止中间人攻击(参考 MySQL SSL 配置) |
| ✅ 定期更新密码与审计日志 | log_connections=ON 记录登录行为 |
| ✅ 使用跳板机/SSH 隧道 | 更安全的替代方案:ssh -L 3306:localhost:3306 user@your-server-ip然后本地连 mysql -h 127.0.0.1 -P 3306 |
需要我提供:
- SSH 隧道连接示例?
- 自动化脚本一键配置?
- 针对云数据库 TDSQL-C(原 CynosDB)的配置差异?
欢迎告诉我你的具体场景,我可进一步定制方案。
PHPWP博客