

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

# 如何使用本地代理
<a name="how-use-local-proxy"></a>

您可以在源设备和目标设备上运行本地代理，将数据传输到安全隧道端点。如果您的设备位于使用 Web 代理的网络中，Web 代理可以在将连接转发到互联网之前拦截它们。在这种情况下，您需要配置本地代理，才能使用 Web 代理。有关更多信息，请参阅 [为使用 Web 代理的设备配置本地代理](configure-local-proxy-web-proxy.md)。

## 本地代理工作流
<a name="local-proxy-workflow"></a>

以下步骤展示如何在源设备和目标设备上运行本地代理。

1. 

**将本地代理连接到安全隧道**  
首先，本地代理必须与安全隧道建立连接。启动本地代理时，请使用以下参数：
   + 用于指定 AWS 区域 在其中打开隧道的`-r`参数。
   + `-t` 参数，用于传递从 `OpenTunnel` 返回的源或目标客户端访问令牌。
**注意**  
不能同时连接两个使用相同客户端访问令牌值的本地代理。

1. 

**执行源操作或目标操作**  
建立 WebSocket 连接后，本地代理将根据其配置执行源模式或目标模式操作。

   默认情况下，如果出现任何 input/output （I/O）错误或连接意外关闭，本地代理会尝试重新连接到安全隧道。 WebSocket 这会导致 TCP 连接关闭。如果出现任何 TCP 套接字错误，本地代理将通过隧道发送一条消息，通知对方关闭其 TCP 连接。预设情况下，本地代理始终使用 SSL 通信。

1. 

**终止本地代理**  
当您使用隧道后，可以安全地终止本地代理进程。我们建议您通过调用 `CloseTunnel` 显式关闭隧道。调用 `CloseTunnel` 后可能不会立即关闭活动隧道客户端。

有关如何使用打开隧道和启动 SSH 会话的更多信息，请参阅[打开隧道并启动与远程设备的 SSH 会话](secure-tunneling-tutorial-open-tunnel.md)。 AWS 管理控制台 

## 本地代理最佳实践
<a name="local-proxy-security"></a>

运行本地代理时，请遵循以下最佳实践：
+ 避免使用本地代理参数 `-t` 传入访问令牌。我们建议您使用 `AWSIOT_TUNNEL_ACCESS_TOKEN` 环境变量设置本地代理的访问令牌。
+ 在操作系统或环境中以最少权限运行本地代理可执行文件。
  + 避免以管理员身份在 Windows 上运行本地代理。
  + 避免以 root 身份在 Linux 和 macOS 上运行本地代理。
+ 考虑在单独的主机、容器、沙盒、chroot jail 或虚拟化环境上运行本地代理。
+ 使用相关安全标志构建本地代理，具体取决于您的工具链。
+ 在具有多个网络接口的设备上，使用 `-b` 参数将 TCP 套接字绑定到用于与目标应用程序通信的网络接口。

## 命令和输出示例
<a name="example-cmd-output-localproxy"></a>

下面显示了您运行的命令示例以及相应的输出。该示例说明如何在 `source` 和 `destination` 模式下配置本地代理。本地代理将 HTTPS 协议升级 WebSockets 为以建立长寿命连接，然后开始通过连接将数据传输到安全隧道设备端点。

