MySQL 限制用户只能从指定 IP 访问,核心是创建用户时明确指定 host(主机地址),并配合防火墙或网络策略增强安全性。默认的
'user'@'localhost'只允许本机连接;而
'user'@'192.168.1.100'就只允许该 IP 连接。
创建指定 IP 的用户
使用
CREATE USER语句时,在用户名后用
@指定具体 IP 或域名:
CREATE USER 'appuser'@'192.168.1.50' IDENTIFIED BY 'strongpass123';—— 仅允许 192.168.1.50 连接
CREATE USER 'admin'@'10.0.2.0/255.255.255.0' IDENTIFIED BY 'pass';—— 允许 10.0.2.0/24 网段(MySQL 8.0+ 支持 CIDR 格式)
CREATE USER 'backup'@'%.example.com' IDENTIFIED BY 'bkpass';—— 允许匹配该域名的主机(需 DNS 可解析)
授权并刷新权限
创建用户后,用
GRANT分配具体库表权限,并执行
FLUSH PRIVILEGES生效:
GRANT SELECT, INSERT ON mydb.orders TO 'appuser'@'192.168.1.50';
FLUSH PRIVILEGES;—— 必须执行,否则新规则不生效
注意:不要对
'user'@'%'授权,否则会覆盖 IP 限制效果;如已存在通配符用户,建议先
DROP USER 'user'@'%';再重建。
验证与排查连接问题
从目标 IP 测试连接,确认是否受限:
在允许的机器上运行:mysql -u appuser -p -h your-mysql-server-ip若报错
Access denied for user ... (using password: YES),可能是密码错误、host 不匹配,或用户未授权对应数据库 检查当前用户列表:
SELECT User, Host FROM mysql.user;确认 host 字段是否精确匹配 查看错误日志:
tail -f /var/log/mysql/error.log(路径依安装方式而异),常含拒绝原因
补充安全建议
仅靠 MySQL 用户 host 限制不够,建议组合使用:
操作系统防火墙(如 iptables / ufw)只放行可信 IP 的 3306 端口 MySQL 配置文件中设置bind-address = 127.0.0.1(仅本地监听),再通过 SSH 隧道或反向代理访问 启用 SSL 连接,防止凭据在网络中明文传输 定期审查
mysql.user表,删除长期不用或 host 为
%的高危账户
