3306端口绝不能裸奔公网,必须绑定内网ip、配置安全组白名单、禁用root@%、强制ssl并启用最小权限账号,辅以ssh隧道替代直连。

别让3306端口裸奔在公网,这是90%被拖库的起点。
为什么3306端口一开就被扫?
不是你运气差,而是扫描器根本不需要“找”——它按IP段+端口号暴力轮询。Shodan上全球有超百万台MySQL实例暴露在公网,其中30%仍用默认密码或弱口令。只要你的安全组或iptables放开了0.0.0.0/0:3306,几小时内就会出现在攻击队列里。
常见错误现象包括:
- MySQL日志中频繁出现
Access denied for user(错误码1045) - 连接数突增、CPU飙升,但业务无明显请求
-
netstat -tuln | grep :3306显示大量SYN_RECV状态连接
立刻停掉公网直连,只留内网或跳板访问
这是最有效、成本最低的一步。MySQL本就不该对外提供服务,所有业务应走应用层代理或内网通信。
实操建议:
- 检查MySQL绑定地址:
bind-address必须设为127.0.0.1或内网IP(如10.0.0.5),绝不能是0.0.0.0 - 云平台安全组:删除所有针对
3306端口的0.0.0.0/0规则,仅保留运维跳板机IP或VPC内网段(如10.0.0.0/16) - 本地测试连通性:
mysql -h 10.0.0.5 -u root -p能通,mysql -h 公网IP -u root -p直接拒绝连接 —— 这才是正确状态
必须启用SSL强制加密 + 最小权限账号
即使误开公网,没SSL和弱权限也等于送钥匙。很多爆破工具(如mysql_login模块)会优先尝试明文传输,而REQUIRE SSL能直接拦住一半流量。
关键配置项:
- 创建账号时强制SSL:
CREATE USER 'app'@'10.0.0.%' IDENTIFIED BY 'xK9#mQ2!pL' REQUIRE SSL; - 确认SSL启用:
SHOW VARIABLES LIKE 'have_ssl';返回YES,且ssl_mode设为REQUIRED - 禁用root远程登录:
DROP USER 'root'@'%';,只保留'root'@'localhost' - 业务账号权限收缩:
GRANT SELECT,INSERT,UPDATE ON mydb.* TO 'app'@'10.0.0.%';,不给DROP、FILE等高危权限
用SSH隧道替代公网开放3306
开发/运维需要临时连数据库?别开3306,走SSH端口转发更安全、更隐蔽。
本地执行即可建立加密通道:
ssh -L 3307:127.0.0.1:3306 user@your-server-ip -N
之后在本地用mysql -h 127.0.0.1 -P 3307 -u app -p连接,所有流量经SSH加密,扫描器连3306都收不到响应。
注意坑点:
-
-L参数中127.0.0.1:3306是服务器本地监听地址,不是公网IP - 确保服务器SSH允许
GatewayPorts no(默认值),避免意外暴露转发端口 - 别把
-N漏掉,否则会启动交互shell,占用终端
真正难的不是技术动作,而是打破“先图方便再加固”的惯性——只要3306对公网亮一次,就可能被记入扫描器永久名单。防御的本质,是让攻击者连“门在哪”都找不到,而不是等他敲门后再比谁锁得牢。











