必须在“高级安全 Windows Defender 防火墙”中新建入站规则,勾选“公用”网络配置文件,并将作用域设为“任何 IP 地址”或指定客户端IP,确保规则状态为“已启用”,否则即使开放3306端口仍无法远程连接。

Windows 防火墙入站规则必须匹配实际连接路径
很多用户开了“允许 3306 端口”,却仍连不上,根本原因是规则没生效——不是没加,而是加错位置或作用域不对。Windows 防火墙的入站规则默认只对“域”“专用”网络生效,而远程连接常走“公用”网络,若没勾选“公用”,规则就形同虚设。
- 必须在“高级安全 Windows Defender 防火墙”中新建规则,不能只在基础防火墙界面点“允许应用”
- 新建规则时,“作用域”里的“远程 IP 地址”要设为“任何 IP 地址”,或明确填入客户端真实 IP(如
192.168.10.55),不能留空 - 确认规则状态是“已启用”,且“配置文件”列中“公用”打勾(尤其云服务器或家庭宽带环境)
- 避免直接关闭防火墙:关了看似能连,但暴露在公网等于裸奔;正确做法是精准放行 + 限制源 IP
Linux firewalld 必须 reload 才生效
firewall-cmd --add-port=3306/tcp 是临时规则,重启后丢失;--permanent 参数只是写入配置文件,不 reload 就不加载。常见错误是执行完 add-port 就去测试连接,结果失败。
- 两步缺一不可:
firewall-cmd --permanent --add-port=3306/tcp→firewall-cmd --reload - 验证是否生效:
firewall-cmd --list-ports应输出3306/tcp;firewall-cmd --list-all查看 zone 中是否有该端口 - 如果用的是 Docker 或 Podman,宿主机防火墙放行后,还需确认容器启动时加了
-p 3306:3306,且 MySQL 容器内 bind-address 是0.0.0.0
云服务器安全组优先级高于系统防火墙
阿里云、腾讯云、AWS 的安全组是第一道网关,哪怕本地防火墙全开,安全组没放 3306,流量根本进不到系统。很多人查遍 MySQL 配置和本机防火墙,就是忘了这层。
- 登录云控制台,在“安全组”页面找到绑定该 ECS 实例的安全组
- 编辑入方向规则:协议类型选
TCP,端口范围填3306,源 IP 填0.0.0.0/0(测试用)或具体 IP 段(生产推荐) - 规则方向必须是“入方向”,且“授权策略”为“允许”;出方向规则不影响远程连接
- 修改后无需重启实例,但需等 1–2 分钟策略同步生效
ufw 规则顺序决定是否拦截
ufw 默认策略是 deny incoming,所有放行规则都靠插入顺序匹配。如果先写了 ufw default deny incoming,再 ufw allow 3306,没问题;但如果已有 ufw deny from 192.168.1.100 这类显式拒绝规则,且排在 allow 之前,那这个 IP 就连不上。
- 用
ufw status numbered查看规则序号和顺序 - 必要时用
ufw insert 1 allow from 192.168.10.55 to any port 3306把特定规则插到最前面 - 避免混用
iptables和ufw:ufw 是 iptables 前端,直接改 iptables 可能被 ufw 覆盖
防火墙规则本身不难配,难的是它和 MySQL 监听地址、用户 host 字段、云平台安全组四者必须全部对齐——少一个,或者顺序/作用域错一点,连接就静默失败。真正卡住人的,往往不是命令写错,而是某一层“以为开了,其实没生效”。











