

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 为远程设备打开隧道并使用基于浏览器的 SSH
<a name="tunneling-tutorial-existing-tunnel"></a>

在 Amazon IoT 控制台中，您可以从隧道**中心创建隧道**，也可以从您创建的 IoT 事物的详细信息页面创建隧道。从**隧道**中心创建隧道时，可以指定是使用快速设置还是手动设置来创建隧道。有关示例教程，请参阅 [打开隧道并启动与远程设备的 SSH 会话](secure-tunneling-tutorial-open-tunnel.md)。

从 Amazon IoT 控制台的事物详细信息页面创建隧道时，您还可以指定是为该事物创建新隧道还是打开现有隧道，如本教程所示。如果选择现有隧道，可以访问为该设备创建的最新的已打开隧道。然后，可以使用终端中的命令行界面通过 SSH 连接到设备。

## 先决条件
<a name="tunneling-tutorial-existing-prerequisites"></a>
+ 位于远程设备前面的防火墙必须允许端口 443 上的出站流量。您创建的隧道将使用此端口连接到远程设备。
+ 您已在 Amazon IoT 注册表中创建了一个物联网事物（例如`RemoteDevice1`）。此事物对应于云中您的远程设备表示。有关更多信息，请参阅[在 Amazon IoT 注册表中注册设备](https://docs.amazonaws.cn/iot/latest/developerguide/register-device.html)。
+ 您在远程设备上运行物联网设备代理（参见[IoT 代理代码段](configure-remote-device.md#agent-snippet)），该设备连接到 Amazon IoT 设备网关，并配置了 MQTT 主题订阅。有关更多信息，请参阅[将设备连接到 Amazon IoT 设备网关](https://docs.amazonaws.cn/iot/latest/developerguide/sdk-tutorials.html)。
+ 您必须在远程设备上运行 SSH 守护进程。

## 为远程设备打开新隧道
<a name="tunneling-tutorial-existing-open-tunnel"></a>

假设您要打开一条通往远程设备 `RemoteDevice1` 的隧道。首先，在 Amazon IoT 注册表中创建一个名为 `RemoteDevice1` 的物联网事物。然后，您可以使用 Amazon Web Services 管理控制台、 Amazon IoT API 参考 API 或创建隧道 Amazon CLI。

通过在创建隧道时配置目标，安全隧道服务可通过 MQTT 和保留的 MQTT 主题 (`$aws/things/RemoteDeviceA/tunnels/notify`) 将目标客户端访问令牌传递给远程设备。有关更多信息，请参阅 [Amazon IoT 控制台中的隧道创建方法](secure-tunneling-tutorial-open-tunnel.md#tunneling-tutorial-flows)。

**从控制台为远程设备创建隧道**

1. 选择事物 `RemoteDevice1` 以查看其详细信息，然后选择 **Create secure tunnel**（创建安全隧道）。  
![\[显示名为 “RemoteDevice1” 的设备的详细信息及其亚马逊资源名称 (ARN)。\]](http://docs.amazonaws.cn/iot/latest/developerguide/images/tunnel-create-thing.PNG)

1. 选择创建新隧道还是打开现有隧道。要创建新隧道，请选择 **Create new tunnel**（创建新隧道）。然后，您可以选择是使用手动设置方法还是快速设置方法来创建隧道。有关更多信息，请参阅[使用手动设置打开隧道并连接到远程设备](tunneling-tutorial-manual-setup.md)和[打开隧道并使用基于浏览器的 SSH 访问远程设备](tunneling-tutorial-quick-setup.md)。

**使用 API 为远程设备创建隧道**  
要打开新隧道，可以使用 [OpenTunnel](https://docs.amazonaws.cn/iot/latest/apireference/API_iot-secure-tunneling_OpenTunnel.html)API 操作。以下代码显示了运行此命令的示例。

```
aws iotsecuretunneling open-tunnel \ 
    --region us-east-1 \ 
    --endpoint https://api.us-east-1.tunneling.iot.amazonaws.com
    --cli-input-json file://input.json
```

以下显示了 `input.json` 文件的内容。您可以使用 `destinationConfig` 参数指定目标设备的名称（例如 `RemoteDevice1`）和要用来访问目标设备的服务（例如 `SSH`）。您还可以选择指定其他参数，例如隧道描述和标签。

**input.json 的内容**

```
{
   "description": "Tunnel to remote device1",
   "destinationConfig": { 
      "services": [ "SSH" ],
      "thingName": "RemoteDevice1"
   }
}
```

运行此命令将创建新隧道，并为您提供源和目标访问令牌。

```
{
    "tunnelId": "01234567-89ab-0123-4c56-789a01234bcd",
    "tunnelArn": "arn:aws:iot:us-east-1:123456789012:tunnel/01234567-89ab-0123-4c56-789a01234bcd",
    "sourceAccessToken": "<SOURCE_ACCESS_TOKEN>",
    "destinationAccessToken": "<DESTINATION_ACCESS_TOKEN>"
}
```

## 打开现有隧道并使用基于浏览器的 SSH
<a name="tunneling-tutorial-existing-convert-tunnel"></a>

假设您使用手动设置方法或使用 Amazon IoT API 参考 API 为远程设备创建了隧道。`RemoteDevice1`然后，您可以打开设备的现有隧道，并选择 **Quick setup**（快速设置）以使用基于浏览器的 SSH 特征。由于无法编辑现有隧道的配置，因此您无法使用手动设置方法。

要使用基于浏览器的 SSH 特征，您无需下载源访问令牌，也无需配置本地代理。系统将自动为您配置基于 Web 的本地代理，以便您可以开始与远程设备交互。

**使用快速设置方法和基于浏览器的 SSH**

1. 转到您创建的事物 `RemoteDevice1` 的详细信息页面，然后 **Create secure tunnel**（创建安全隧道）。

1. 选择 **Use existing tunnel**（使用现有隧道）打开您为远程设备创建的最新开放隧道。由于无法编辑隧道配置，因此您无法为隧道使用手动设置方法。要使用快速设置方法，请选择 **Quick setup**（快速设置）。

1. 继续查看并确认隧道配置详细信息并创建隧道。无法编辑隧道配置。

   创建隧道时，安全隧道将使用 [RotateTunnelAccessToken](https://docs.amazonaws.cn/iot/latest/apireference/API_iot-secure-tunneling_RotateTunnelAccessToken.html)API 操作撤消原始访问令牌并生成新的访问令牌。如果您的远程设备使用 MQTT，这些令牌将通过其订阅的 MQTT 主题自动传送到远程设备。也可以选择将这些令牌手动下载到源设备。

创建隧道后，您可以使用基于浏览器的 SSH 和上下文命令行界面直接从控制台与远程设备进行交互。要使用此命令行界面，请为创建的事物选择隧道，然后在详细信息页面中展开 **Command-line interface**（命令行界面）部分。由于已经为您配置了本地代理，因此，您可以开始输入命令以快速开始访问远程设备 `RemoteDevice1` 并与之交互。

有关快速设置功能方法和使用基于浏览器的 SSH 的更多信息，请参阅 [打开隧道并使用基于浏览器的 SSH 访问远程设备](tunneling-tutorial-quick-setup.md)。

## 清理
<a name="tunnel-cleanup-existing"></a>
+ 

**关闭隧道**  
我们建议您在使用完隧道后将其关闭。如果隧道的打开时间超过指定的隧道持续时间，隧道也可能会关闭。隧道一旦关闭就无法重新打开。您仍然可以通过打开关闭的隧道，然后选择**复制隧道**来复制隧道。指定要使用的隧道持续时间，然后创建新隧道。
  + 要从 Amazon IoT 控制台关闭单条隧道或多条隧道，请转到[隧道中心](https://console.amazonaws.cn/iot/home#/tunnels)，选择要关闭的隧道，然后选择**关闭隧道**。
  + 要使用 Amazon IoT API 参考 API 关闭单个或多个隧道，请使用 [CloseTunnel](https://docs.amazonaws.cn/iot/latest/apireference/API_iot-secure-tunneling_CloseTunnel.html)API 操作。

    ```
    aws iotsecuretunneling close-tunnel \ 
        --tunnel-id "01234567-89ab-0123-4c56-789a01234bcd"
    ```
+ 

**删除隧道**  
您可以从中永久删除隧道 Amazon Web Services 账户。
**警告**  
删除是永久性操作，无法撤消。
  + 要从 Amazon IoT 控制台删除单条隧道或多条隧道，请转到[隧道中心](https://console.amazonaws.cn/iot/home#/tunnels)，选择要删除的隧道，然后选择**删除隧道**。
  + 要使用 Amazon IoT API 参考 API 删除单个或多个隧道，请使用 [CloseTunnel](https://docs.amazonaws.cn/iot/latest/apireference/API_iot-secure-tunneling_CloseTunnel.html)API 操作。使用 API 时，将 `delete` 标志设置为 `true`。

    ```
    aws iotsecuretunneling close-tunnel \ 
        --tunnel-id "01234567-89ab-0123-4c56-789a01234bcd"
        --delete true
    ```