必须同时控制bind-address、用户host值和防火墙规则:设bind-address=127.0.0.1禁外连,CREATE USER 'app'@'10.20.30.40'限定IP,再用ufw/iptables封非授权IP的3306端口。

直接限制 MySQL 远程连接 IP,必须同时控制三个层面:MySQL 的监听地址(bind-address)、用户账号绑定的 Host 值、以及系统防火墙规则。只改其中一项,很可能被绕过或完全失效。
修改 bind-address 防止端口暴露
这是第一道防线,决定 MySQL 是否接受外部 TCP 连接。
- 编辑配置文件(常见路径:
/etc/mysql/mysql.conf.d/mysqld.cnf或/etc/my.cnf),在[mysqld]段下确认或设置:bind-address = 127.0.0.1 - 若需允许特定内网段访问(如 K8s 节点),可设为具体 IP(如
bind-address = 192.168.1.10),但不能写 CIDR(192.168.1.0/24不合法) -
bind-address = 0.0.0.0表示监听所有接口,生产环境严禁使用 - 改完必须重启服务:
sudo systemctl restart mysql,否则配置不生效
创建用户时严格指定 Host 值
MySQL 用户身份由 username@host 共同构成,host 不匹配,权限就加不到目标用户上。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 正确做法:用具体 IP 或网段创建用户,例如:
CREATE USER 'app'@'10.20.30.40' IDENTIFIED BY 'strong_pass'; - 支持子网写法(MySQL 5.7+):
'app'@'192.168.10.0/24',但不推荐用于生产——NAT 或负载均衡后的真实源 IP 可能不可控 - 绝对避免先建
'app'@'%'再 GRANT 到'app'@'10.20.30.40',这会静默创建第二个用户,白名单形同虚设 - 检查当前有效用户:
SELECT User, Host FROM mysql.user WHERE User = 'app';
用防火墙封死非授权 IP 的 3306 端口
即使 MySQL 配置正确,防火墙仍是必要兜底。它不依赖 MySQL 权限逻辑,直接丢包。
- 用
ufw(Ubuntu 默认):sudo ufw deny 3306,再放行可信 IP:sudo ufw allow from 10.20.30.40 to any port 3306 - 用
iptables:sudo iptables -A INPUT -p tcp --dport 3306 ! -s 10.20.30.40 -j DROP - 注意:如果 MySQL 绑定的是
127.0.0.1,防火墙规则其实不会触发(因为端口根本没对外暴露),但它能防止 bind-address 被误改后的意外暴露
最容易被忽略的一点是:应用若跑在容器或云负载均衡后,看到的 Host 值可能是代理 IP(如 100.64.x.x 或 172.17.x.x),不是客户端真实出口 IP。此时仅靠 CREATE USER ...@'real_ip' 会失败,必须配合 skip_name_resolve = ON 和代理透传 X-Real-IP(需应用层配合),或者退回到网段粒度 + 防火墙双重控制。

















