mysql白名单本质是用户host字段精确匹配,必须create user时显式指定ip(如'root'@'203.123.45.67'),不支持update修改host、不兼容cidr,需配合bind-address=0.0.0.0及防火墙/安全组放行。

不能直接给现有 root 用户加“白名单”,MySQL 8.0 不支持在已有用户上追加 host 条件;必须显式创建新用户,且 host 字段必须精确匹配客户端 IP —— 这才是真正的白名单。
为什么 UPDATE user SET host='%' 不算白名单?
执行 UPDATE user SET host = '%' WHERE user = 'root' 后,'root'@'%' 允许任意 IP 连接,等于放弃白名单控制。MySQL 的 host 字段是精确匹配(非正则、不支持 CIDR),% 就是通配符,不是子网掩码。真正白名单只有一种写法:'root'@'203.123.45.67'。
CREATE USER 必须带 host,且不能省略 plugin
MySQL 8.0 拆分了用户创建与授权两步,GRANT 不再隐式建用户;同时默认认证插件是 caching_sha2_password,但很多客户端(如旧版 Navicat、PHP mysqli 扩展)不兼容,导致报错 ERROR 2059 (HY000)。
- 先创建带指定 IP 和插件的用户:
CREATE USER 'root'@'203.123.45.67' IDENTIFIED WITH mysql_native_password BY 'YourStrongPass123!'; - 再授权:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'203.123.45.67' WITH GRANT OPTION; - 最后刷新:
FLUSH PRIVILEGES;
bind-address 和防火墙必须配合生效
即使用户建对了,mysqld 进程若仍监听 127.0.0.1:3306,外部连接会直接被拒绝(不是超时,是 connection refused)。确认方式:sudo ss -tlnp | grep :3306,输出应含 *:3306。
- 修改配置文件(Ubuntu/Debian 是
/etc/mysql/mysql.conf.d/mysqld.cnf,CentOS 是/etc/my.cnf)中bind-address = 127.0.0.1→ 改为bind-address = 0.0.0.0 - 重启服务:
sudo systemctl restart mysql - 云服务器还需在安全组放行 3306 端口,源 IP 填
203.123.45.67/32;本地 Linux 防火墙也要放行,如:sudo ufw allow from 203.123.45.67 to any port 3306
白名单的本质是三重校验:MySQL 用户表 host 匹配 + bind-address 监听对应 IP + 网络层(安全组+系统防火墙)放行该 IP 的 3306 端口。漏掉任意一层,都会连不上,且错误现象不同——Connection refused 是监听问题,Access denied 是权限或认证问题,Timeout 是防火墙拦截。