**在运行这些命令之前：**  
您必须已打开隧道并获得源和目标的客户端访问令牌。您还必须已按照前面所述构建本地代理。要构建本地代理，请在 GitHub 存储库中打开[本地代理源代码](https://github.com/aws-samples/aws-iot-securetunneling-localproxy)，然后按照说明构建和安装本地代理。

**注意**  
示例中使用的以下命令使用 `verbosity` 标志来说明运行本地代理后先前描述的不同步骤概览。建议您仅将此标记用于测试。

**在源模式下运行本地代理**  
以下命令展示如何在源模式下运行本地代理。

------
#### [ Linux/macOS ]

在 Linux 或 macOS 的终端中运行以下命令来配置和启动源上的本地代理。

```
export AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token}
./localproxy -s 5555 -v 5 -r us-west-2
```

其中：
+ `-s` 是源侦听端口，用于在源模式下启动本地代理。
+ `-v` 表示输出的详细程度，可以是 0 到 6 之间的值。
+ `-r` 是打开隧道的终端节点区域。

有关这些参数的更多信息，请参阅[使用命令行参数设置的选项](https://github.com/aws-samples/aws-iot-securetunneling-localproxy#options-set-via-command-line-arguments)。

------
#### [ Windows ]

在 Windows 中，您可以配置本地代理，操作类似于 Linux 或 macOS 的配置，但是如何定义环境变量则与其它平台不同。在 `cmd` 窗口中运行以下命令来配置和启动源上的本地代理。

```
set AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token}
.\localproxy -s 5555 -v 5 -r us-west-2
```

其中：
+ `-s` 是源侦听端口，用于在源模式下启动本地代理。
+ `-v` 表示输出的详细程度，可以是 0 到 6 之间的值。
+ `-r` 是打开隧道的终端节点区域。

有关这些参数的更多信息，请参阅[使用命令行参数设置的选项](https://github.com/aws-samples/aws-iot-securetunneling-localproxy#options-set-via-command-line-arguments)。

------

**注意**  
在源模式下使用最新版本的本地代理时，为了向后兼容，必须在源设备`--destination-client-type V1`上包含该 AWS CLI 参数。这在连接到以下任何目标模式时适用：  
AWS IoT 设备客户端
AWS IoT 安全隧道组件或 AWS IoT Greengrass Version 2 安全隧道组件
2022 年之前编写的任何 AWS IoT 安全隧道演示代码
1.X 版本的本地代理
此参数可确保更新的源代理与旧版目标客户端之间的正常通信。有关本地代理版本的更多信息，请参阅上的 [AWS IoT Secure Tunneling](https://github.com/aws-samples/aws-iot-securetunneling-localproxy/blob/main/README.md#as-of-312-may-2024-update---destination-client-type-v1-will-be-a-required-parameter-when-connecting-with-the-following)。*GitHub*

以下内容是在 `source` 模式下运行本地代理的示例输出。

```
...
...

Starting proxy in source mode
Attempting to establish web socket connection with endpoint wss://data.tunneling.iot.us-west-2.amazonaws.com:443
Resolved proxy  server IP: 10.10.0.11
Connected successfully with proxy server
Performing SSL handshake with proxy server	
Successfully completed SSL handshake with proxy server
HTTP/1.1 101 Switching Protocols

...

Connection: upgrade
channel-id: 01234567890abc23-00001234-0005678a-b1234c5de677a001-2bc3d456
upgrade: websocket

...

Web socket session ID: 01234567890abc23-00001234-0005678a-b1234c5de677a001-2bc3d456
Web socket subprotocol selected: aws.iot.securetunneling-2.0
Successfully established websocket connection with proxy server: wss://data.tunneling.iot.us-west-2.amazonaws.com:443
Setting up web socket pings for every 5000 milliseconds
Scheduled next read:

...

Starting web socket read loop continue reading...
Resolved bind IP: 127.0.0.1
Listening for new connection on port 5555
```

**在目标模式下运行本地代理**  
以下命令展示如何在目标模式下运行本地代理。

------
#### [ Linux/macOS ]

在 Linux 或 macOS 的终端中运行以下命令来配置和启动目标上的本地代理。

```
export AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token}
./localproxy -d 22 -v 5 -r us-west-2
```

其中：
+ `-d` 是在目标模式下启动本地代理的目标应用程序。
+ `-v` 表示输出的详细程度，可以是 0 到 6 之间的值。
+ `-r` 是打开隧道的终端节点区域。

有关这些参数的更多信息，请参阅[使用命令行参数设置的选项](https://github.com/aws-samples/aws-iot-securetunneling-localproxy#options-set-via-command-line-arguments)。

------
#### [ Windows ]

在 Windows 中，您可以配置本地代理，操作类似于 Linux 或 macOS 的配置，但是如何定义环境变量则与其它平台不同。在 `cmd` 窗口中运行以下命令来配置和启动目标上的本地代理。

```
set AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token}
.\localproxy -d 22 -v 5 -r us-west-2
```

其中：
+ `-d` 是在目标模式下启动本地代理的目标应用程序。
+ `-v` 表示输出的详细程度，可以是 0 到 6 之间的值。
+ `-r` 是打开隧道的终端节点区域。

有关这些参数的更多信息，请参阅[使用命令行参数设置的选项](https://github.com/aws-samples/aws-iot-securetunneling-localproxy#options-set-via-command-line-arguments)。

------

**注意**  
在目标模式下使用最新版本的本地代理时，为了向后兼容，必须在目标设备`--destination-client-type V1`上包含该 AWS CLI 参数。这在连接到以下任一源模式时适用：  
通过控制台进行基于浏览器的安全隧道传输。 AWS 
1.X 版本的本地代理
此参数可确保更新的目标代理与旧版源客户端之间的正常通信。有关本地代理版本的更多信息，请参阅上的 [AWS IoT Secure Tunneling](https://github.com/aws-samples/aws-iot-securetunneling-localproxy/blob/main/README.md#as-of-312-may-2024-update---destination-client-type-v1-will-be-a-required-parameter-when-connecting-with-the-following)。*GitHub*

以下内容是在 `destination` 模式下运行本地代理的示例输出。

```
...
...

Starting proxy in destination mode
Attempting to establish web socket connection with endpoint wss://data.tunneling.iot.us-west-2.amazonaws.com:443
Resolved proxy  server IP: 10.10.0.11
Connected successfully with proxy server
Performing SSL handshake with proxy server	
Successfully completed SSL handshake with proxy server
HTTP/1.1 101 Switching Protocols

...

Connection: upgrade
channel-id: 01234567890abc23-00001234-0005678a-b1234c5de677a001-2bc3d456
upgrade: websocket

...

Web socket session ID: 01234567890abc23-00001234-0005678a-b1234c5de677a001-2bc3d456
Web socket subprotocol selected: aws.iot.securetunneling-2.0
Successfully established websocket connection with proxy server: wss://data.tunneling.iot.us-west-2.amazonaws.com:443
Setting up web socket pings for every 5000 milliseconds
Scheduled next read:

...

Starting web socket read loop continue reading...
```