

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

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

您可以使用快速设置方法或手动设置方法来创建隧道。本教程介绍如何使用快速设置方法打开隧道，以及如何使用基于浏览器的 SSH 连接到远程设备。有关演示如何使用手动设置方法打开隧道的示例，请参阅 [使用手动设置打开隧道并连接到远程设备](tunneling-tutorial-manual-setup.md)。

使用快速设置方法时，您可以通过可编辑的默认配置创建新隧道。系统会为您配置基于 Web 的本地代理，并使用 MQTT 将访问令牌自动传递到远程目标设备。创建隧道后，您可以使用控制台中的命令行界面开始与远程设备进行交互。

使用快速设置方法，必须使用 SSH 作为目标服务才能访问远程设备。有关不同设置方法的信息，请参阅[隧道设置方法](secure-tunneling-tutorial-open-tunnel.md#tunneling-tutorial-setup-methods)。

## 快速设置方法的先决条件
<a name="tunneling-tutorial-quick-prerequisites"></a>
+ 位于远程设备前面的防火墙必须允许端口 443 上的出站流量。您创建的隧道将使用此端口连接到远程设备。
+ 您在远程设备上运行物联网设备代理（参见[IoT 代理代码段](configure-remote-device.md#agent-snippet)），该设备连接到 AWS IoT 设备网关，并配置了 MQTT 主题订阅。有关更多信息，请参阅[将设备连接到 AWS IoT 设备网关](https://docs.aws.amazon.com/iot/latest/developerguide/sdk-tutorials.html)。
+ 您必须在远程设备上运行 SSH 守护进程。

## 打开隧道
<a name="open-tunnel-quick"></a>

您可以使用、 AWS IoT API 参考或 AWS 管理控制台，打开安全隧道 AWS CLI。您可以选择配置目标名称，但本教程不要求这样做。如果您配置了目标，安全隧道将使用 MQTT 自动将访问令牌传送到远程设备。有关更多信息，请参阅 [AWS IoT 控制台中的隧道创建方法](secure-tunneling-tutorial-open-tunnel.md#tunneling-tutorial-flows)。

**使用控制台打开隧道**

1. 转至 [AWS IoT 控制台的隧道中心](https://console.aws.amazon.com/iot/home#/tunnels)，然后选择 **Create tunnel**（创建隧道）。  
![\[AWS IoT 控制台显示空白的隧道列表，其中包含创建、关闭或删除隧道的选项。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/tunnels-page.png)

1. 对于本教程，请选择 **Quick setup**（快速设置）作为隧道创建方法，然后选择 **Next**（下一步）。
**注意**  
如果您从所创建事物的详细信息页面创建安全隧道，则可以选择是创建新隧道还是使用现有隧道。有关更多信息，请参阅 [为远程设备打开隧道并使用基于浏览器的 SSH](tunneling-tutorial-existing-tunnel.md)。  
![\[“设置方法”部分，其中提供了手动设置或者使用 SSH 进行快速设置的选项，说明了快速设置功能将会自动配置代理和访问令牌。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/tunnels-choose-quick.PNG)

1. 查看并确认隧道配置详细信息。要创建隧道，请选择 **Confirm and create**（确认并创建）。如果要编辑这些详细信息，请选择 **Previous**（上一页）返回上一页，然后确认并创建隧道。
**注意**  
使用快速设置时，无法编辑服务名称。您必须使用 **SSH** 作为 **Service**（服务）。

1. 要创建隧道，请选择 **Done**（完成）。

   对于本教程，您不必下载源或目标访问令牌。这些令牌在连接到隧道时只能使用一次。如果隧道断开连接，您可以生成新令牌并将其发送到远程设备以重新连接到隧道。有关更多信息，请参阅 [重新发送隧道访问令牌](tunneling-tutorial-manual-setup.md#resend-access-tokens)。  
![\[一个对话框，显示了用于创建安全隧道连接的源和目标访问令牌，以及有关轮换和重新发送令牌（如果需要）的说明。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/tunnel-success.png)

**使用 API 打开隧道**  
要打开新隧道，可以使用 [OpenTunnel](https://docs.aws.amazon.com/iot/latest/apireference/API_iot-secure-tunneling_OpenTunnel.html)API 操作。

**注意**  
您只能从 AWS IoT 控制台使用快速设置方法创建隧道。当您使用 AWS IoT API 参考 API 或时 AWS CLI，它将使用手动设置方法。您可以打开所创建的现有隧道，然后将隧道设置方法更改为使用快速设置。有关更多信息，请参阅 [打开现有隧道并使用基于浏览器的 SSH](tunneling-tutorial-existing-tunnel.md#tunneling-tutorial-existing-convert-tunnel)。

下面介绍一个有关如何运行此 API 操作的示例。或者，如果要指定事物名称和目标服务，请使用 `DestinationConfig` 参数。有关演示如何使用此参数的示例，请参阅 [为远程设备打开新隧道](tunneling-tutorial-existing-tunnel.md#tunneling-tutorial-existing-open-tunnel)。

```
aws iotsecuretunneling open-tunnel
```

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

```
{
    "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-quick-browser"></a>

使用快速设置方法创建隧道，并且目标设备已连接到隧道后，您可以使用基于浏览器的 SSH 访问远程设备。使用基于浏览器的 SSH，您可以通过在控制台中的上下文命令行界面中输入命令来直接与远程设备通信。此特征使您可以更轻松地与远程设备进行交互，因为您不必在控制台外部打开终端，也不必配置本地代理。

**使用基于浏览器的 SSH**

1. 转至 [AWS IoT 控制台的隧道中心](https://console.aws.amazon.com/iot/home#/tunnels)，然后选择所创建的隧道以查看详细信息。

1. 展开 **Secure Shell (SSH)** 部分，然后选择**连接**。

1. 选择是否要通过提供用户名和密码在 SSH 连接中进行身份验证，或者，为了进行更安全的身份验证，您可以使用设备的私钥。如果您使用私钥进行身份验证，请注意，只有 PEM 格式的（256 和 512）RSA 密钥可在 SSH 控制台上使用。 AWS IoT Secure Tunneling 
   + 要使用您的用户名和密码进行连接，请选择 **Use password**（使用密码）。然后，您可以输入用户名和密码，并开始使用浏览器内 CLI。
   + 要使用目标设备的私钥进行连接，请选择 **Use private key**（使用私钥）。指定您的用户名并上传设备的私钥文件，然后选择 **Connect**（连接）以开始使用浏览器内 CLI。  
![\[使用私钥通过浏览器 CLI 进行连接的表单对话框，显示了用户名字段以及选择或使用预先选择的私钥文件的选项。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/tunnel-browser-private-key.png)

通过 SSH 连接的身份验证后，您可以快速开始输入命令，并使用浏览器 CLI 与设备进行交互，因为已经为您配置了本地代理。

![\[显示用于管理 JavaScript 应用程序状态和首选项的 React 挂钩的代码片段。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/tunnel-browser-cli.PNG)


如果浏览器 CLI 在隧道持续时间后保持打开状态，则可能会超时，从而导致命令行界面断开连接。您可以复制隧道，并启动另一个会话以在控制台本身内与远程设备进行交互。

## 对使用基于浏览器的 SSH 时出现的问题进行故障排除
<a name="tunneling-tutorial-browser-troubleshoot"></a>

以下显示了如何对在使用基于浏览器的 SSH 时可能出现的一些问题进行故障排除。
+ 

**您看到的是错误，而不是命令行界面**  
您可能会看到错误，因为您的目标设备已断开连接。您可以选择 **Generate new access tokens**（生成新访问令牌）来生成新的访问令牌，并使用 MQTT 将令牌发送到您的远程设备。新令牌可用于重新连接到隧道。重新连接到隧道将清除历史记录，并刷新命令行会话。
+ 

**使用私钥进行身份验证时，您会看到隧道已断开连接错误**  
您可能会看到此错误是因为您的私钥可能未被目标设备接受。要解决此错误，请检查您上传的用于身份验证的私钥文件。如果您仍然看到错误，请检查您的设备日志。您也可以通过向远程设备发送新访问令牌来尝试重新连接到隧道。
+ 

**使用会话时隧道已关闭**  
如果隧道因保持打开超过指定的持续时间而关闭，您的命令行会话可能会断开连接。隧道一旦关闭就无法重新打开。要重新连接，必须打开另一条通往设备的隧道。

  您可以通过复制隧道来创建与已关闭隧道配置相同的新隧道。您可以从 AWS IoT 控制台复制已关闭的隧道。要复制隧道，请选择已关闭的隧道以查看其详细信息，然后选择 **Duplicate tunnel**（复制隧道）。指定要使用的隧道持续时间，然后创建新隧道。

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

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

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

**删除隧道**  
您可以从中永久删除隧道 AWS 账户。
**警告**  
删除是永久性操作，无法撤消。
  + 要从 AWS IoT 控制台删除单条隧道或多条隧道，请转到[隧道中心](https://console.aws.amazon.com/iot/home#/tunnels)，选择要删除的隧道，然后选择**删除隧道**。
  + 要使用 AWS IoT API 参考 API 删除单个或多个隧道，请使用 [CloseTunnel](https://docs.aws.amazon.com/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
    ```