WSL2中MySQL 8.0默认不监听局域网流量,需同步修改三处:将mysqld.cnf中bind-address设为0.0.0.0、创建root@'%'用户并指定mysql_native_password认证、在Windows防火墙放行3306端口。

WSL 2 中 MySQL 8.0 默认根本**不监听局域网流量**,不是配置漏了,而是 bind-address 和认证机制双重锁死——改一个没用,必须同步处理三处。
bind-address = 127.0.0.1 是默认硬编码
MySQL 8.0 在 Ubuntu 的 mysqld.cnf 中默认写死 bind-address = 127.0.0.1,哪怕你从 Windows 用 WSL2 的 IP(如 172.x.x.x)去连,也会被内核直接拒绝。这不是防火墙问题,是 mysqld 根本不收那个 IP 的包。
- 确认方式:
sudo ss -tlnp | grep :3306,输出里只看到127.0.0.1:3306就对了 - 修改位置:
/etc/mysql/mysql.conf.d/mysqld.cnf,找到bind-address行,改成bind-address = 0.0.0.0(不是注释掉,也不是留空) - 改完必须重启服务:
sudo service mysql restart,否则配置不生效
root@'%' 权限和 mysql_native_password 认证缺一不可
即使 bind-address 放开了,Windows 主机或局域网其他设备连上来时,MySQL 还会按客户端来源 IP 匹配 user 表里的 host 字段。默认的 'root'@'localhost' 只响应 Unix socket 或 127.0.0.1 的 TCP 请求,对 172.x.x.x 或 192.168.x.x 直接拒之门外。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- 进 MySQL 执行:
sudo mysql,然后运行:CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;FLUSH PRIVILEGES; - 务必用
mysql_native_password:WSL2 + Windows 客户端(DataGrip、MySQL Workbench、Navicat)普遍不兼容caching_sha2_password,握手阶段就超时或报Authentication plugin 'caching_sha2_password' cannot be loaded - 别信
mysql_secure_installation的默认选项——它默认选 “Disallow root login remotely? y”,等于帮你把门焊死了
WSL2 网络层本身不拦截,但 Windows 防火墙会
WSL2 的虚拟网卡在 Windows 内部是桥接 NAT 模式,MySQL 流量从 WSL2 出来后,会经过 Windows 主机网络栈。如果 Windows 防火墙没放行 3306 端口,连接会在 Windows 层就被丢弃,表现为“连接超时”而非“拒绝连接”。
- 临时验证:在 Windows 上运行
netsh advfirewall firewall add rule name="MySQL WSL2" dir=in action=allow protocol=TCP localport=3306 - 更稳妥的做法是,在 Windows 防火墙高级设置里,新建入站规则,协议选 TCP、端口填 3306、作用域设为“本地子网”(避免全开放)
- 注意:不要去动 WSL2 里的
ufw,Ubuntu 默认没开 ufw,且 WSL2 不走 iptables INPUT 链
真正卡住人的地方,往往不是某一步做错了,而是三件事没一起做:bind-address 没放开、root@'%' 没建、Windows 防火墙没让行。少一个,mysql -h 172.x.x.x -P 3306 -u root -p 就永远在等超时。










