通过会话管理CLI的端口转发访问无公网实例

您可以使用会话管理CLI(ali-instance-cli),以命令行的方式,将实例的某个端口转发到本机,通过云助手间接访问实例中的业务服务,支持访问无公网实例。本文为您介绍通过会话管理CLI进行端口转发,访问无公网实例。

什么是端口转发?

会话管理CLI(ali-instance-cli)的端口转发功能,基于云助手实现,可以将某台实例的端口映射到本机(即在主机安装ali-instance-cli),此外,也可以将某台实例作为跳板机,映射其他网络可达主机的端口,从而访问无公网或者私网环境中部署的服务。

  • 场景一:远程连接无公网实例

    可以通过端口转发功能,将无公网ECS实例的远程访问端口映射到本地,通过工具访问本地的对应端口,实现连接无公网实例。

    如果您的实例开通了公网IP,使用该方式连接实例时,您可以在安全组禁用实例的远程访问端口,增加实例安全性。

  • 场景二:访问无公网实例中的服务

    可以通过端口转发功能,将无公网ECS实例的某个服务端口,如Nginx、Apache等服务的端口,映射到本机的某个端口,通过访问本机端口,实现访问无公网实例中部署的服务。

  • 场景三:以某台实例为跳板,访问其他主机上的服务

    可以通过端口转发功能,以某台实例为跳板,访问和该实例处于同一VPC下某个网络主机上的服务。例如访问私网部署的MySQL服务。

端口转发实现原理

  • 端口转发的原理如图所示:

    ali-instance-cli的端口转发功能基于云助手实现。在开启端口映后,可以将ECS实例上的服务端口经由会话管理通道,映射到您个人计算机的某个端口,从而实现访问无公网的实例。

image
  • ali-instance-cli云助手Agent建立会话管理通道的流程如图所示:

    在发起连接后,ali-instance-cli云助手Agent会分别与云助手服务端建立WebSocket连接,通道建立后,ali-instance-cli发送的数据会经由云助手服务端转发到云助手Agent中。

image

准备工作

开启会话管理服务

在使用ali-instance-cli之前,需要先确保当前阿里云账号已开启会话管理服务。开启会话管理服务仅可以在控制台操作,具体操作如下:

  1. 登录ECS管理控制台

  2. 在左侧导航栏,选择实例与镜像 > 实例

  3. 在页面左侧顶部,选择目标资源所在的资源组和地域。

  4. 实例页面,找到待连接的实例,单击对应操作列的远程连接

image

  1. 单击展开其他登录方式

  2. 找到通过会话管理远程连接,将会话管理已关闭右侧的按钮打开,并根据界面提示完成开通操作。

image

image

检查实例运行状态是否为运行中

仅支持通过会话管理连接到运行中状态的实例。

控制台

实例运行状态可以在ECS控制台中的实例模块查看,运行中的实例如图所示:

查看实例状态的操作说明,请参见查看实例信息

image

image

阿里云CLI

如果您已经配置好了阿里云CLI,您可以通过以下命令查询实例运行状态。关于该API的更多参数说明,请参见DescribeInstanceStatus - 查询实例的状态信息列表

以查询杭州地域下实例ID为i-bp1******实例为例,输入以下命令查询实例运行状态。
aliyun ecs DescribeInstanceStatus --region cn-hangzhou --RegionId 'cn-hangzhou' --InstanceId.1 'i-bp1******'

如果查询出对应实例的StatusRunning则实例为运行中。

{
  "TotalCount": 1,
  "RequestId": "A413****-****-****-****-****611B",
  "PageSize": 1,
  "PageNumber": 1,
  "InstanceStatuses": {
    "InstanceStatus": [
      {
        "Status": "Running",
        "InstanceId": "i-bp1******"
      }
    ]
  }
}

除此API外,您还可以通过其他API查询实例运行状态,请参见DescribeInstances - 查询实例的详细信息列表

API

如果需要通过API查询实例运行状态,请参见DescribeInstanceStatus - 查询实例的状态信息列表DescribeInstances - 查询实例的详细信息列表

检查实例云助手Agent是否已安装

会话管理基于云助手的功能实现,您可以通过以下方式查询实例是否已经安装云助手Agent

