mysql白名单实际由iptables或ufw实现,必须先accept后drop、清空旧规则、逐条添加可信ip、最后兜底drop,并显式保存规则;云服务器还需同步配置安全组,各层缺一不可。

MySQL 本身不处理防火墙白名单,必须用 iptables 或 ufw 在操作系统层做。所谓“MySQL 白名单”,90% 的实际生效环节不在 MySQL 内部,而在 iptables 或 ufw 规则里——MySQL 的 Host 字段只管认证,不拦连接请求。
iptables 白名单规则必须按顺序写,先 ACCEPT 后 DROP
很多人一上来就加 iptables -A INPUT -p tcp --dport 3306 -j DROP,再补 ACCEPT 规则,结果所有连接全被拒。iptables 是顺序匹配,命中即终止,DROP 后面的 ACCEPT 永远不执行。
- 清空旧规则(避免冲突):
iptables -D INPUT -p tcp --dport 3306 -j ACCEPT和iptables -D INPUT -p tcp --dport 3306 -j DROP - 逐条添加可信 IP:
iptables -A INPUT -p tcp --dport 3306 -s 203.123.45.67 -j ACCEPT、iptables -A INPUT -p tcp --dport 3306 -s 10.0.2.0/24 -j ACCEPT - 最后加兜底拒绝:
iptables -A INPUT -p tcp --dport 3306 -j DROP
规则重启后失效,必须显式保存
服务器重启后,iptables 规则自动清空——这是生产环境最常漏掉的一步,直接导致数据库裸奔。
- Ubuntu/Debian:
iptables-save > /etc/iptables/rules.v4(确保目录存在且可写) - CentOS 7+(用 iptables 而非 firewalld):
iptables-save > /etc/sysconfig/iptables - 验证是否持久:
iptables -L INPUT -n | grep :3306,重启前后输出应一致
云服务器上必须同步配安全组
阿里云、腾讯云等平台的安全组在网络入口更外层生效。如果安全组没开 3306,iptables 根本收不到包——白名单规则等于摆设。
- 安全组入方向规则必须明确:源 IP(如
203.123.45.67/32)、协议 TCP、端口3306 - 别填
0.0.0.0/0,哪怕临时调试也建议用 /32 精确 CIDR - 宿主机防火墙(
iptables)和云平台安全组是“与”关系,任一未放行即连不通
ufw 更适合 Ubuntu,但默认允许所有出站
如果你用的是 Ubuntu,默认启用 ufw 比 iptables 更直观,但它默认放行所有出站流量,且不自动禁用 3306 入站——得手动关。
- 只放行指定 IP:
ufw allow from 203.123.45.67 to any port 3306 - 禁止其他所有 3306 访问:
ufw deny 3306(注意不是ufw deny from any to any port 3306,后者冗余) - 启用前务必检查:
ufw status verbose,确认Status: active且规则方向无误
真正难的不是写几条命令,而是分清哪一层该做什么:安全组控网络入口、iptables/ufw 拦连接包、MySQL 的 Host 字段做最后的身份校验。漏掉任意一层,白名单就形同虚设。











