跳转至

SSH 隧道访问 ECS 服务

在 Mac 上通过 SSH(Secure Shell,安全外壳协议)隧道访问 ECS 的 MinIO、Nacos 和 MySQL,无需将这些服务端口向公网开放。隧道把 Mac 本地端口转发到 ECS,Mac 与 ECS 之间的数据经过 SSH 加密。

1. 使用前确认

  • 安全组需允许可信来源访问 SSH 22。
  • 下文命令均在 Mac 新终端窗口执行,不是在已登录 ECS 的终端中执行。每个代码块是一条完整命令,可以整段复制;行尾的 \ 表示续行。

命令中的 -i 指定 SSH 私钥;-N 表示只转发端口、不进入服务器命令行;-L 的格式为 Mac监听地址:Mac端口:ECS可访问的目标地址:目标端口。两个 127.0.0.1 分别指 Mac 和 ECS 自己,不是同一台机器。

ExitOnForwardFailure=yes 在本地转发监听无法建立时退出,但不保证 ECS 上的目标服务已启动。SSH 端口转发、转发失败处理。

2. MinIO:控制台与 API

Mac:建立隧道。

ssh -i "/Users/michael/Downloads/ecs260818.pem" \
  -N -o ExitOnForwardFailure=yes \
  -L 127.0.0.1:19000:127.0.0.1:9000 \
  -L 127.0.0.1:19001:127.0.0.1:9001 \
  root@47.120.56.43

保持终端运行,在 Mac 上使用:

本地入口 ECS 目标 用途
http://127.0.0.1:19001 127.0.0.1:9001 Chrome 打开 MinIO 控制台
http://127.0.0.1:19000 127.0.0.1:9000 SDK 或存储工具连接 MinIO API

控制台使用 MinIO 管理员账号和密码。凭据位于 ECS 的 /opt/hhjava-minio/secrets/root_user 和 /opt/hhjava-minio/secrets/root_password。需要查看时另开 Mac 终端正常登录 ECS;隧道窗口不能执行服务器命令。

看到登录页面并成功进入存储桶列表,即完成控制台访问验证。API 使用 MinIO 应用凭据,不使用 hhjava 的 Bearer Token。部署与权限说明见 MinIO。

3. Nacos 与 MySQL

Mac:建立隧道。 可以与上面的 MinIO 隧道分别运行在两个终端窗口中。

ssh -i "/Users/michael/Downloads/ecs260818.pem" \
  -N -o ExitOnForwardFailure=yes \
  -L 127.0.0.1:18848:127.0.0.1:8848 \
  -L 127.0.0.1:19848:127.0.0.1:9848 \
  -L 127.0.0.1:13306:127.0.0.1:3306 \
  root@47.120.56.43
Mac 本地入口 ECS 目标 用途
http://127.0.0.1:18848/nacos/ 127.0.0.1:8848 Nacos 2.x 控制台、HTTP 接口
127.0.0.1:19848 127.0.0.1:9848 Nacos 客户端 gRPC 通信,不是网页地址
127.0.0.1:13306 127.0.0.1:3306 MySQL 数据库工具或本机 Java 连接
  1. 查看 Nacos 配置: Chrome 打开上表控制台地址,用已有 Nacos 管理账号登录。
  2. 连接 MySQL: 数据库工具填写 Host 127.0.0.1、Port 13306,沿用已有业务账号、数据库名和 TLS(Transport Layer Security,传输层安全)配置,不使用 root。IDEA 的字段与连接验证见 环境搭建。

只查看 Nacos 网页时,只需要 18848 → 8848;本机 Java 使用 Nacos 2.x 客户端时还需要 19848 → 9848。客户端按主端口 加 1000 计算 gRPC(远程过程调用框架)端口,所以 18848 必须配套 19848,不能误配成本机 9848。Nacos 2.x 端口规则

4. Mac 本机运行 hhjava

Mac: 在 hhjava 根目录依次执行以下命令。前两条切换目录、生成配置;最后一条启动五个端口的统一隧道,保持终端运行,再从 IDEA 启动服务。

cd /Users/michael/Documents/java_demo/hhjava
./scripts/setup-dev-config.sh
./scripts/ecs-tunnel.sh

统一脚本与第 2、3 节的手动隧道择一使用,不要重复占用端口。脚本默认使用本文 ECS 和 SSH 私钥;更换时运行 ./scripts/ecs-tunnel.sh user@host /完整路径/key.pem。

