必须在防火墙规则最前面放行127.0.0.1:3306,否则mysqld启动卡死;需iptables/ufw放行本地回环、Connection Control插件防爆破、bind-address限制监听地址,并配合SSH隧道远程管理。

必须在防火墙规则最前面放行 127.0.0.1:3306,否则 mysqld 启动会卡死;仅靠强密码或云安全组无法阻止暴力破解,必须数据库层+网络层联动防御。
iptables 规则顺序错会导致 MySQL 启动失败
MySQL 启动时会主动连接 127.0.0.1:3306 做自检,如果 INPUT 链中没有明确允许这条流量,服务就卡在 “Starting MySQL daemon”,日志只显示模糊的 Can't connect to local MySQL server。
- 错误写法:
iptables -A INPUT -p tcp --dport 3306 -j DROP放在白名单之前 → 所有 3306 流量被提前拦截 - 正确写法(顺序不能颠倒):
iptables -A INPUT -s 127.0.0.1 -p tcp --dport 3306 -j ACCEPT必须第一行 - 后续再加业务白名单,例如:
iptables -A INPUT -s 192.168.1.50 -p tcp --dport 3306 -j ACCEPT - 最后用
iptables -A INPUT -p tcp --dport 3306 ! -s 127.0.0.1 -j DROP封禁其余来源(注意!和-s之间不能有空格) - 不用
REJECT而用DROP:避免暴露服务存在,防止端口扫描识别
ufw 用户常漏掉 lo 接口导致本地连接失败
ufw 默认策略是「入向全部拒绝」,但它不自动豁免 lo(本地回环)接口。只运行 ufw allow from 192.168.1.50 to any port 3306 是不够的,mysqld 仍起不来。
- 必须显式放行本地回环:
ufw allow on lo或ufw allow from 127.0.0.1 to any port 3306 - 检查是否生效:
ufw status verbose看Allow规则里是否有127.0.0.1或lo - ufw 的规则也是顺序匹配,
allow on lo应放在所有deny类规则之前
Connection Control 插件才是防爆破的核心防线
防火墙只能限制 IP,但无法区分“用户输错密码”和“脚本暴力撞库”。Connection Control 插件在认证层做延迟和封禁,是真正防爆破的关键。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 启用插件:
INSTALL PLUGIN connection_control SONAME 'connection_control.so'; - 设置触发阈值:
SET GLOBAL connection_control_failed_connections_threshold = 3;(连续 3 次失败即触发) - 设置延迟时间:
SET GLOBAL connection_control_min_connection_delay = 1000;(单位毫秒) - 插件生效后,第 4 次失败连接会强制延迟 1 秒,且延迟随失败次数递增
- 注意:该插件不影响已建立连接,只作用于新连接的认证阶段
bind-address + 防火墙 + 白名单三者缺一不可
只改 bind-address = 127.0.0.1 不够,因为有些环境(如容器、云主机)可能绕过该配置;只配防火墙也不保险,万一规则被误删或未持久化;只设白名单账号而不限制网络入口,等于把门开着让攻击者敲。
-
my.cnf中必须设bind-address = 127.0.0.1(本地)或内网 IP(如192.168.10.10),禁止0.0.0.0 - 防火墙(iptables/ufw)只放行可信源 IP,且规则要持久化(如
iptables-save > /etc/iptables/rules.v4) - MySQL 内部账号必须按最小权限创建,禁用
'root'@'%',删除匿名用户和test数据库 - 远程管理务必走 SSH 隧道:
ssh -L 3307:127.0.0.1:3306 user@db-server,然后连localhost:3307
最容易被忽略的是:MySQL 自检依赖 127.0.0.1 回环,而几乎所有加固文档都只提“放行业务 IP”,没人强调必须优先保它——结果就是服务起不来,排查时还在查密码、查端口、查 SELinux,浪费大量时间。