2017年12月01日之后使用官方公共镜像创建的ECS实例,默认预装了云助手Agent。如果您的实例是2017年12月01日之前购买的或使用自行上传的自定义镜像创建的实例,需自行安装云助手Agent,请参见安装云助手Agent

控制台

会话管理基于云助手的功能实现,需要在实例中安装云助手Agent云助手Agent状态可以在ECS控制台的云助手模块查看,已经安装云助手的实例如图所示:

2017年12月01日之后使用官方公共镜像创建的ECS实例,默认预装了云助手Agent。如果您的实例是2017年12月01日之前购买的或使用自行上传的自定义镜像创建的实例,需自行安装云助手Agent,请参见安装云助手Agent

image

image

查看云助手Agent状态以及处理异常状态的具体操作,请参见查看云助手状态及异常状态处理

阿里云CLI

如果您已经配置好了阿里云CLI,您可以通过以下命令查询实例是否安装云助手且云助手版本是否支持使用会话管理。具体参数说明,请参见DescribeCloudAssistantStatus - 查询云助手安装状态

以查询杭州地域下实例ID为i-bp1******实例为例,输入以下命令查询实例运行状态。
aliyun ecs DescribeCloudAssistantStatus --region cn-hangzhou --RegionId 'cn-hangzhou' --InstanceId.1 'i-bp1******'

如果查询出CloudAssistantStatus(云助手运行状态)为trueSupportSessionManager(是否支持会话管理)也为true,即该实例支持通过会话管理连接实例。

{
  "TotalCount": 1,
  "PageSize": 1,
  "RequestId": "DB34****-****-****-****-****A749",
  "NextToken": "",
  "PageNumber": 1,
  "InstanceCloudAssistantStatusSet": {
    "InstanceCloudAssistantStatus": [
      {
        "CloudAssistantVersion": "2.2.3.857",
        "SupportSessionManager": true,
        "InstanceId": "i-bp1******",
        "InvocationCount": 4,
        "OSType": "Linux",
        "CloudAssistantStatus": "true",
        "LastHeartbeatTime": "2024-12-10T02:38:04Z",
        "LastInvokedTime": "2024-12-08T16:02:45Z",
        "ActiveTaskCount": 0
      }
    ]
  }
}

API

如果需要通过API查询实例云助手Agent状态,请参见DescribeCloudAssistantStatus - 查询云助手安装状态

准备用于使用会话管理的RAM用户的凭证

在使用 ali-instance-cli 工具时,配置阶段要求设置RAM用户的AccessKeySTS Token。当通过会话管理操作连接实例时,系统会验证此凭证对应的RAM用户是否拥有ecs:StartTerminalSession权限,这是允许通过会话管理建立与ECS实例连接的必要权限。

此外,在自定义权限策略时,可以通过指定Resource字段来限定RAM用户能够通过会话管理连接的具体ECS实例。权限策略示例如下:

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ecs:StartTerminalSession",
      "Resource": "*"
    }
  ]
}

关于CredentialsURISTS Token的更多说明,请参见创建AccessKey什么是STS

为RAM用户授权,请参见为RAM用户授权

1. 安装&配置会话管理CLI

说明

如果您已经安装并配置完成会话管理CLI,可跳过本步骤。

1.1 安装

首先需要在您的个人计算机中安装会话管理CLI(ali-instance-cli),不同操作系统安装方式不同,具体操作如下。

Windows

点击下载Windows版ali-instance-cli,并保存到本地文件夹中。

本文以将ali-instance-cli.exe保存在C:\Users\test文件夹中为例。

macOS

在macOS的终端中,输入以下命令下载mac版ali-instance-cli

curl -O https://aliyun-client-assist.oss-accelerate.aliyuncs.com/session-manager/mac/ali-instance-cli

下载完成后,输入以下命令为ali-instance-cli赋予可执行权限。

chmod a+x ali-instance-cli

Linux

输入以下命令安装Linux版ali-instance-cli

curl -O https://aliyun-client-assist.oss-accelerate.aliyuncs.com/session-manager/linux/ali-instance-cli

下载完成后,输入以下命令为ali-instance-cli赋予可执行权限。

chmod a+x ali-instance-cli

1.2 配置

