刚安装好的MySQL 8.0如何开启并配置安全的外部远程连接权限?

作者:袖梨 2026-07-16
MySQL 8.0远程连接需同步解除四层封锁:①将bind-address设为0.0.0.0并重启服务;②用CREATE USER指定mysql_native_password插件创建用户并授权;③开放本地防火墙及云安全组3306端口;④客户端显式指定认证插件。

刚装好的 MySQL 8.0 默认完全禁止远程连接,不是“没开权限”,而是从监听地址、用户 host、认证插件、防火墙四层全部堵死——必须同步解四道锁,缺一不可。

确认并修改 bind-address = 0.0.0.0

MySQL 进程默认只监听 127.0.0.1:3306,外部请求根本到不了服务端。光改用户权限没用。

  • 配置文件位置:/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu/Debian)或 /etc/my.cnf(CentOS/RHEL),Windows 是 C:ProgramDataMySQLMySQL Server 8.0my.ini
  • [mysqld] 段下找到 bind-address = 127.0.0.1,改为 bind-address = 0.0.0.0 或直接注释掉整行
  • 重启服务:sudo systemctl restart mysql(Ubuntu)或 net stop mysql80 && net start mysql80(Windows)
  • 验证是否生效:ss -tlnp | grep :3306 输出中必须含 *:33060.0.0.0:3306,不能只有 127.0.0.1:3306

创建专用用户并强制指定 mysql_native_password 插件

MySQL 8.0 默认用 caching_sha2_password,Navicat、旧版 PyMySQL、PHP mysqli 等会直接报 ERROR 2059 或卡在握手阶段。

  • 切勿执行 UPDATE user SET host = '%' —— MySQL 8.0 会报 ERROR 1396 (HY000),且破坏系统表结构
  • 新建用户(推荐):CREATE USER 'app_user'@'192.168.10.%' IDENTIFIED WITH mysql_native_password BY 'StrongPass!2026';(生产环境禁用 '%',用具体 IP 段)
  • 授权(不授 ALL):GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_user'@'192.168.10.%';
  • 必须刷新:FLUSH PRIVILEGES;,否则权限仍在内存缓存中未加载
  • 验证插件:SELECT user, host, plugin FROM mysql.user WHERE user = 'app_user'; 返回的 plugin 必须是 mysql_native_password

放行 3306 端口(本地防火墙 + 云安全组)

ufw/firewalld 放行后不 reload,或云服务器安全组没开,现象都是 ERROR 2003 (HY000): Can't connect to MySQL server,但错误日志里无记录——静默丢包。

  • Ubuntu(ufw):sudo ufw allow 3306/tcp(注意不是 ufw allow 3306,后者默认开 UDP)
  • CentOS/RHEL(firewalld):sudo firewall-cmd --permanent --add-port=3306/tcp && sudo firewall-cmd --reload
  • Windows 防火墙:新建「入站规则」→「端口」→「TCP 3306」→ 勾选「域」「私有」「公共」所有配置文件
  • 云服务器(阿里云/腾讯云):必须单独在控制台「安全组」里添加入方向规则,协议 TCP,端口 3306,源 IP 按需限制
  • SELinux 启用时(sestatus 查看):sudo setsebool -P mysqld_connect_any on

客户端连接时显式指定 auth_plugin(Python/Java 场景)

即使服务端已设为 mysql_native_password,某些驱动仍会默认尝试 caching_sha2_password,导致连接失败。

  • PyMySQL:conn = pymysql.connect(..., auth_plugin='mysql_native_password')
  • mysql-connector-python:mysql.connector.connect(..., auth_plugin='mysql_native_password')
  • Navicat 15+ 可在连接属性 →「高级」→「Authentication Plugin」手动选 mysql_native_password
  • 不要删系统自带的 mysql_native_password 插件——它被 sys 库等内部账户依赖,删了可能导致 mysqld 启动失败

最容易被跳过的环节是:改完用户权限后忘了改 bind-address,或开了防火墙但没 reload,或云安全组压根没配。三者任一缺失,都会表现为“连不上”,但原因完全不同——得一层层查,不能只盯着 SQL 权限看。

相关文章

精彩推荐