必须设为具体内网IP(如192.168.10.5),不能用0.0.0.0或127.0.0.1:前者暴露所有网卡含公网,后者仅限本机;需配合user@host权限限制和防火墙放行内网段,三者缺一不可。

bind-address 必须设为具体内网 IP,不能用 0.0.0.0 或 127.0.0.1
想让 MySQL 只被内网机器访问,bind-address 必须显式写成服务器实际的内网 IP(如 192.168.10.5),而不是 0.0.0.0 或 127.0.0.1。127.0.0.1 只允许本机 TCP 连接,其他内网机器连不上;0.0.0.0 则监听所有网卡,包括公网网卡,等于把门全打开。
常见错误是改了用户权限却连不上,根源就是 bind-address 没配对。执行 ip addr show 确认该 IP 确实已分配在某张网卡上,再写进配置文件。
-
bind-address = "192.168.10.5"→ 错:带英文引号会导致 MySQL 启动失败,日志报Invalid argument -
bind-address = 192.168.10.5(末尾有空格)→ 错:部分版本会静默忽略该行 -
bind-address = localhost→ 错:MySQL 不识别字符串localhost,启动直接报Can't start server: Bind on TCP/IP port
确认 bind-address 生效必须看 netstat 输出,不是看配置文件
改完 my.cnf 后必须重启服务:sudo systemctl restart mysqld(或 mariadb),然后立刻验证是否真生效:
netstat -tlnp | grep :3306 或 ss -tlnp | grep :3306
正确输出应类似:tcp6 0 0 192.168.10.5:3306 :::* LISTEN 1234/mysqld。如果看到 *:3306、0.0.0.0:3306 或 127.0.0.1:3306,说明没生效。
- 若输出里是
:::*:3306(IPv6 全监听),说明 MySQL 启用了 IPv6 回环,需额外检查是否启用了skip-name-resolve,或确认应用是否误走 IPv6 - Docker 容器中改了
bind-address但宿主机还能 telnet 通 → 很可能是容器网络模式为host或端口映射绕过了绑定限制 - 重启后仍显示
*:3306→ 检查是否有多个配置文件被加载(如/etc/my.cnf和/etc/mysql/mysql.conf.d/mysqld.cnf),后者可能覆盖前者
bind-address 单独设对还不够,必须同步收紧 user@host 权限
bind-address = 192.168.10.5 只控制“MySQL 听哪张网卡”,不控制“谁有资格进门”。如果用户权限表里还有 'app'@'%' 或 'root'@'192.168.%',而这张网卡又暴露在公网,攻击者仍可能连上。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
执行:mysql -u root -p -e "SELECT user, host FROM mysql.user;"
- 删掉所有
host字段为'%'的高危账号:DROP USER 'app'@'%'; - 创建内网专用账号时,host 必须精确匹配内网段,例如:
CREATE USER 'app'@'192.168.10.%' IDENTIFIED BY 'pwd'; - 已有账号可修改:
UPDATE mysql.user SET host = '192.168.10.%' WHERE user = 'app' AND host = '%'; FLUSH PRIVILEGES;
防火墙必须配合放行内网段,否则 bind-address 白配
即使 bind-address 绑定了内网 IP,若防火墙(如 firewalld 或 iptables)没限制源地址,外网仍可能通过 DNAT、端口转发等方式抵达 MySQL 端口。
以 firewalld 为例,确保只放行内网段:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" port port="3306" protocol="tcp" accept'sudo firewall-cmd --reload
- CentOS/RHEL 默认 zone 是
public,内网网卡可能属于internalzone,需确认当前 active zone:firewall-cmd --get-active-zones - Ubuntu 的
ufw需加规则:sudo ufw allow from 192.168.10.0/24 to any port 3306 proto tcp - 云服务器(如阿里云、腾讯云)安全组必须同步配置,仅放行内网 IP 段的 3306 端口 —— 这层比系统防火墙更前置
真正锁死内网访问,三件事缺一不可:bind-address 写对内网 IP、user@host 限定内网段、防火墙只允入内网流量。少做一步,就可能被绕过。










