mysql通过host限制客户端来源,需精确匹配账号的host字段(如'admin'@'192.168.1.5'),注意localhost与127.0.0.1互不等价;同时兼容旧工具需指定mysql_native_password插件。

如何用 host 限制 MySQL 客户端连接来源
MySQL 本身不区分“工具”,只认连接的 host、user 和 authentication_string。所谓“限制特定工具”,本质是限制该工具发起连接时使用的主机名或 IP 地址。
常见错误现象:mysql -h 192.168.1.100 -u admin -p 能连,但用 Navicat 或 DBeaver 连不上,其实不是工具被拦,而是这些工具默认走的是你本机的 localhost 或 127.0.0.1,而你只给 'admin'@'192.168.1.100' 授权了。
- 授权时务必明确指定 host:用
'admin'@'192.168.1.%'允许网段,'admin'@'10.0.2.5'锁死单 IP,'admin'@'localhost'仅限本地 socket 连接 -
'admin'@'%'看似方便,但会匹配所有 host(包括远程),生产环境慎用 - MySQL 8.0+ 默认禁用
skip-name-resolve,若 DNS 解析慢或失败,会导致连接超时,建议在my.cnf中显式开启
为什么 Navicat / DBeaver 连接失败却报错 “Access denied for user”
这个错误不是认证失败,而是 MySQL 根本没找到匹配的账号记录——因为 host 不符。Navicat 默认填 localhost,但如果你只创建了 'user'@'127.0.0.1',它就匹配不上(反之亦然)。
MySQL 的账号匹配顺序是:先按 host 字符串精确匹配,再按通配符(%、_)最长前缀匹配,'user'@'localhost' 和 'user'@'127.0.0.1' 是两个独立账号,互不覆盖。
- 检查实际连接 host:在 Navicat 连接配置里看“Host name / IP address”字段填的是什么;DBeaver 的“Server Host”同理
- 查已存在账号:
SELECT User, Host FROM mysql.user;,确认有没有对应组合 - 不要依赖 GUI 工具自动补全的 host,手动写死更可靠
MySQL 8.0+ 的 caching_sha2_password 插件导致客户端拒绝连接
很多图形化工具(尤其是老版本 DBeaver、旧版 Navicat)不支持 caching_sha2_password 认证插件,连接时直接断开,错误可能表现为 “Public Key Retrieval is not allowed” 或静默失败。
这不是访问控制问题,而是协议层不兼容。MySQL 8.0 默认用这个插件,但传统工具仍习惯用 mysql_native_password。
- 临时解决:建用户时指定插件:
CREATE USER 'dev'@'192.168.1.5' IDENTIFIED WITH mysql_native_password BY 'pwd123'; - 已有用户可修改:
ALTER USER 'dev'@'192.168.1.5' IDENTIFIED WITH mysql_native_password BY 'pwd123'; - 注意:改完要
FLUSH PRIVILEGES;,且该用户后续只能用旧协议连接
用 require ssl + require ip 做双重约束是否可行
可以,但要注意语法和生效逻辑。REQUIRE SSL 强制加密通道,REQUIRE IP '192.168.1.5' 限制来源 IP,两者可共存,但必须写在一条 GRANT 或 CREATE USER 语句里。
容易踩的坑是误以为 REQUIRE IP 能替代 host 字段——不能。host 决定账号能否被选中,REQUIRE IP 是选中后的二次校验,且只对 TCP 连接有效(对 localhost socket 无效)。
- 正确写法:
CREATE USER 'api'@'%' REQUIRE SSL AND IP '10.0.2.100'; - IP 支持 CIDR:
IP '10.0.2.0/24',但 MySQL 版本需 ≥ 8.0.17 - 一旦加了
REQUIRE SSL,客户端必须配置 CA 或跳过验证(--ssl-mode=DISABLED会直接拒绝),否则连不上











