MySQL无法通过GRANT或DROP USER封禁IP段,必须用iptables -I在链首插入DROP规则阻断TCP握手,如iptables -I INPUT -s 192.168.5.0/24 -p tcp --dport 3306 -j DROP,并配合iprange模块或白名单策略。
MySQL 本身不提供“封禁某 IP 段”的全局开关,靠或只能控制已建立连接后的权限,拦不住 TCP 握手;真要阻断连接请求,必须在系统网络层用或动手。
iptables 封禁 IP 段必须用 -I 插入最前规则
很多人写
,结果规则排在 ACCEPT 后面,被放行了。MySQL 默认监听 3306 端口,只要该端口对某 IP 开放,
就会响应 SYN 包——哪怕后续鉴权失败,也会暴露服务存在。
正确做法是用
(insert)把 DROP 规则插到链首:
注意:Linux 内核不原生支持 CIDR 在
中直接写
,需启用
模块或改用
;更稳妥的是用两次规则覆盖 C 段:
(实际应配合
模块)
封禁后必须测试是否“无响应”:
应超时或直接拒绝,而非返回
(后者说明 MySQL 已响应,防火墙没生效)
mysql
.user 表里不能直接写 CIDR,% 不等于子网掩码
MySQL 的
字段只认 SQL 模式通配符:
匹配任意长度字符串,
匹配单字符,不解析 CIDR、不校验 IP 合法性。写
看似限制 C 段,实则也会匹配
或
(MySQL 静默截断非法部分)。
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
想真正限定 192.168.5.0/24,只能建多个具体账号(不现实)或放弃纯 MySQL 方案
生产环境若必须用
,务必搭配防火墙白名单:只放行可信网段的 3306 入向流量,
或云安全组优先级高于 MySQL 权限
是危险操作——它会覆盖原有 host,且 MySQL 8.0+ 不允许直接 UPDATE
,应改用
+
bind-address 和 skip_name_resolve 影响 host 匹配行为
控制 MySQL 监听哪个网卡,不是 IP 限制手段;但若设为
,外部 IP 根本连不上——这是最彻底的“禁止”,但代价是牺牲所有远程访问。
强制 MySQL 只用客户端 IP 地址匹配
字段,禁用 DNS 反查;否则当客户端 IP 被反解成域名(如
),而你只建了
,就会匹配失败
检查当前配置:
修改需重启:
(监听所有)或
(仅内网网卡),配合防火墙才安全
最易被忽略的一点:MySQL 用户权限按
组合存储,
和
是两条完全独立的记录,删错一条,另一条仍可连。封禁前先查
,别凭印象操作。
GRANTDROP USERiptablesfirewalldiptables -A INPUT ... -j DROPmysqld-Iiptables -I INPUT -s 192.168.5.0/24 -p tcp --dport 3306 -j DROP-s/24xt_iprange--src-rangeiptables -I INPUT -s 192.168.5.1 -s 192.168.5.254 -p tcp --dport 3306 -j DROPiprangetelnet 192.168.5.10 3306Connection refusedHost%_'user'@'192.168.5.%'192.168.5.abc.example.com192.168.5.1234%iptablesUPDATE mysql.user SET Host='192.168.5.%' WHERE User='u'mysql.userDROP USERCREATE USERbind-address127.0.0.1skip_name_resolve=ONHosthost123.example.com'user'@'192.168.5.10'SELECT @@bind_address, @@skip_name_resolve;bind-address = 0.0.0.0192.168.1.10User@Host'root'@'192.168.5.10''root'@'%'SELECT User, Host FROM mysql.user WHERE User = 'root';