生成器读取已忽略的 /Users/michael/Documents/java_demo/.hhjava-dev-config/ 中的凭据,配置文件权限为 600(仅当前用户可读写)。application.properties 用于 user/gateway;提供 minio-app-user、minio-app-password 后,另生成不含数据库密码及用户私钥的 backup-file.properties。本机 MinIO 输入对应 ECS 的 secrets/app_user、secrets/app_password,不是管理员凭据。

项目在运行环境(profile)配置加载阶段,后置导入各服务自己的本机文件,覆盖 Nacos 的连接地址:local/hhjava-user.properties 默认使用 MySQL 13306,local/hhjava-backup-file.properties 默认使用 MinIO 19000;已有覆盖文件不会被生成器改写。Nacos 默认为 127.0.0.1:18848。通常不需另外设置 IDEA 环境变量;若旧运行配置仍填写公网地址,应删除旧值或改为下表地址。

需要临时覆盖时,在 IDEA 的运行配置 → Environment variables 按服务设置;以下是配置项,不是终端命令。

本机服务 覆盖变量
需要连接 Nacos 的 hhjava 服务 NACOS_SERVER_ADDR=127.0.0.1:18848
hhjava-user SPRING_DATASOURCE_URL=jdbc:mysql://127.0.0.1:13306/app?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&sslMode=REQUIRED
hhjava-backup-file HHJAVA_MINIO_ENDPOINT=http://127.0.0.1:19000

数据库 URL 示例对应 app 库;已有数据库名或其他连接参数不同时保留其原值,只替换主机和端口。Nacos、数据库和 MinIO 的凭据继续使用各服务已有的受限配置,不写入本指南。MinIO 的 read-path 仍按对象定位约定配置,不因 API 走隧道就变成公开下载地址。

这些覆盖只用于 Mac 进程,不要修改共享 Nacos 配置或 ECS 的 systemd 参数。ECS 宿主机服务仍连接本机 8848、3306、9000;同 Docker 网络中的服务使用容器服务名。修改配置后需重启本机应用,修改 .env.example 本身不会改变正在运行的进程。

重启本机应用后确认 Nacos 配置能加载,数据库或文件业务能正常调用。隧道只解决这些基础服务的连接,不会自动打通其他微服务之间的访问。

5. 关闭隧道与收紧公网入口

  • 关闭: 在对应隧道终端按 Control + C。
  • 端口占用: 出现 Address already in use 时,先确认是否已有相同隧道,不要重复启动。端口转发后仍连接失败时,检查 ECS 上目标服务是否运行、回环端口是否已发布。
  • 收紧前: 先验证网页、数据库工具和本机 Java 都能通过隧道连接,再确认没有其他客户端依赖公网直连。
  • 安全组: 保留可信来源的 SSH 22 和业务所需 HTTPS 443。跨 ECS 的必要连接走私网并精确授权。阿里云安全组建议
  • Docker: 对仅供宿主机和 SSH 隧道访问的端口,使用 127.0.0.1:宿主机端口:容器端口,不绑定所有网卡。既有实例修改映射前先确认数据卷、容器网络和其他客户端;不要删除数据卷重建。MySQL 示例见 环境搭建。Docker 端口发布说明

本实例已完成的配置

  • ECS 的 MySQL 3306、Nacos 8848/9848/9849、MinIO 9000/9001 均只发布到 127.0.0.1;Nacos 9849 为服务端间端口,不转发到 Mac。
  • MySQL 沿用原镜像、账号与 mysql_mysql_data 数据卷;配置为 /opt/mysql/compose.yaml,项目名为 mysql-private,复用原网络 mysql_backend。
  • Nacos 沿用 2.0.3 和原账号、配置;容器 /home/nacos/data 已挂载到 ECS /opt/hhjava-nacos/data,包含内置 Derby 数据库和注册数据。不要用空目录覆盖。
  • 迁移顺序为停服、冷备份、保留旧容器,再按回环映射重建及验证。备份位于 /opt/hhjava-loopback-backups/;*-before-loopback-* 原容器保持停止且关闭自动重启。不要同时启动新旧 MySQL;Nacos 迁移后已有新写入时,也不能直接启动旧容器回退。

上述是容器映射的实施结果;阿里云安全组规则本次未调整、未核验,不代表其旧公网放行规则已经删除。