bind-address = 127.0.0.1 是最直接有效的禁用远程连接方式,但需同步清理 mysql.user 表中 host 为 '%' 或公网 ip 的用户,并配置防火墙拒绝 3306 端口,三者缺一不可。

bind-address = 127.0.0.1 是最直接有效的禁用远程连接方式,但仅改这一项不够——它只限制监听地址,不阻止已有远程用户凭权限连进来。
确认并修改 bind-address 配置项
MySQL 默认可能监听 0.0.0.0 或未设置 bind-address,导致接受任意网卡的连接。必须显式设为 127.0.0.1 才能强制只响应本地回环请求。
- 编辑配置文件(常见路径:
/etc/mysql/my.cnf、/etc/mysql/mysql.conf.d/mysqld.cnf或/usr/etc/my.cnf) - 在
[mysqld]段下添加或修改:bind-address = 127.0.0.1 - 若该行被注释(如
#bind-address = 0.0.0.0),务必取消注释并改成127.0.0.1 - 不要写成
localhost——某些 MySQL 版本会尝试解析为 IPv6 地址,导致监听失败
避免 skip-networking 的误用场景
skip-networking 确实能彻底关闭 TCP/IP 连接,但它也会同时禁用所有 socket 外部访问(包括本地命令行客户端通过 -h 127.0.0.1 连接),只留下 Unix socket 方式(-h localhost 或省略 -h)可用。
- 如果你的应用、监控脚本或运维工具依赖
mysql -h 127.0.0.1连接,启用skip-networking会导致它们全部失败 - 它不区分“远程”和“本地 IP”,是一刀切;而
bind-address = 127.0.0.1更精准,兼容性更好 - 除非你明确只用 Unix socket,否则不建议启用
skip-networking
重启后仍能远程登录?检查用户 Host 权限
配置文件改对了,mysqld 也重启了,但 mysql -h 公网IP -u root -p 还能连上?大概率是用户权限没清理干净。
- 执行
SELECT User, Host FROM mysql.user;,重点看root或其他高权限用户是否还有'%'或具体公网 IP 的Host值 - 删掉远程入口:
DROP USER 'root'@'%';或DELETE FROM mysql.user WHERE User='root' AND Host='%'; - 确保只保留
'root'@'localhost'(注意:不是'root'@'127.0.0.1',二者在权限系统中是不同账号) - 最后别忘
FLUSH PRIVILEGES;—— 否则权限变更不生效
防火墙不是可选项,而是第二道必要防线
即使 bind-address 和用户权限都设对了,如果系统防火墙放行了 3306 端口,攻击者仍可能触发 MySQL 的早期握手阶段(比如探测 banner),或利用配置残留漏洞绕过。
- Linux 下推荐用
ufw deny 3306或iptables -A INPUT -p tcp --dport 3306 -j DROP - 不要只依赖
ufw status看是否“inactive”就以为安全——有些发行版默认没开 ufw,但 iptables 规则可能已存在 - 验证是否生效:从另一台机器执行
telnet your-server-ip 3306,应显示连接拒绝(Connection refused),而非超时
Host 字段残留——它不会因为配置文件改了就自动消失。











