0

0

mysql中设置访问控制与IP白名单配置

P粉602998670

P粉602998670

发布时间:2026-01-06 11:31:14

|

583人浏览过

|

来源于php中文网

原创

MySQL访问控制核心是mysql.user表中host字段的匹配规则,而非防火墙或bind_address;需结合bind_address限制监听、host限定用户来源、防火墙/安全组控制网络层访问,并避免直接UPDATE权限表。

mysql中设置访问控制与ip白名单配置

MySQL 用户账户的 host 字段决定能否从指定 IP 连接

MySQL 的访问控制核心不在防火墙配置文件,而在于 mysql.user 表中每个用户的 host 值。它不是“白名单开关”,而是连接匹配规则:客户端发起连接时,MySQL 会按 user@host 组合逐行匹配权限表,取最具体的匹配项(比如 'app'@'192.168.1.100' 优先于 'app'@'%')。

常见误区是以为改了 bind_address 或开了防火墙就等于限制了 IP —— 实际上只要用户被建为 'user'@'%',且密码正确,任何能连到 MySQL 端口的 IP 都能登录。

  • 新建受限用户:用 CREATE USER 'api'@'10.0.5.22' 明确指定单 IP,或 'report'@'192.168.10.%' 匹配子网
  • 禁止通配符滥用:避免 GRANT ... ON *.* TO 'admin'@'%',生产环境应限定 host
  • 检查现有宽松账户:
    SELECT User, Host FROM mysql.user WHERE Host = '%';
  • 修改已有用户 host:RENAME USER 'old'@'%' TO 'old'@'172.16.3.45';(注意:不能直接 UPDATE 表,必须用 RENAME 或 DROP+CREATE)

mysqld 配置中的 bind_address 和 skip-networking 影响监听范围

bind_address 控制 mysqld 进程绑定哪个网卡地址,默认值 127.0.0.1 意味着只接受本地 socket 或 localhost TCP 连接,外部 IP 根本连不上 —— 这是最基础的网络层隔离,比账号 host 更前置。

若需允许远程访问,必须显式设为 0.0.0.0(所有 IPv4 接口)或具体内网 IP(如 192.168.2.10),但此时务必配合严格的 user@host 策略,否则等于裸奔。

  • 仅允许内网访问:
    bind_address = 192.168.2.10
    ,并确保防火墙放行该 IP 的 3306 端口
  • 完全禁用 TCP(仅 socket):
    skip-networking = 1
    ,适合纯本地应用,但 mysql -h 127.0.0.1 会失败(走 TCP),必须用 -S /var/run/mysqld/mysqld.sock
  • IPv6 注意:bind_address = :: 同时监听 IPv6,若只需 IPv4,别写成 0.0.0.0,::,否则可能绕过预期限制

防火墙与云平台安全组是必要补充,不是替代方案

MySQL 自身不校验来源 IP 的合法性,host 字段只是权限匹配依据;真实网络流量是否抵达 mysqld,取决于操作系统防火墙和云厂商安全组。两者缺一不可。

创一AI
创一AI

AI帮你写短视频脚本

下载

例如:你已将用户设为 'web'@'10.0.1.5',但服务器防火墙未开放 3306 端口,或阿里云安全组没放行该 IP,连接仍会超时(而非报错 “Access denied”)。

  • Linux iptables 示例(仅允特定 IP):
    iptables -A INPUT -p tcp --dport 3306 -s 10.0.1.5 -j ACCEPT
    iptables -A INPUT -p tcp --dport 3306 -j DROP
  • 云平台操作重点:确认安全组规则作用在**数据库实例所在服务器的网卡**,而不是跳板机或 LB;入方向规则目标端口填 3306,源地址填 CIDR(如 10.0.1.5/32
  • 测试连通性顺序:先 telnet db-host 3306 看端口通不通,再尝试 mysql 客户端登录 —— 区分是网络层拦截还是权限层拒绝

动态刷新权限后记得 flush privileges,但多数情况不需要

修改 mysql.user 表(如 INSERT/UPDATE/DELETE)后,必须执行 FLUSH PRIVILEGES; 才能让变更生效。但使用 CREATE USERGRANTDROP USER 等 DDL 语句时,MySQL 会自动重载权限表,无需手动 flush。

容易踩坑的是:有人用 UPDATE mysql.user SET Host='10.0.1.5' WHERE User='app'; 改完不 flush,结果权限一直不生效,还以为是语法或缓存问题。

  • 安全起见,执行完 DML 类权限修改后,加一句:FLUSH PRIVILEGES;
  • 避免直接 UPDATE 权限表:字段逻辑复杂(如 authentication_string 加密方式、password_expired 状态),推荐始终用 GRANT/REVOKE
  • 权限变更对已建立连接无效:新权限只影响后续新连接,当前连接维持原有权限直到断开

实际部署中最容易被忽略的,是 bind_addressuser@host 的双重约束关系 —— 少一个环节,整个白名单就形同虚设。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

657

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

244

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

280

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

514

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

252

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

386

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

526

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

596

2023.08.14

PPT动态图表制作教程大全
PPT动态图表制作教程大全

本专题整合了PPT动态图表制作相关教程,阅读专题下面的文章了解更多详细内容。

13

2026.01.07

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.6万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 783人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号