在您的个人计算机使用ali-instance-cli连接阿里云实例时,需要配置相关身份凭证,即AccessKey,具体说明,请参见准备用于使用会话管理的RAM用户的凭证

Windows

  1. 选择开始 > 运行,输入cmd,按Enter键,打开命令提示符窗口。

  2. 切换到ali-instance-cli.exe所在目录,本文以C:\Users\test为例。

    cd C:\Users\test
  3. 配置凭证。支持以下三种配置方式:

    AccessKey

    执行如下命令,并根据界面提示配置Access Key IdAccess Key SecretRegion Id

    ali-instance-cli.exe configure --mode AK
    STS Token

    执行以下命令完成配置操作:

    ali-instance-cli.exe configure set --mode StsToken --region "<region>" --access-key-id "<ak>"  --access-key-secret "<sk>"   --sts-token "<sts_token>"

    <region><ak><sk><sts_token>要修改为实际的Region IDAccessKey IDAccessKey SecretSTS Token

    CredentialsURI

    执行如下命令,根据界面提示,输入Credentials URIRegion Id

    ali-instance-cli.exe configure --mode=CredentialsURI

    配置完成后,显示如下内容证明配置完成。

    image

macOS/Linux

  1. 进入ali-instance-cli所在目录,本文以当前用户根目录~为例。

    cd ~
  2. 配置凭证。

    AccessKey

    执行如下命令,并根据界面提示配置Access Key IdAccess Key SecretRegion Id

    ./ali-instance-cli configure --mode AK
    STS Token

    执行以下命令完成配置操作:

    ./ali-instance-cli configure set --mode StsToken --region "<region>" --access-key-id "<ak>"  --access-key-secret "<sk>"   --sts-token "<sts_token>"

    <region><ak><sk><sts_token>要修改为实际的Region IDAccessKey IDAccessKey SecretSTS Token

    CredentialsURI

    执行如下命令,根据界面提示,配置Credentials URIRegion Id

    ./ali-instance-cli configure --mode=CredentialsURI

    配置完成后,显示如下内容证明配置完成。

    image

2. 端口转发功能基本使用

2.1 获取待转发端口实例的ID

在开始端口转发之前,需要先获取待转发端口的实例ID,以供后续步骤使用。

控制台

  1. 登录ECS管理控制台

  2. 在左侧导航栏,选择实例与镜像 > 实例

  3. 在页面左侧顶部,选择目标资源所在的资源组和地域。

  4. 实例页面,找到目标实例,实例ID如图所示。

image

阿里云CLI

如果您已经配置好了阿里云CLI,您可以通过以下命令获取实例ID。具体参数说明,请参见DescribeInstances - 查询实例的详细信息列表

以查询杭州地域下名称为SessionManager-example的实例为例。
aliyun ecs DescribeInstances --region cn-hangzhou --RegionId 'cn-hangzhou' --InstanceName 'SessionManager-example'

返回结果中InstanceId即实例ID。

image

API

通过API查询实例ID,请参见DescribeInstances - 查询实例的详细信息列表

2.2 使用端口转发

用法一:直接转发实例端口

本机为Windows

重要

使用端口转发过程中请不要关闭命令提示符窗口,关闭命令提示符窗口后,端口转发也会终止。

进入命令提示符,在ali-instance-cli.exe所在目录,输入命令开启端口映射。

ali-instance-cli.exe portforward -i <instance_id> -r <target_port> -l <local_port>
说明

在使用时,请将<instance_id>替换为需要端口转发的实例的ID,将<target_port>替换为目标ECS实例的端口,将<local_port>替换为需要映射到本机的端口。

如图所示,端口转发成功后,会进入等待连接状态,此时在本机访问127.0.0.1:<local_port>相当于访问实例的<ecs_port>端口的服务。

image

本机为macOS/Linux

重要

使用端口转发过程中请不要关闭当前终端,关闭终端后,端口转发也会终止。

在终端中,进入ali-instance-cli所在目录,输入命令开启端口映射。

./ali-instance-cli portforward -i <instance_id> -r <target_port> -l <local_port>
说明

在使用时,请将<instance_id>替换为需要端口转发的实例的ID,将<target_port>替换为目标ECS实例的端口,将<local_port>替换为需要映射到本机的端口。

