

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

# 在安全隧道中多路复用多个数据流
<a name="multiplexing-multiple-streams"></a>

您可以对使用多个连接或端口的设备使用多路复用功能。当您需要与远程设备建立多个连接以解决任何问题时，也可以使用多路复用功能。例如，对于需要发送多个 HTTP 和 SSH 数据流的 Web 浏览器，可以使用此功能。通过多路复用隧道将来自两个数据流的应用程序数据同时发送到设备。

## 使用案例示例
<a name="multiplexing-use-case"></a>

假设您需要连接到设备上的 Web 应用程序来更改某些联网参数，同时通过终端发出 shell 命令，以验证设备是否使用新的联网参数正常运行。在这种情况下，您可能需要通过 HTTP 和 SSH 连接到设备，并传输两个并行数据流，以便同时访问 Web 应用程序和终端。通过多路复用功能，这两个独立的流可以同时通过同一隧道传输。

![显示用于通过不同协议流式传输数据的物联网云架构以及源设备、代理服务器和目标设备的示意图。](http://docs.amazonaws.cn/iot/latest/developerguide/images/tunnel-multiplexing.png)


## 如何设置多路复用隧道
<a name="multiplexing-tutorial"></a>

以下流程将指导您如何设置多路复用隧道，以便使用需要连接到多个端口的应用程序对设备进行故障排除。您将设置一个隧道，其中包含两个多路复用流：一个 HTTP 流和一个 SSH 流。

1. 

**（可选）创建配置文件**

   您可以选择使用配置文件来配置源和目标设备。如果您的端口映射可能会经常发生更改，请使用配置文件。如果您希望使用 CLI 显式指定端口映射，或者如果您不需要在指定侦听端口上启动本地代理，则可跳过此步骤。有关如何使用配置文件的更多信息，请参阅中的[通过--config 设置的 GitHub选项](https://github.com/aws-samples/aws-iot-securetunneling-localproxy#options-set-via---config)。

   1. 在源设备上，在将运行本地代理的文件夹中，创建一个名为 `Config` 的配置文件夹。在此文件夹中，使用以下内容创建一个名为 `SSHSource.ini` 的文件：

      ```
      HTTP1 = {{5555}}
      SSH1 = {{3333}}
      ```

   1. 在目标设备上，在将运行本地代理的文件夹中，创建一个名为 `Config` 的配置文件夹。在此文件夹中，使用以下内容创建一个名为 `SSHDestination.ini` 的文件：

      ```
      HTTP1 = {{80}}
      SSH1 = {{22}}
      ```

1. 

**打开隧道**

   使用 `OpenTunnel` API 操作或 `open-tunnel` CLI 命令打开隧道。通过将`SSH1`和指定`HTTP1`为服务以及与您的远程设备对应 Amazon IoT 的事物的名称来配置目的地。您的 SSH 和 HTTP 应用程序正在此远程设备上运行。您必须已经在 Amazon IoT 注册表中创建了物联网事物。有关更多信息，请参阅 [使用注册表管理事物](thing-registry.md)。

   ```
   aws iotsecuretunneling open-tunnel \
   	--destination-config thingName={{RemoteDevice1}},services=HTTP1,SSH1
   ```

   运行此命令将生成源和目标访问令牌，您将使用这些令牌运行本地代理。

   ```
   {
   	"tunnelId": "{{b2de92a3-b8ff-46c0-b0f2-afa28b00cecd}}",
   	"tunnelArn": "arn:aws:iot:{{us-west-2}}:{{431600097591}}:tunnel/{{b2de92a3-b8ff-46c0-b0f2-afa28b00cecd}}",
   	"sourceAccessToken": {{source_client_access_token}},
   	"destinationAccessToken": {{destination_client_access_token}}
   }
   ```

1. 

**配置和启动本地代理**

   在运行本地代理之前，请先设置 Amazon IoT 设备客户端，或者从中下载本地代理源代码[GitHub](https://github.com/aws-samples/aws-iot-securetunneling-localproxy)并针对您选择的平台进行构建。之后，您可以启动目标和源本地代理以连接到安全隧道。有关配置和使用本地代理的更多信息，请参阅[如何使用本地代理](how-use-local-proxy.md)。
**注意**  
在源设备上，如果您不使用任何配置文件或使用 CLI 指定端口映射，则仍可以使用相同的命令来运行本地代理。在源模式下，本地代理将自动为您选取要使用的可用端口和映射。

------
#### [ Start local proxy using configuration files ]

   运行以下命令可使用配置文件在源和目标模式下运行本地代理。

   ```
   // ----------------- Start the destination local proxy -----------------------
   ./localproxy -r {{us-east-1}} -m dst -t {{destination_client_access_token}}
   
   // ----------------- Start the source local proxy ----------------------------
   // You also run the same command below if you want the local proxy to
   // choose the mappings for you instead of using configuration files.
   ./localproxy -r {{us-east-1}} -m src -t {{source_client_access_token}}
   ```

------
#### [ Start local proxy using CLI port mapping ]

   运行以下命令可通过使用 CLI 显式指定端口映射，以便在源和目标模式下运行本地代理。

   ```
   // ----------------- Start the destination local proxy -----------------------------------
   ./localproxy -r {{us-east-1}} -d HTTP1={{80}},SSH1={{22}} -t {{destination_client_access_token}}
   
   // ----------------- Start the source local proxy ----------------------------------------
   ./localproxy -r {{us-east-1}} -s HTTP1={{5555}},SSH1={{33}} -t {{source_client_access_token}}
   ```

------

现在可以通过多路复用隧道同时传输来自 SSH 和 HTTP 连接的应用程序数据。如下面的地图中所示，服务标识符充当可读格式，用于转换源设备和目标设备之间的端口映射。使用此配置，安全隧道可将所有传入的 HTTP 流量从源设备{{5555}}上的端口转发到目标设备{{80}}上的端口，并将任何传入的 SSH 流量从一个端口转发{{3333}}到目标设备{{22}}上的端口。

![一种转换过程，用于在进行处理后将服务标识符从源和目标本地代理映射到转换后的端口。](http://docs.amazonaws.cn/iot/latest/developerguide/images/multiplexing-post-mapping-translation.png)
