mysql 应限制监听地址、配置防火墙、禁用远程 root 并强制 ssl。需设置 bind-address 为内网 ip 或 127.0.0.1,用 iptables/安全组仅放行可信 ip,删除 'root'@'%' 和匿名用户,修改端口并启用 require_secure_transport=on。

MySQL 默认监听所有网络接口,暴露在公网或不信任网络中时,3306 端口极易成为扫描和暴力破解的目标。仅靠账号密码防护远远不够,必须从网络层收缩攻击面。
限制 MySQL 监听地址(bind-address)
MySQL 服务启动时若未显式指定监听地址,bind-address 默认为 0.0.0.0,即接受任意 IP 的连接请求。这是最常见也最危险的配置起点。
- 编辑
my.cnf或my.ini,在[mysqld]段添加:bind-address = 127.0.0.1(仅本地 socket 访问)或bind-address = 192.168.1.100(仅绑定内网 IP) - 修改后必须重启 MySQL:
systemctl restart mysqld(Linux)或net stop mysql && net start mysql(Windows) - 注意:若应用与数据库不在同一台机器,且需走 TCP 连接,
bind-address必须设为对应内网 IP,不能留空或写localhost(它可能被解析为::1,绕过 IPv4 限制)
用防火墙封禁非授权访问
bind-address 是第一道防线,但防火墙是更可靠的兜底手段——即使配置出错,也能拦截非法流量。
- Linux 下推荐用
iptables或firewalld:例如只放行应用服务器 IP:iptables -A INPUT -p tcp --dport 3306 -s 192.168.2.50 -j ACCEPT,再加一条-j DROP拒绝其余所有 - 云环境务必检查安全组(Security Group)规则:只开放目标 IP 段的
3306(或你自定义的端口),禁止0.0.0.0/0 - 避免“先开后关”式操作:不要临时开放全网访问调试,调试完必须立即回收;防火墙规则变更后建议用
telnet target_ip 3306验证连通性
禁用远程 root 登录并删除匿名账户
网络策略收紧后,仍要防止账号本身成为突破口。默认的 root 账户常被配置为 'root'@'%',等同于欢迎任何人远程登录。
- 执行
DROP USER 'root'@'%';删除远程 root(保留'root'@'localhost'仅用于本地维护) - 清理匿名用户:
DROP USER ''@'localhost';(空用户名账户) - 检查残留账户:
SELECT user, host FROM mysql.user;,确认所有host字段都不含%通配符,或严格限定为具体内网段如'app_user'@'192.168.1.%'
改默认端口 + 强制 SSL 连接
端口扫描是自动化攻击的第一步,3306 是必扫项;而明文传输则让抓包工具轻易获取账号密码和敏感数据。
- 在
[mysqld]中设置port = 3307(或其他非知名端口),同时更新客户端连接字符串中的端口号 - 启用 SSL 不只是配证书,关键要强制客户端使用:
require_secure_transport = ON(MySQL 5.7+),否则客户端仍可降级为明文连接 - 验证是否生效:
SHOW VARIABLES LIKE 'require_secure_transport';返回ON,且客户端连接时必须带--ssl-mode=REQUIRED参数
网络策略不是一劳永逸的配置项。每次新增应用、迁移服务器或调整网络拓扑,都必须重新核对 bind-address、防火墙规则和用户 host 限制——三者缺一不可,任一环节松动都可能让前面所有努力失效。