如图所示,端口转发成功后,会进入等待连接状态。此时在本机访问127.0.0.1:<local_port>相当于访问实例的<target_port>端口的服务。

image

用法二:以某台ECS实例为跳板机,转发其他主机的端口

您可以通过会话管理CLI与某台ECS实例建立会话管理连接,以该ECS实例为跳板机访问其他主机的某个端口。

本机为Windows

重要

使用端口转发过程中请不要关闭命令提示符窗口,关闭命令提示符窗口后,端口转发也会终止。

进入命令提示符,在ali-instance-cli.exe所在目录,输入命令开启端口映射。

ali-instance-cli.exe portforward -i <instance_id> -r <target_ip>:<target_port> -l <local_port>
说明

在使用时,请将<instance_id>替换为作为跳板机实例的ID,将<target_ip>替换为目标主机的IP,将<target_port>替换为目标主机的端口,将<local_port>替换为需要映射到本机的端口。

如图所示,端口转发成功后,会进入等待连接状态,此时在本机访问127.0.0.1:<local_port>相当于访问主机地址为<target_ip>端口号为<target_port>的服务。

image

本机为macOS/Linux

重要

使用端口转发过程中请不要关闭当前终端,关闭终端后,端口转发也会终止。

在终端中,进入ali-instance-cli所在目录,输入命令开启端口映射。

./ali-instance-cli portforward -i <instance_id> -r <target_ip>:<target_port> -l <local_port>
说明

在使用时,请将<instance_id>替换为作为跳板机实例的ID,将<target_ip>替换为目标主机的IP,将<target_port>替换为目标主机的端口,将<local_port>替换为需要映射到本机的端口。

如图所示,端口转发成功后,会进入等待连接状态,此时在本机访问127.0.0.1:<local_port>相当于访问主机地址为<target_ip>端口号为<target_port>的服务。

image

场景示例

示例一:远程连接无公网实例

示例架构

通过端口转发功能,您可以远程连接无公网的ECS实例。

image

操作步骤

连接Linux实例

  1. 开启端口转发。

    首先需要将目标SSH服务的服务端口(默认为22)转发到本机的8080。具体操作如下:

    重要

    开启端口转发后,关闭当前命令提示符或终端会导致连接中断。

    本机为Windows

    打开命令提示符,进入ali-instance-cli.exe工具所在目录,输入以下命令完成端口转发操作。

    ali-instance-cli.exe portforward -i i-bp1****** -r 22 -l 8080
    本命令中,-i参数值i-bp1******是被连接实例的ID,-r参数值22为实例SSH服务的远程访问端口,-l参数值的8080代表转发到本机的8080端口。

    本机为macOS/Linux

    打开终端,进入ali-instance-cli工具所在目录,输入以下命令完成端口转发操作。

    ./ali-instance-cli portforward -i i-bp1****** -r 22 -l 8080
    本命令中,-i参数值i-bp1******是被连接实例的ID,-r参数值22为实例SSH服务的远程访问端口,-l参数值的8080代表转发到本机的8080端口。
  2. 远程连接实例。

    开启端口映射后,您可以直接访问本机的8080端口远程连接目标实例。

    • 远程主机地址127.0.0.1

    • 远程主机SSH服务端口号8080

    本示例以使用OpenSSH客户端为例,您可以根据偏好,选择合适的远程连接工具。

    端口转发:

    image

    通过127.0.0.1:8080连接实例:

    image

通过ali-instance-clissh功能简化操作

当您通过OpenSSH连接实例时,您可以通过ali-instance-clissh命令简化操作,该方式底层使用端口转发功能。

以macOS/Linux操作系统为例。
  1. 修改.ssh/config配置文件,添加以下内容。

    请将<cli_path>替换为您ali-instance-cli工具的绝对路径。

    host i-*
        ProxyCommand sh -c "<cli_path> ssh -i '%h' --port  '%p'" 
  2. 通过ssh命令连接实例。

    请替换命令中的以下内容:

    • <private_key_path>:替换为您的私钥地址。

    • <ssh_port>:ECS实例中,SSH服务的远程访问端口。

    • <ecs_username>:ECS实例的登录名。

    • <instance_id>:ECS实例的ID。

      重要

      此处为实例ID而非实例的IP地址。

    ssh -i <private_key_path> -p <ssh_port> <ecs_username>@<instance_id>

    image

