在 Debian 系统上配置 MySQL 远程访问,核心就两步:改配置、开端口。很多新手容易踩的坑是只改了防火墙忘了改 MySQL 监听地址,或者反过来。下面按最稳妥的流程走一遍,适合轻量服务器(如阿里云 ECS、腾讯云 CVM、AWS EC2 等)的生产环境或开发测试环境。
1. 确认 MySQL 版本和配置文件位置
Debian 10/11/12 默认使用 MariaDB 或 MySQL 8.0+。先确认你装的是哪个:
mysql --version
如果是 MySQL 5.7/8.0,主配置文件通常在 /etc/mysql/mysql.conf.d/mysqld.cnf
如果是 MariaDB,可能在 /etc/mysql/mariadb.conf.d/50-server.cnf
建议直接编辑
/etc/mysql/my.cnf,它通常会 include 上述文件,避免遗漏。
2. 修改绑定地址(bind-address)
默认情况下,MySQL 只监听 127.0.0.1,也就是只允许本地连接。要允许远程访问,必须修改 bind-address。
用编辑器打开配置文件:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
找到这一行:
bind-address = 127.0.0.1
改成:
bind-address = 0.0.0.0
注意:
0.0.0.0表示监听所有网卡接口。如果你有多张网卡且只想暴露特定 IP,可以写成具体 IP,但大多数场景用0.0.0.0更省事。
保存退出后,重启 MySQL 服务使配置生效:
sudo systemctl restart mysql
# 如果是 MariaDB,命令是 sudo systemctl restart mariadb
验证是否监听成功:
ss -tlnp | grep mysql
输出应包含类似 *:3306 的行,而不是 127.0.0.1:3306。
3. 创建或授权远程用户
MySQL 的用户权限是“用户名@主机”的组合。默认 root 用户通常只允许 localhost 登录。你需要创建一个能远程登录的用户,或者修改现有用户的 host。
方法一:创建新用户(推荐)
sudo mysql -u root -p
进入 MySQL 命令行后执行:
-- 创建用户 'myuser',密码为 'mypassword',允许从任意主机连接
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
-- 授予对某个数据库的所有权限(生产环境建议最小权限原则)
GRANT ALL PRIVILEGES ON mydatabase.* TO 'myuser'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
%表示任意主机。如果希望限制特定 IP 段,可改为'192.168.1.%'或具体 IP'123.45.67.89'。
方法二:修改 root 用户(不推荐用于生产)
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpassword';
-- 然后删除 localhost 用户并重新创建 root@%
DROP USER 'root'@'localhost';
CREATE USER 'root'@'%' IDENTIFIED BY 'newpassword';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
⚠️ 强烈不建议将 root 开放给远程访问。安全风险极高。
4. 配置防火墙
Debian 本身不带 iptables 前端,通常使用 ufw(Uncomplicated Firewall)。检查状态并放行 3306 端口:
sudo ufw status
如果显示 Status: active,则执行:
sudo ufw allow 3306/tcp
sudo ufw reload
如果你的服务器使用的是云厂商的安全组(Security Group),比如阿里云、腾讯云、华为云等,必须在控制台里添加一条入站规则,协议 TCP,端口 3306,源 IP 设置为你的客户端 IP 或 0.0.0.0/0(谨慎使用后者)。
很多用户在这里卡住:本地防火墙关了,MySQL 也配了,但就是连不上,原因往往是云平台的安全组没开。
5. 测试远程连接
从另一台机器(可以是本地电脑或其他服务器)测试:
mysql -h <你的服务器公网IP> -P 3306 -u myuser -p
输入密码后如果能进入 MySQL 提示符,说明配置成功。
常见问题排查
- Connection refused:检查 MySQL 是否在监听
0.0.0.0:3306,以及防火墙是否放行。 - Access denied for user:检查用户 host 是否为
%或对应 IP,密码是否正确,权限是否授予。 - Timeout:通常是云安全组或网络 ACL 拦截,联系云厂商客服查日志。
- MySQL 8.0 认证插件问题:MySQL 8.0 默认使用
caching_sha2_password,旧版客户端可能不支持。创建用户时可指定:
CREATE USER 'myuser'@'%' IDENTIFIED WITH mysql_native_password BY 'mypassword';
安全建议(重要)
- 不要开放 root 远程访问。
- 尽量限制源 IP,用
%等于对全世界开放。 - 启用 SSL/TLS 加密连接,防止密码中间人窃取。
- 定期更新 MySQL,修复已知漏洞。
- 考虑使用跳板机或 SSH 隧道,而非直接暴露 3306 端口到公网。例如:
ssh -L 3306:127.0.0.1:3306 user@your-server-ip
然后通过 localhost:3306 连接,更安全。
以上步骤覆盖了绝大多数 Debian + MySQL/MariaDB 场景。如果遇到特殊报错,提供完整错误信息才能进一步定位。
云技术博客