xampp 默认完全禁止远程 mysql 访问,必须同步修改三处:①my.ini 中 bind-address=0.0.0.0 并重启 mysql;②用 grant 创建指定 ip 的用户并执行 flush privileges;③系统防火墙放行 3306 端口且作用域匹配。

直接说结论:XAMPP 默认完全禁止远程 MySQL 访问,只配内网穿透工具是没用的——bind-address、GRANT权限、系统防火墙这三处必须全部改对,否则连 telnet your_ip 3306 都不通。
MySQL 必须监听 0.0.0.0,不能只改用户权限
XAMPP 的 MySQL 默认只绑定 127.0.0.1,外部请求根本进不到进程里。改了用户权限也白搭,连接会直接超时。
- Windows 路径:
%xampp%\mysql\bin\my.ini;Linux/macOS:/opt/lampp/etc/my.cnf - 找到
[mysqld]段落下的bind-address行,改为bind-address = 0.0.0.0 - 如果该行被注释(开头是
#),必须取消注释;整行不存在就手动加在[mysqld]下方 - 改完必须重启 MySQL 服务——
FLUSH PRIVILEGES对绑定地址无效
用 GRANT 创建带来源限制的账号,别用 'root'@'%'
内网穿透后端口暴露在公网,'root'@'%' 等同于裸奔。应按实际访问来源精确授权。
- 登录本地 MySQL 后执行:
USE mysql; - 创建专用账号(例如只允许你的开发机 IP 连接):
GRANT ALL PRIVILEGES ON *.* TO 'devuser'@'192.168.1.50' IDENTIFIED BY 'StrongPass123!'; - 支持子网可写成
'devuser'@'192.168.1.%';IPv6 可用'devuser'@'::1' - 必须执行
FLUSH PRIVILEGES;,漏掉这步新账号无法登录 -
'devuser'@'192.168.1.50'和'devuser'@'localhost'是两个独立账户,密码可不同
系统防火墙必须放行 3306,且作用域匹配
很多用户卡在这:MySQL 配置全对,telnet your_xampp_ip 3306 却失败——其实是系统防火墙拦了入站 TCP 流量。
- Windows:打开「高级安全 Windows 防火墙」→「入站规则」→ 新建规则 → 端口 → TCP 3306 → 允许连接 → 作用域中填入允许的 IP(如
192.168.1.50) - Linux(firewalld):
sudo firewall-cmd --permanent --add-port=3306/tcp --source=192.168.1.50,再运行sudo firewall-cmd --reload - 验证方式:从目标机器执行
telnet your_xampp_ip 3306,能建立空连接即说明端口通了
内网穿透工具只负责转发,不解决权限和监听问题
花生壳、frp、cpolar、natapp 这些工具只是把外网请求转到你本机的 3306 端口,它们不干预 MySQL 的访问控制逻辑。也就是说:
- 如果你没改
bind-address,穿透后照样连不上 - 如果你只开了
'root'@'localhost',穿透后仍报Access denied - 如果你防火墙没放行,穿透工具启动成功,但外部根本连不到你机器的 3306
- 前端页面若硬编码
127.0.0.1:3306,穿透后也连错地方——后端代码里数据库 host 应该是127.0.0.1(保持本地访问),不是穿透域名
最易忽略的一点:phpMyAdmin 界面本身默认拒绝非本地访问,Apache 的 httpd-xampp.conf 里 Require ip 规则也要同步调整,否则页面返回 403。