连接Windows实例

  1. 开启端口转发。

    首先需要将目标RDP服务的端口(默认为3389)转发到本机的8080。具体操作如下:

    重要

    开启端口转发后,关闭当前命令提示符或终端会导致连接中断。

    本机为Windows

    打开命令提示符,进入ali-instance-cli.exe工具所在目录,输入以下命令完成端口转发操作。

    ali-instance-cli.exe portforward -i i-bp1****** -r 3389 -l 8080
    本命令中,-i参数值i-bp1******是被连接实例的ID,-r参数值3389为实例RDP服务的远程访问端口,-l参数值的8080代表转发到本机的8080端口。

    本机为macOS/Linux

    打开终端,进入ali-instance-cli工具所在目录,输入以下命令完成端口转发操作。

    ./ali-instance-cli portforward -i i-bp1****** -r 3389 -l 8080
    本命令中,-i参数值i-bp1******是被连接实例的ID,-r参数值3389为实例RDP服务的远程访问端口,-l参数值的8080代表转发到本机的8080端口。
  2. 远程连接实例。

    开启端口映射后,您可以直接访问本机的8080端口远程连接目标实例。

    • 远程计算机127.0.0.1:8080

    以使用Windows远程桌面连接ECS实例为例,您可以根据您的偏好,选择合适的远程连接工具。

    端口转发:

    image

    通过127.0.0.1:8080远程连接Windows实例:

    image

示例二:访问某台无公网ECS上的Nginx服务

示例架构

image

操作步骤

  1. 开启端口转发。

    首先需要将目标Nginx服务的端口(80)转发到本机的8080。具体操作如下:

    重要

    开启端口转发后,关闭当前命令提示符或终端会导致连接中断。

    本机为Windows

    打开命令提示符,进入ali-instance-cli.exe工具所在目录,输入以下命令完成端口转发操作。

    ali-instance-cli.exe portforward -i i-bp1****** -r 80 -l 8080
    本命令中,-i参数值i-bp1******是被访问实例的ID,-r参数值80为实例Nginx服务的端口,-l参数值8080代表转发到本机的8080端口。

    本机为macOS/Linux

    打开终端,进入ali-instance-cli工具所在目录,输入以下命令完成端口转发操作。

    ./ali-instance-cli portforward -i i-bp1****** -r 80 -l 8080
    本命令中,-i参数值i-bp1******是被访问实例的ID,-r参数值80为实例Nginx服务的端口,-l参数值8080代表转发到本机的8080端口。
  2. 访问Nginx服务。

    以在浏览器访问Nginx服务的默认页面为例。

    端口转发:

    image

    通过http://127.0.0.1:80访问Nginx服务的默认页面:

    image

示例三:以某台ECS为跳板,通过访问私网MySQL服务

示例说明

如图所示,本示例以ID为i-bp1******的实例为跳板机,通过内网访问云数据库 RDS MySQL 版的MySQL数据库实例,其中,RDS实例的内网地址为rm-******.mysql.rds.aliyuncs.com

本示例已确保ECS与RDS的网络连通。
image

操作步骤

  1. 开启端口转发。

    首先需要将目标MySQL服务的服务端口(默认为3306)转发到本机的13306。具体操作如下:

    重要

    开启端口转发后,关闭当前命令提示符或终端会导致连接中断。

    本机为Windows

    打开命令提示符,进入ali-instance-cli.exe工具所在目录,输入以下命令完成端口转发操作。

    ali-instance-cli.exe portforward -i i-bp1****** -r rm-******.mysql.rds.aliyuncs.com:3306 -l 13306
    本命令中,-i参数值i-bp1******是作为跳板机ECS实例的ID,-r参数值rm-******.mysql.rds.aliyuncs.com:3306为MySQL的内网访问地址以及端口号,-l参数值13306代表转发到本机的13306端口。

    本机为macOS/Linux

    打开终端,进入ali-instance-cli工具所在目录,输入以下命令完成端口转发操作。

    ./ali-instance-cli portforward -i i-bp1****** -r rm-******.mysql.rds.aliyuncs.com:3306 -l 13306
    本命令中,-i参数值i-bp1******是作为跳板机ECS实例的ID,-r参数值rm-******.mysql.rds.aliyuncs.com:3306为MySQL的内网访问地址以及端口号,-l参数值13306代表转发到本机的13306端口。
  2. 通过MySQL客户端访问MySQL数据库。

    开启端口映射后,您可以直接访问本机的13306端口,访问目标主机上的MySQL服务。

    以MySQL客户端操作为例,您可以根据您的偏好,选择合适的连接工具。

    端口转发:

    image

    通过127.0.0.1:13306访问MySQL服务:

    image

