

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用手動設定開啟通道並連線至遠端裝置
<a name="tunneling-tutorial-manual-setup"></a>

開啟通道時，您可以選擇以快速設定或手動設定方法來開啟通道進入遠端裝置。本教學課程說明如何使用手動設定方法開啟通道，並設定及啟動本機代理以連線至遠端裝置。

若使用手動設定方法，則必須在建立通道時手動指定通道組態。建立通道後，您可以在瀏覽器中 SSH，或在 AWS IoT 主控台外部開啟終端機。本教學課程說明如何使用主控台外部的終端存取遠端裝置。您也將了解如何設定本機代理，然後連線至本機代理以與遠端裝置進行互動。若要連線至本機代理，您必須在建立通道時下載來源存取權杖。

在此設定方法中，您可以使用 SSH 以外的服務，例如透過 FTP 連線至遠端裝置。如需不同設定方法的詳細資訊，請參閱 [通道設定方法](secure-tunneling-tutorial-open-tunnel.md#tunneling-tutorial-setup-methods)。

## 手動設定方法的先決條件
<a name="tunneling-tutorial-manual-prerequisites"></a>
+ 遠端裝置所在的防火牆必須允許連接埠 443 上的傳出流量。您建立的通道將使用此通訊埠連線至遠端裝置。
+ 您有 IoT 裝置代理程式 （請參閱 [IoT Agent Snippet](configure-remote-device.md#agent-snippet)) 在連線至 AWS IoT 裝置閘道的遠端裝置上執行，並使用 MQTT 主題訂閱設定。如需詳細資訊，請參閱[將裝置連線至 AWS IoT 裝置閘道](https://docs.aws.amazon.com/iot/latest/developerguide/sdk-tutorials.html)。
+ 您必須具有一個在遠端裝置上執行的 SSH 常駐程式。
+ 您已從 [GitHub](https://github.com/aws-samples/aws-iot-securetunneling-localproxy) 下載了本機代理原始碼，並為您選擇的平台建置它。在本教學課程中，我們將建置的本機代理可執行檔案稱作 `localproxy`。

## 開啟通道
<a name="open-tunnel"></a>

您可以使用 AWS 管理主控台、 AWS IoT API 參考或 來開啟安全通道 AWS CLI。您可以選擇設定目的地名稱，但這並非本教學課程的必要步驟。如果您設定目的地，安全通道會使用 MQTT 自動將存取權杖傳遞至遠端裝置。如需詳細資訊，請參閱[AWS IoT 主控台中的通道建立方法](secure-tunneling-tutorial-open-tunnel.md#tunneling-tutorial-flows)。

**如要在主控台中開啟通道**

1. 前往 [AWS IoT 主控台的 Tunnels hub (通道中樞)](https://console.aws.amazon.com/iot/home#/tunnelhub)，然後選擇 **Create job** (建立通道)。  
![\[AWS IoT 主控台顯示空的通道清單，其中包含建立、關閉或刪除通道的選項。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/tunnels-page.png)

1. 在本教學課程中，請選擇 **Manual setup** (手動設定) 作為通道建立方法，然後選擇 **Next** (下一步)。如需了解如何使用**快速設定**方法建立通道，請參閱 [開啟通道並使用瀏覽器型 SSH 來存取遠端裝置](tunneling-tutorial-quick-setup.md)。
**注意**  
如果從建立物件的詳細資訊頁面建立安全通道，您可以選擇要建立新通道或使用現有通道。如需詳細資訊，請參閱[開啟遠端裝置的通道並使用瀏覽器型 SSH](tunneling-tutorial-existing-tunnel.md)。  
![\[設定通道連線的兩個選項：快速設定 (SSH) 或手動設定，這需要設定本機代理和管理存取字符。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/tunnels-choose-manual.PNG)

1. (選擇性) 輸入通道的組態設定。您也可以略過此步驟，繼續進行下一個步驟來建立通道。

   輸入通道描述、通道逾時持續時間和資源標籤作為索引鍵值對，以協助您識別資源。在本教學課程中，您可以略過目的地組態。
**注意**  
費用不會依據通道保持開放的持續時間進行計價。只有在建立新通道時會產生費用。如需定價資訊，請參閱 [AWS IoT Device Management 定價](https://aws.amazon.com/iot-device-management/pricing/)中的**安全通道**。

1. 下載用戶端存取權杖，然後選擇 **Done** (完成)。選擇 **Done** (完成) 後，字符將無法下載。

   這些權杖只能用於連接通道一次。如果您誤置權杖或通道中斷連線，您可以產生新權杖並將其傳送到遠端裝置，以重新連線至通道。  
![\[用於建立安全通道連線的來源和目的地存取權杖，並視需要提供輪換和重新傳送權杖的指示。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/tunnel-success.png)

**若要使用主控台中開啟通道**  
若要開放新的通道，您可以使用 [OpenTunnel](https://docs.aws.amazon.com/iot/latest/apireference/API_iot-secure-tunneling_OpenTunnel.html) API 操作。您也可以使用 API 指定其他組態，例如通道持續時間和目的地組態。

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

執行此命令會建立新的通道，並提供您來源和目的地存取權杖。

```
{
    "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>"
}
```

## 重新傳送通道存取權杖
<a name="resend-access-tokens"></a>

建立通道時取得的權杖，只能用來連接通道一次。如果您放錯存取權杖或通道中斷連接，您可以使用 MQTT 將新的存取權杖重新傳送至遠端裝置，無需額外費用。 AWS IoT 安全通道會撤銷目前的權杖，並傳回新的存取權杖以重新連線至通道。

**從主控台輪換權杖**

1. 前往 [AWS IoT 主控台的通道中樞](https://console.aws.amazon.com/iot/home#/tunnels)，然後選擇您建立的通道。

1. 在通道詳細資訊頁面中，選擇 **Generate new access tokens** (產生新存取權杖)，然後選擇 **Next** (下一步)。

1. 請為您的通道下載新的存取權杖，然後選擇 **Done** (完成)。這些權杖只能使用一次。如果誤置這些權杖或通道連線中斷，您可以重新傳送新的存取權杖。  
![\[具有複製或下載選項的來源和目的地裝置的存取字符。文字說明輪換權杖會撤銷目前的權杖，並產生新的單次使用權杖以重新連線中斷的通道。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/tunnel-token-rotated.PNG)

**使用 API 輪換存取權杖**  
若要輪換通道存取權杖，您可以使用 [RotteTunnelAccesToken](https://docs.aws.amazon.com/iot/latest/apireference/API_iot-secure-tunneling_RotateTunnelAccessToken.html) API 操作來撤銷目前的權杖，並傳回新的存取權杖以重新連線至通道。例如，下列指令會輪換目的地裝置的存取權杖：*`RemoteThing1`*。

```
aws iotsecuretunneling rotate-tunnel-access-token \ 
    --tunnel-id <tunnel-id> \ 
    --client-mode DESTINATION \ 
    --destination-config thingName=<RemoteThing1>,services=SSH \ 
    --region <region>
```

執行此命令會產生新的存取權杖，如下所示。如果裝置代理程式設定正確，會使用 MQTT 將權杖傳遞到裝置以連接通道。

```
{
    "destinationAccessToken": "destination-access-token", 
    "tunnelArn": "arn:aws:iot:region:account-id:tunnel/tunnel-id"
}
```

如需說明如何及何時輪換存取權杖的範例，請參閱 [透過輪換用戶端存取字符解決 AWS IoT 安全通道連線問題](iot-secure-tunneling-troubleshooting.md)。

## 配置並啟動本機代理
<a name="start-local-proxy"></a>

若要連線至遠端裝置，請在筆記型電腦上開啟終端，然後設定並啟動本機代理。本機代理會透過 WebSocket 安全連線，使用安全通道來傳輸由來源裝置上執行的應用程式所傳送的資料。您可以從 [GitHub](https://github.com/aws-samples/aws-iot-securetunneling-localproxy)下載本機代理原始碼。

設定完成本機代理後，請複製來源用戶端存取權杖，並使用它在來源模式下啟動本機代理。以下展示使用範例命令來啟動本機代理的步驟。在下列命令中，本機代理會設定為在連接埠 5555 上接聽新連線。在此命令中：
+ `-r` 指定 AWS 區域，其必須與您的通道建立所在的區域相同。
+ `-s` 指定代理應該連線的連接埠。
+ `-t` 指定用戶端權杖文字。

```
./localproxy -r us-east-1 -s 5555 -t source-client-access-token
```

若執行此命令，系統會以來源模式啟動本機代理。如果在執行命令後收到下列錯誤，請設定 CA 路徑。如需詳細資訊，請參閱 [GitHub 上的安全通道本機代理](https://github.com/aws-samples/aws-iot-securetunneling-localproxy)。

```
Could not perform SSL handshake with proxy server: certificate verify failed
```

下列會顯示以 `source` 模式執行本機代理的範例輸出。

```
...
...

Starting proxy in source mode
Attempting to establish web socket connection with endpoint wss://data.tunneling.iot.us-east-1.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-east-1.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
```

## 啟動 SSH 工作階段
<a name="start-ssh-session"></a>

開啟另一個終端機並使用以下命令，透過連線至連接埠 5555 上的本機代理來啟動新的 SSH 工作階段。

```
ssh username@localhost -p 5555
```

系統可能會提示您輸入 SSH 工作階段的密碼。當您完成了 SSH 工作階段時，請輸入 **exit** 以關閉工作階段。

## 清除
<a name="tunnel-cleanup-manual"></a>
+ 

**關閉通道**  
我們建議您在使用完通道後關閉通道。如果開放時間超過指定的通道持續時間，通道也可能會關閉。通道一旦關閉就不能重新開放。您仍然可以開啟已關閉的通道，然後選擇 **Duplicate tunnel** (複製通道) 來複製通道。指定您要使用的通道持續時間，然後建立新通道。
  + 若要從 AWS IoT 主控台關閉個別通道或多個通道，請移至 [Tunnels hub](https://console.aws.amazon.com/iot/home#/tunnels) (通道中樞)，選擇您要關閉的通道，然後選擇**Close tunnel** (關閉通道)。
  + 若要使用 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 主控台刪除個別通道或多個通道，請移至 [Tunnels hub](https://console.aws.amazon.com/iot/home#/tunnels) (通道中樞)，選擇您要刪除的通道，然後選擇**Delete tunnel** (刪除通道)。
  + 若要使用 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
    ```