MySQL默认bind-address通常是127.0.0.1,但Ubuntu等发行版可能设为0.0.0.0,需通过SHOW VARIABLES确认;正确配置应设为bind-address = 127.0.0.1并重启服务,同时检查防火墙、用户权限和IPv6影响。

MySQL 默认 bind-address 是多少?
MySQL 5.7 及以后版本默认 bind-address 值通常是 127.0.0.1(仅本地),但部分发行版(如 Ubuntu 的 mysql-server 包)会设为 0.0.0.0,即监听所有网卡 —— 这才是实际暴露远程访问风险的根源。
别直接假设“默认安全”,先确认当前值:
mysql -u root -p -e "SHOW VARIABLES LIKE 'bind_address';"
如果返回 0.0.0.0 或具体公网 IP,就需修改。
如何正确设置 bind-address = 127.0.0.1?
修改配置文件(路径因安装方式而异):
-
/etc/mysql/mysql.conf.d/mysqld.cnf(Debian/Ubuntu APT 安装) -
/etc/my.cnf或/etc/my.cnf.d/mariadb-server.cnf(RHEL/CentOS 或 MariaDB) -
/usr/local/mysql/etc/my.cnf(源码编译安装)
在 [mysqld] 段落下添加或修改:
bind-address = 127.0.0.1
注意:
- 不能写成
bind-address = localhost—— MySQL 不识别字符串localhost作为 bind 地址,会导致启动失败并报错Can't start server: Bind on TCP/IP port - 若配置中已有
skip-networking,它会彻底禁用 TCP 连接(只留 socket),此时bind-address无效;二者不要共存 - 改完必须重启服务:
sudo systemctl restart mysql(或mariadb)
改完还是能被远程连上?检查这三处
仅改 bind-address 不等于绝对安全,还需排查:
- 防火墙是否放行了 3306 端口?即使 MySQL 只绑 127.0.0.1,若防火墙转发或 DNAT 到本机,仍可能被访问。用
ss -tlnp | grep :3306确认监听地址确实是127.0.0.1:3306,而非*:3306 - 用户权限是否过度开放?执行
SELECT user,host FROM mysql.user;,确保没有'%'@'%'或'root'@'192.168.%'这类宽泛 host。本地连接应只保留'root'@'localhost'或'app'@'127.0.0.1' - 是否启用了 IPv6?
bind-address = 127.0.0.1不影响::1(IPv6 回环)。如需彻底限制,可加skip-networking(但会禁用所有 TCP),或配合mysql -h 127.0.0.1显式走 IPv4
bind-address 修改后无法连接 localhost?
常见于从 0.0.0.0 改为 127.0.0.1 后,应用用 -h localhost 连接失败 —— 因为 MySQL 对 localhost 会强制走 Unix socket,不走 TCP。此时有三种解法:
- 应用侧改用
-h 127.0.0.1(强制走 TCP) - 保留
bind-address = 127.0.0.1,同时确保socket文件路径正确(如/var/run/mysqld/mysqld.sock),让localhost走 socket - 在
[client]段加protocol = tcp,强制客户端默认走 TCP
真正生效的只有监听地址 + 用户授权 + 网络路径三层叠加,少一层都可能绕过限制。


















