MySQL的bind-address不支持多IP绑定,仅允许单个IP或0.0.0.0;8.0.13+版本才支持逗号分隔多地址,旧版本写多IP会启动失败。

bind-address = 0.0.0.0 是最常用但不等于“监听多个IP”
MySQL 的 bind-address 本质是调用系统 bind(),只接受一个地址结构。写成 bind-address = 192.168.1.10,127.0.0.1 会直接启动失败,日志里出现 Unknown variable 'bind-address' 或 Invalid argument。Ubuntu 上默认配置就是 bind-address = 127.0.0.1,所以远程连不上不是权限问题,而是根本没监听那个网卡。
MySQL 8.0.13+ 才真正支持逗号分隔多 IP
如果你的 MySQL 版本 ≥ 8.0.13(检查用 mysql --version),才能安全使用多地址绑定:
-
bind-address = 192.168.1.10,127.0.0.1合法,但每个地址必须是明确 IPv4/IPv6 地址,不能含0.0.0.0、::或* -
bind-address = 192.168.1.10,::1也合法,IPv4 和 IPv6 可混写 - 改完必须重启:
sudo systemctl restart mysql,然后用ss -tlnp | grep :3306验证是否列出多个Local Address - 旧版本(如 Ubuntu 20.04 自带的 8.0.28 之前某些打包版)可能仍不识别该语法,需确认发行版是否打了补丁
绝大多数场景该用 0.0.0.0 + 权限/防火墙控制
生产环境更推荐这条路:设 bind-address = 0.0.0.0,再靠三层过滤收口:
- MySQL 用户权限:创建
CREATE USER 'app'@'192.168.1.%'和CREATE USER 'admin'@'127.0.0.1',彻底分离来源 - 系统防火墙:用
ufw或nftables限制源 IP 段,比如只放行192.168.1.0/24和127.0.0.1 - 云平台安全组:阿里云/AWS 的 IPv4 规则不会自动覆盖 IPv6,若开了双栈,IPv6 必须单独加规则
- 务必禁用匿名用户:
DROP USER ''@'%'; FLUSH PRIVILEGES;
IPv6 双栈必须用 bind-address = ::,不是 0.0.0.0
想让 MySQL 8.0 同时响应 IPv4 和 IPv6 连接,bind-address = 0.0.0.0 不够——它只开 IPv4。唯一可靠写法是:
-
bind-address = ::(注意是两个英文冒号),且确保内核参数net.ipv6.bindv6only = 0(默认值,用sysctl net.ipv6.bindv6only确认) - 同时开启
skip-name-resolve = ON,否则 IPv6 客户端连接时会卡在反向 DNS 解析 - 客户端连接 IPv6 地址必须带方括号:
mysql -h '[2001:db8::1]',否则报错Host '2001:db8::1' is not allowed to connect -
netstat -tuln | grep :3306显示:::3306只代表 socket 创建成功,不代表能通;要用真实客户端从 IPv4 和 IPv6 分别测试
真正要“监听多个指定 IP”,得看版本;但多数人真正需要的是“允许来自多个地址的连接”,这个靠 0.0.0.0 + 细粒度权限 + 防火墙才是稳定解法。别在配置文件里硬拼 IP 列表,容易漏掉 SELinux、skip-networking 或内核参数这些隐性依赖。


