常见问题

执行命令后卡住没反应(实例非运行中状态)

如果执行ali-instance-cli命令后命令行卡住没反应,可能是实例没有处于运行中状态,如何查看实例状态,请参见本文准备工作章节下的检查实例运行状态是否为运行中

执行命令后卡住没反应(安全组设置问题)

如果执行ali-instance-cli命令后命令行卡住没反应,可能是没有在安全组出方向放通对应的端口。默认情况下普通安全组会在出方向放通所有端口的访问,如果您更改了出方向规则或者使用了企业安全组,则可能会出现该问题。相关安全组说明如下:

通过会话管理连接ECS实例时,需要确保ECS中运行的云助手Agent与云助手服务端的网络连通性,即在安全组出方向设置以下规则:

与SSH、RDP等连接方式不同,由于会话管理是由云助手Agent主动与会话管理服务端建立WebSocket连接,因此仅需放行出方向的云助手服务端的WebSocket端口。关于会话管理的原理,请参见会话管理工作原理
重要
  • 如果使用普通安全组(包括默认安全组),默认情况下会放行所有的出方向流量,无需配置

  • 如果使用企业安全组,默认情况下会禁用所有出方向的流量,需要配置以下规则。更多企业安全组的说明,请参见普通安全组与企业级安全组

添加安全组规则的具体操作,请参见添加安全组规则

授权策略

优先级

协议类型

端口范围

授权对象

描述

允许

1

自定义TCP

443

100.100.0.0/16

用于访问云助手服务端。

允许

1

自定义TCP

443

100.0.0.0/8

访问云助手Agent安装包所在服务器,用于安装或更新您的云助手Agent

允许

1

自定义UDP

53

0.0.0.0/0

用于解析域名。

此外,如果您计划仅通过会话管理连接实例,为了增加ECS实例的安全性,您可以取消放行安全组入方向上的SSH端口(默认22)或者RDP端口(默认3389)的规则。

执行命令后出现DeliveryTimeout提示(云助手Agent不在线)

如图所示,如果执行ali-instance-cli的命令时出现DeliveryTimeout提示,可能是云助手Agent不在线,检查云助手状态,请参见检查实例云助手Agent是否已安装

image

image

执行命令报错session manager is disabled, please enable first

如果执行ali-instance-cli的命令出现session manager is disabled, please enable first报错,代表会话管理功能未开启,请通过控制台开启会话管理功能,具体操作,请参见开启会话管理服务

长时间未连接自动断开

使用会话管理连接到目标实例后,如果长时间没有任何操作连接会自动断开。默认的连接空闲时间为3分钟,您可以通过--idle-timeout参数自定义最大空闲时间。

例如执行以下命令连接到目标实例后,连接空闲达到10分钟就会自动断开。

./ali-instance-cli session --instance instance-id --idle-timeout 600
说明

此功能需确保ali-instance-cli不低于以下版本:

  • Linux:1.2.0.48

  • Windows:1.1.0.48

  • macOS:1.3.0.48

如何分析ali-instance-cli的日志

当使用会话管理CLI出现问题时,您可以通过查看log分析具体问题。

  • 查看会话管理CLI工具的日志:在使用会话管理CLI(ali-instance-cli)时,会在该工具所在目录下生成log目录,如~/log/aliyun_ecs_session_log.2022XXXX,您可以进入该目录查看相关日志。

  • 查看云助手Agent日志:

    • Linux

      /usr/local/share/aliyun-assist/云助手版本号/log/
    • Windows

      C:\ProgramData\aliyun\assist\云助手版本号\log