MySQL 远程访问并结合花生壳实现外网穿透

在 Windows 系统上配置 MySQL 远程访问并结合花生壳实现外网穿透,主要分为三个核心步骤:‌MySQL 本地权限配置 ‌、‌Windows 防火墙设置 ‌、‌花生壳内网映射配置‌。

以下是详细的操作指南:

第一步:配置 MySQL 允许远程连接

MySQL 默认仅允许本地(localhost)连接,需要修改配置文件并创建允许远程访问的用户。

1. 修改 MySQL 配置文件 (my.ini)
  1. 找到配置文件 ‌:
    • 通常位于 C:\ProgramData\MySQL\MySQL Server X.X\my.ini(注意 ProgramData 是隐藏文件夹,需开启"显示隐藏文件")。
    • 如果是解压版安装,可能在安装目录下的 `my.ini。
  2. 修改绑定地址 ‌:
    • 用记事本或代码编辑器打开 my.ini
    • 找到 [mysqld] 部分。
    • 查找 bind-address 行。如果存在且值为 127.0.0.1,将其修改为 0.0.0.0;如果不存在,则添加一行 bind-address = 0.0.0.0
    • 注:0.0.0.0 表示允许所有 IP 地址连接。出于安全考虑,生产环境建议限制特定 IP,但配合花生壳使用时通常设为全开放或由花生壳控制访问。
  3. 重启 MySQL 服务 ‌:
    • Win + R,输入 services.msc 回车。
    • 找到 MySQL 服务(名称可能为 MySQL80 等),右键点击选择"重新启动"。
2. 创建远程访问用户并授权
  1. 登录 MySQL ‌:

    • 以管理员身份打开 CMD 或 PowerShell。
    • 输入命令:mysql -u root -p,然后输入密码登录。
  2. 创建用户并授权 ‌:

    • 执行以下 SQL 命令(将 remote_userP@ssw0rd 替换为你想要的用户名和密码):

      -- 创建用户,'%' 表示允许任意 IP 连接
      CREATE USER 'remote_user'@'%' IDENTIFIED BY 'P@ssw0rd';

      -- 授予所有权限(可根据需求缩小权限范围,如只给 SELECT, INSERT)
      GRANT ALL PRIVILEGES ON . TO 'remote_user'@'%' WITH GRANT OPTION;

      -- 刷新权限使设置生效
      FLUSH PRIVILEGES;

    sql

    -- 创建用户,'%' 表示允许任意 IP 连接 CREATE USER 'remote_user'@'%' IDENTIFIED BY 'P@ssw0rd'; -- 授予所有权限(可根据需求缩小权限范围,如只给 SELECT, INSERT) GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' WITH GRANT OPTION; -- 刷新权限使设置生效 FLUSH PRIVILEGES;

    • 注意:如果是 MySQL 8.0+ 版本,确保用户的加密插件兼容客户端。如果遇到连接报错,可尝试执行:ALTER USER 'remote_user'@'%' IDENTIFIED WITH mysql_native_password BY 'P@ssw0rd';

第二步:配置 Windows 防火墙

即使 MySQL 配置正确,Windows 防火墙也可能阻止外部连接。

  1. 打开"控制面板" -> "Windows Defender 防火墙" -> "高级设置"。
  2. 点击左侧的"入站规则",然后点击右侧的"新建规则"。
  3. 选择"端口",点击"下一步"。
  4. 选择"TCP",特定本地端口输入 3306(MySQL 默认端口),点击"下一步"。
  5. 选择"允许连接",点击"下一步"。
  6. 勾选所有配置文件(域、专用、公用),点击"下一步"。
  7. 名称填写"MySQL Remote Access",点击"完成"。

验证方法:在局域网内的另一台电脑上,使用 telnet <本机内网IP> 3306 测试是否连通,或使用 Navicat 等工具通过内网 IP 连接测试。

第三步:配置花生壳内网映射

当本地局域网访问正常后,通过花生壳将内网服务映射到外网。

1. 安装与登录
  1. 前往贝锐花生壳官网下载 Windows 客户端。
  2. 注册账号并登录客户端。
  3. 确保客户端状态显示为"在线"。
2. 添加内网映射
  1. 在花生壳客户端主界面,点击右下角的 ‌**"+"** ‌ 号或 ‌**"内网穿透"** ‌ -> ‌**"添加映射"**‌。
  2. 填写映射参数 ‌:
    • 应用名称 ‌:自定义,如 MyMySQL
    • 映射类型 ‌:选择 ‌TCP‌(数据库连接通常使用 TCP 协议)。
    • 外网域名 ‌:系统会自动分配一个免费域名(如 xxx.oray.net),也可使用自己购买的域名。
    • 外网端口‌:系统随机分配或自定义(若使用免费版,通常为动态端口;若购买服务可使用固定端口)。
    • 内网主机 ‌:填写运行 MySQL 的 Windows 电脑的‌局域网 IP 地址 ‌(可通过 CMD 输入 ipconfig 查看 IPv4 地址,例如 192.168.1.100)。
      • 建议:在路由器中为该电脑设置静态 IP 或 MAC 地址绑定,防止内网 IP 变更导致映射失效。
    • 内网端口 ‌:填写 MySQL 的服务端口,默认为 3306
  3. 点击"确定"保存。
4. 获取外网访问地址

保存成功后,花生壳会生成一个外网访问地址,格式通常为:域名:端口(例如 abc123.oray.net:35678)。

第四步:远程连接测试

在外部网络(如手机 4G/5G 或其他非局域网电脑)上,使用数据库管理工具(如 Navicat、DBeaver、MySQL Workbench)进行连接:

  • 主机/Host ‌:填入花生壳生成的‌外网域名 ‌(如 abc123.oray.net)。
  • 端口/Port ‌:填入花生壳分配的‌外网端口 ‌(如 35678,‌注意不是 3306‌)。
  • 用户名/Username ‌:第一步中创建的 remote_user
  • 密码/Password ‌:对应的密码 P@ssw0rd

常见问题与排查

  1. ‌**连接超时 (Connection Timed Out)**‌:

    • 检查花生壳客户端是否正常运行且在线。
    • 检查 Windows 防火墙是否放行了 3306 端口。
    • 确认内网主机 IP 是否正确,且该 IP 在局域网内未发生变化。
    • 尝试在内网其他机器 telnet 内网 IP 3306,确保 MySQL 服务本身正常。
  2. ‌**拒绝访问 (Access Denied)**‌:

    • 检查 MySQL 用户权限是否正确授予(GRANT 语句是否执行成功)。
    • 检查用户名和密码是否输入正确。
    • 确认 MySQL 用户的主机限制是否为 % 或包含你的来源 IP。
  3. SSL 连接错误‌:

    • 如果客户端强制要求 SSL 而服务器未配置,可能会报错。可在连接设置中取消"使用 SSL"选项,或在 MySQL 中执行 ALTER USER 'remote_user'@'%' REQUIRE NONE; 禁用该用户的 SSL 强制要求。

安全建议

  • 强密码策略‌:务必为远程访问用户设置高强度密码。
  • 最小权限原则 ‌:如果不是必须,不要授予 ALL PRIVILEGES,仅授予业务需要的权限(如 SELECT, INSERT)。
  • 定期更换密码‌:建议定期更新数据库用户密码。
  • 监控日志‌:定期检查 MySQL 错误日志和花生壳访问日志,发现异常连接及时阻断。

永久解决权限问题

  1. 修改文件所有者
    • 右键my.ini文件,选择「属性」-「安全」-「高级」。
    • 点击「所有者」选项卡的「更改」,输入当前用户名或Administrators,点击「检查名称」确认后保存。
  2. 添加用户编辑权限
    • 在「安全」选项卡点击「编辑」,选择当前用户,勾选「完全控制」「修改」「写入」权限,点击「确定」。
  3. 修改文件夹权限
    • 右键C:\ProgramData\MySQL\MySQL Server 8.0文件夹,选择「属性」-「安全」-「编辑」,给当前用户添加「完全控制」权限。

注意事项

  • 编辑my.ini前建议备份原文件,避免配置错误导致MySQL服务无法启动。
  • 若修改权限后仍无法编辑,可尝试重启电脑后再操作。

第四步:远程连接测试,1130-主机'DESKTOP-B9UQM45'不允许连接到此MySQL服务器

出现 ERROR 1130 (HY000): Host 'DESKTOP-B9UQM45' is not allowed to connect to this MySQL server 错误,说明‌网络连通性已经建立 ‌(即防火墙和花生壳映射已生效,TCP连接成功),但 ‌MySQL 数据库层面的权限验证失败‌。

这是因为 MySQL 默认的安全策略限制用户只能从特定主机(如 localhost)登录,而您当前的远程客户端主机名或 IP 未被授权。

请按照以下步骤在 ‌Windows 服务器端‌ 修复此问题:

核心解决方案:修改 MySQL 用户权限

你需要登录到安装 MySQL 的 Windows 电脑本地,执行 SQL 命令来允许远程连接。

1. 本地登录 MySQL

在 Windows 服务器上打开 CMD(命令提示符)或 PowerShell,输入以下命令登录 MySQL:

复制代码
bash

mysql -u root -p

输入你的 root 密码并回车。

2. 执行授权命令

根据你的 MySQL 版本,选择以下一种方式执行。建议创建一个专用的远程用户,或者修改现有用户的 host 属性。

方式 A:创建一个新的远程专用用户(推荐,更安全)

remote_user 替换为你想要的用户名,YourStrongPassword 替换为强密码。

sql 复制代码
-- 1. 创建用户,'%' 表示允许从任何 IP 地址连接
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'YourStrongPassword';

-- 2. 授予该用户所有数据库的所有权限(可根据需求缩小范围,如只给某个库权限)
GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' WITH GRANT OPTION;

-- 3. 刷新权限,使设置立即生效
FLUSH PRIVILEGES;

sql

-- 1. 创建用户,'%' 表示允许从任何 IP 地址连接 CREATE USER 'remote_user'@'%' IDENTIFIED BY 'YourStrongPassword'; -- 2. 授予该用户所有数据库的所有权限(可根据需求缩小范围,如只给某个库权限) GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' WITH GRANT OPTION; -- 3. 刷新权限,使设置立即生效 FLUSH PRIVILEGES;

方式 B:修改现有 root 用户允许远程连接(方便但不推荐用于生产环境)

如果你坚持使用 root 用户进行远程测试:

sql 复制代码
-- 1. 切换到 mysql 系统库
USE mysql;

-- 2. 将 root 用户的 host 从 'localhost' 修改为 '%' (允许任意IP)
UPDATE user SET host = '%' WHERE user = 'root';

-- 3. 刷新权限
FLUSH PRIVILEGES;

sql

-- 1. 切换到 mysql 系统库 USE mysql; -- 2. 将 root 用户的 host 从 'localhost' 修改为 '%' (允许任意IP) UPDATE user SET host = '%' WHERE user = 'root'; -- 3. 刷新权限 FLUSH PRIVILEGES;

3. 针对 MySQL 8.0+ 的额外检查(重要)

如果你使用的是 MySQL 8.0 或更高版本,默认的认证插件是 caching_sha2_password,某些旧版客户端(如旧版 Navicat、PyCharm 驱动等)可能不支持,导致连接报错。如果上述步骤后仍无法连接或报认证错误,请执行:

sql

-- 将认证方式修改为兼容性更好的 mysql_native_password ALTER USER 'remote_user'@'%' IDENTIFIED WITH mysql_native_password BY 'YourStrongPassword'; FLUSH PRIVILEGES;

(如果是修改 root 用户,则将 'remote_user'@'%' 替换为 'root'@'%')


排查与验证

完成上述 SQL 操作后,无需重启 MySQL 服务,直接在外网客户端进行测试。

1. 验证权限是否生效

在服务器本地 MySQL 中执行:

复制代码

sql

SELECT user, host FROM mysql.user;

确保你使用的用户对应的 host 列包含 % 或你具体的外网 IP。

2. 再次尝试远程连接

在你的远程电脑(即报错的那台 DESKTOP-B9UQM45)上,使用数据库工具(Navicat, DBeaver, Workbench 等)重新连接:

  • 主机/Host ‌: 花生壳生成的域名(如 xxx.oray.net
  • 端口/Port ‌: 花生壳映射的外网端口(注意:‌不是‌ 3306,而是花生壳分配的那个端口,如 35678)
  • 用户名 ‌: 你在 SQL 中创建的用户(如 remote_user
  • 密码‌: 对应的密码

常见误区提醒

  1. ‌**不要混淆"连不上"和"不让进"**‌:

    • 如果报错是 Connection Timed Out,那是防火墙或花生壳映射问题。
    • 如果报错是 1130 Host is not allowed,说明‌网络是通的 ‌,纯粹是 MySQL 账号权限问题,只需按上述步骤修改 SQL 权限即可,‌不需要‌再去动防火墙或花生壳设置。
  2. Host 匹配机制 ‌:

    MySQL 的权限是基于 User + Host 组合的。'root'@'localhost''root'@'%' 是两个不同的账户条目。当你从外网连接时,MySQL 寻找的是 'root'@'你的外网IP''root'@'%'。如果只有 'root'@'localhost',就会报 1130 错误。

  3. 安全性建议 ‌:

    使用 '%' 允许所有 IP 连接存在安全风险。如果可能,建议在花生壳控制台查看你的外网出口 IP,然后在 MySQL 中将 '%' 替换为具体的 IP 地址,例如:

    复制代码

    sql

    CREATE USER 'remote_user'@'203.0.113.5' IDENTIFIED BY 'YourStrongPassword'; GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'203.0.113.5'; FLUSH PRIVILEGES;

    这样只有该特定 IP 才能连接,更加安全。

1.在Windows开始搜索输入Mysql,并选择第一个打开。

2.输入安装时的密码。

要授予用户所有数据库的所有权限,需要在 MySQL 命令行中执行 GRANT 语句。以下是具体操作步骤和命令:

1. 登录 MySQL

首先以 root 或具有管理员权限的用户登录 MySQL:

复制代码

bash

mysql -u root -p

2. 执行授权命令

根据您的需求,选择以下其中一种方式执行 SQL 命令:

方案 A:授予所有数据库的所有权限(全局权限)

如果您希望该用户可以访问服务器上的‌每一个 ‌数据库并拥有完全控制权(类似 root 用户),请使用 *.* 表示所有数据库和所有表。

复制代码
-- 将 'remote_user' 替换为您的用户名,'%' 表示允许从任何主机连接
GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' WITH GRANT OPTION;

-- 刷新权限使设置立即生效
FLUSH PRIVILEGES;

sql

-- 将 'remote_user' 替换为您的用户名,'%' 表示允许从任何主机连接 GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' WITH GRANT OPTION; -- 刷新权限使设置立即生效 FLUSH PRIVILEGES;

  • 注意 ‌:WITH GRANT OPTION 允许该用户将自己的权限授予其他用户。如果不需要此功能,可以省略该部分。
  • 安全警告 ‌:赋予 *.* 的全局权限风险较高,仅建议在测试环境或确需超级管理员权限时使用。
方案 B:仅授予特定数据库的所有权限(推荐)

如果您只想让用户管理‌某一个 ‌特定的数据库(例如 my_database),请将 *.* 替换为 数据库名.*

复制代码
-- 将 'my_database' 替换为实际的数据库名称
GRANT ALL PRIVILEGES ON my_database.* TO 'remote_user'@'%';

-- 刷新权限
FLUSH PRIVILEGES;

sql

-- 将 'my_database' 替换为实际的数据库名称 GRANT ALL PRIVILEGES ON my_database.* TO 'remote_user'@'%'; -- 刷新权限 FLUSH PRIVILEGES;

  • 这种方式遵循"最小权限原则",更加安全。用户只能操作指定的数据库,无法查看或修改其他数据库。

3. 验证权限

执行完上述命令后,您可以使用以下命令检查权限是否已正确授予:

复制代码

sql

SHOW GRANTS FOR 'remote_user'@'%';

关键参数说明

  • ‌**ALL PRIVILEGES** ‌:代表除 GRANT OPTION 外的所有权限(包括 SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER 等)。
  • ‌**ON *.*** ‌:第一个 * 代表所有数据库,第二个 * 代表所有表。若改为 db_name.* 则仅限指定数据库。
  • ‌**'remote_user'@'%'** ‌:
    • 'remote_user':用户名。
    • '%':主机地址,% 通配符表示允许从任何 IP 地址连接。若为了安全,可将其替换为具体的 IP 地址(如 '192.168.1.100')。
  • ‌**FLUSH PRIVILEGES**‌:强制 MySQL 重新加载权限表,确保刚才的更改立即生效,无需重启服务。

常见问题排查

如果执行后仍然报错 1130 Host is not allowed,请确认:

  1. 您修改的是正确的用户和主机组合(即 'remote_user'@'%' 而不是 'remote_user'@'localhost')。
  2. 已经成功执行了 FLUSH PRIVILEGES
  3. 如果是 MySQL 8.0+,确保用户认证插件兼容(如使用 mysql_native_password)。
相关推荐
灰太狼!!5 小时前
数仓、接口开发常用clickhouses函数详解
数据仓库·sql·clickhouse
我是一颗柠檬5 小时前
【MySQL全面教学】MySQL基础与环境搭建Day1(2026年)
数据库·后端·sql·mysql·database
我是一颗柠檬5 小时前
【MySQL全面教学】MySQL数据类型详解Day2(2026年)
数据库·后端·sql·mysql·database
DBdoctor官方5 小时前
2026 DBA实测推荐:5款数据库管理工具 监控、SQL审核、AI能力横评
数据库·sql·dba
Chockmans7 小时前
春秋云境CVE-2022-32992(文件上传和sql注入)保姆级教学
数据库·sql·安全·网络安全·网络攻击模型·春秋云境·cve-2022-32992
muddjsv7 小时前
SQL 语句:从产生、发展到内容全景
数据库·sql
斯特凡今天也很帅8 小时前
Spring Boot+mybatis项目切换sql为传参成无参
spring boot·sql·mybatis
weelinking8 小时前
【claude】15_Claude使用经验与最佳实践
前端·人工智能·python·sql·数据挖掘·前端框架·github
阿坤带你走近大数据8 小时前
HiveSQL常见性能调优策略与经验
hive·sql·调优