您可以使用會話管理CLI(ali-instance-cli),以命令行的方式,將實例的某個端口轉發到本機,通過云助手間接訪問實例中的業務服務,支持訪問無公網實例。本文為您介紹通過會話管理CLI進行端口轉發,訪問無公網實例。
什么是端口轉發?
會話管理CLI(ali-instance-cli)的端口轉發功能,基于云助手實現,可以將某臺實例的端口映射到本機(即在主機安裝ali-instance-cli),此外,也可以將某臺實例作為跳板機,映射其他網絡可達主機的端口,從而訪問無公網或者私網環境中部署的服務。
場景一:遠程連接無公網實例
可以通過端口轉發功能,將無公網ECS實例的遠程訪問端口映射到本地,通過工具訪問本地的對應端口,實現連接無公網實例。
如果您的實例開通了公網IP,使用該方式連接實例時,您可以在安全組禁用實例的遠程訪問端口,增加實例安全性。
場景二:訪問無公網實例中的服務
可以通過端口轉發功能,將無公網ECS實例的某個服務端口,如Nginx、Apache等服務的端口,映射到本機的某個端口,通過訪問本機端口,實現訪問無公網實例中部署的服務。
場景三:以某臺實例為跳板,訪問其他主機上的服務
可以通過端口轉發功能,以某臺實例為跳板,訪問和該實例處于同一VPC下某個網絡主機上的服務。例如訪問私網部署的MySQL服務。
端口轉發實現原理
| |
|
準備工作
開啟會話管理服務
在使用ali-instance-cli之前,需要先確保當前阿里云賬號已開啟會話管理服務。開啟會話管理服務僅可以在控制臺操作,具體操作如下:
| |
|
檢查實例運行狀態是否為運行中
僅支持通過會話管理連接到運行中狀態的實例。
控制臺
阿里云CLI
如果您已經配置好了阿里云CLI,您可以通過以下命令查詢實例運行狀態。關于該API的更多參數說明,請參見DescribeInstanceStatus - 查詢實例的狀態信息列表。
以查詢杭州地域下實例ID為i-bp1******
實例為例,輸入以下命令查詢實例運行狀態。
aliyun ecs DescribeInstanceStatus --region cn-hangzhou --RegionId 'cn-hangzhou' --InstanceId.1 'i-bp1******'
如果查詢出對應實例的Status
為Running
則實例為運行中。
{
"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。
查看云助手Agent狀態以及處理異常狀態的具體操作,請參見查看云助手狀態及異常狀態處理。
阿里云CLI
如果您已經配置好了阿里云CLI,您可以通過以下命令查詢實例是否安裝云助手且云助手版本是否支持使用會話管理。具體參數說明,請參見DescribeCloudAssistantStatus - 查詢云助手安裝狀態。
以查詢杭州地域下實例ID為i-bp1******
實例為例,輸入以下命令查詢實例運行狀態。
aliyun ecs DescribeCloudAssistantStatus --region cn-hangzhou --RegionId 'cn-hangzhou' --InstanceId.1 'i-bp1******'
如果查詢出CloudAssistantStatus
(云助手運行狀態)為true
且SupportSessionManager
(是否支持會話管理)也為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用戶的AccessKey、STS Token。當通過會話管理操作連接實例時,系統會驗證此憑證對應的RAM用戶是否擁有ecs:StartTerminalSession
權限,這是允許通過會話管理建立與ECS實例連接的必要權限。
此外,在自定義權限策略時,可以通過指定Resource
字段來限定RAM用戶能夠通過會話管理連接的具體ECS實例。權限策略示例如下:
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "ecs:StartTerminalSession",
"Resource": "*"
}
]
}
關于CredentialsURI、STS 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
選擇
,輸入cmd,按Enter
鍵,打開命令提示符窗口。切換到ali-instance-cli.exe所在目錄,本文以
C:\Users\test
為例。cd C:\Users\test
配置憑證。支持以下三種配置方式:
AccessKey
執行如下命令,并根據界面提示配置Access Key Id、Access Key Secret、Region 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 ID、AccessKey ID、AccessKey Secret和STS Token
。CredentialsURI
執行如下命令,根據界面提示,輸入Credentials URI和Region Id。
ali-instance-cli.exe configure --mode=CredentialsURI
配置完成后,顯示如下內容證明配置完成。
macOS/Linux
進入ali-instance-cli所在目錄,本文以當前用戶根目錄
~
為例。cd ~
配置憑證。
AccessKey
執行如下命令,并根據界面提示配置Access Key Id、Access Key Secret、Region 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 ID、AccessKey ID、AccessKey Secret和STS Token
。CredentialsURI
執行如下命令,根據界面提示,配置Credentials URI和Region Id。
./ali-instance-cli configure --mode=CredentialsURI
配置完成后,顯示如下內容證明配置完成。
2. 端口轉發功能基本使用
2.1 獲取待轉發端口實例的ID
在開始端口轉發之前,需要先獲取待轉發端口的實例ID,以供后續步驟使用。
控制臺
|
阿里云CLI
如果您已經配置好了阿里云CLI,您可以通過以下命令獲取實例ID。具體參數說明,請參見DescribeInstances - 查詢實例的詳細信息列表。
以查詢杭州地域下名稱為SessionManager-example
的實例為例。
aliyun ecs DescribeInstances --region cn-hangzhou --RegionId 'cn-hangzhou' --InstanceName 'SessionManager-example'
返回結果中InstanceId
即實例ID。
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>
端口的服務。
本機為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>
端口的服務。
用法二:以某臺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>
的服務。
本機為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>
的服務。
場景示例
示例一:遠程連接無公網實例
示例架構
通過端口轉發功能,您可以遠程連接無公網的ECS實例。
操作步驟
連接Linux實例
開啟端口轉發。
首先需要將目標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端口。遠程連接實例。
開啟端口映射后,您可以直接訪問本機的8080端口遠程連接目標實例。
遠程主機地址:
127.0.0.1
。遠程主機SSH服務端口號:
8080
。
本示例以使用OpenSSH客戶端為例,您可以根據偏好,選擇合適的遠程連接工具。
端口轉發:
通過
127.0.0.1:8080
連接實例:
當您通過OpenSSH連接實例時,您可以通過ali-instance-cli的ssh
命令簡化操作,該方式底層使用端口轉發功能。
以macOS/Linux操作系統為例。
修改.ssh/config配置文件,添加以下內容。
請將
<cli_path>
替換為您ali-instance-cli工具的絕對路徑。host i-* ProxyCommand sh -c "<cli_path> ssh -i '%h' --port '%p'"
通過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>
連接Windows實例
開啟端口轉發。
首先需要將目標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端口。遠程連接實例。
開啟端口映射后,您可以直接訪問本機的8080端口遠程連接目標實例。
遠程計算機:
127.0.0.1:8080
。
以使用Windows遠程桌面連接ECS實例為例,您可以根據您的偏好,選擇合適的遠程連接工具。
端口轉發:
通過
127.0.0.1:8080
遠程連接Windows實例:
示例二:訪問某臺無公網ECS上的Nginx服務
示例架構
操作步驟
開啟端口轉發。
首先需要將目標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端口。訪問Nginx服務。
以在瀏覽器訪問Nginx服務的默認頁面為例。
端口轉發:
通過
http://127.0.0.1:80
訪問Nginx服務的默認頁面:
示例三:以某臺ECS為跳板,通過訪問私網MySQL服務
示例說明
如圖所示,本示例以ID為i-bp1******
的實例為跳板機,通過內網訪問云數據庫 RDS MySQL 版的MySQL數據庫實例,其中,RDS實例的內網地址為rm-******.mysql.rds.aliyuncs.com
。
本示例已確保ECS與RDS的網絡連通。
操作步驟
開啟端口轉發。
首先需要將目標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端口。通過MySQL客戶端訪問MySQL數據庫。
開啟端口映射后,您可以直接訪問本機的13306端口,訪問目標主機上的MySQL服務。
以MySQL客戶端操作為例,您可以根據您的偏好,選擇合適的連接工具。
端口轉發:
通過
127.0.0.1:13306
訪問MySQL服務:
常見問題
執行命令后卡住沒反應(實例非運行中狀態)
如果執行ali-instance-cli命令后命令行卡住沒反應,可能是實例沒有處于運行中狀態,如何查看實例狀態,請參見本文準備工作章節下的檢查實例運行狀態是否為運行中。
執行命令后卡住沒反應(安全組設置問題)
如果執行ali-instance-cli命令后命令行卡住沒反應,可能是沒有在安全組出方向放通對應的端口。默認情況下普通安全組會在出方向放通所有端口的訪問,如果您更改了出方向規則或者使用了企業安全組,則可能會出現該問題。相關安全組說明如下:
通過會話管理連接ECS實例時,需要確保ECS中運行的云助手Agent與云助手服務端的網絡連通性,即在安全組出方向設置以下規則:
與SSH、RDP等連接方式不同,由于會話管理是由云助手Agent主動與會話管理服務端建立WebSocket連接,因此僅需放行出方向的云助手服務端的WebSocket端口。關于會話管理的原理,請參見會話管理工作原理。
如果使用普通安全組(包括默認安全組),默認情況下會放行所有的出方向流量,無需配置。
如果使用企業安全組,默認情況下會禁用所有出方向的流量,需要配置以下規則。更多企業安全組的說明,請參見普通安全組與企業級安全組。
添加安全組規則的具體操作,請參見添加安全組規則。
授權策略 | 優先級 | 協議類型 | 端口范圍 | 授權對象 | 描述 |
允許 | 1 | 自定義TCP | 443 |
| 用于訪問云助手服務端。 |
允許 | 1 | 自定義TCP | 443 |
| 訪問云助手Agent安裝包所在服務器,用于安裝或更新您的云助手Agent。 |
允許 | 1 | 自定義UDP | 53 |
| 用于解析域名。 |
此外,如果您計劃僅通過會話管理連接實例,為了增加ECS實例的安全性,您可以取消放行安全組入方向上的SSH端口(默認22)或者RDP端口(默認3389)的規則。
執行命令后出現DeliveryTimeout提示(云助手Agent不在線)
執行命令報錯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