

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# ウェブプロキシを使用するデバイスのローカルプロキシを設定します
<a name="configure-local-proxy-web-proxy"></a>

 AWS IoT デバイスでローカルプロキシを使用して、 AWS IoT セキュアトンネリング APIsと通信できます。ローカルプロキシは、WebSocketの安全な接続を介したセキュアトンネリングを通して、デバイスアプリケーションによって送信されたデータを送信します。ローカルプロキシは `source` または `destination` モードで実行できます。`source` モードでは、TCP 接続を開始するものと同じデバイスまたはネットワークで実行されます。`destination` モードでは、ローカルプロキシが送信先アプリケーションと共にリモートデバイス上で実行されます。詳細については、「[ローカルプロキシ](local-proxy.md)」を参照してください。

 AWS IoT セキュアトンネリングを使用するには、ローカルプロキシがインターネットに直接接続する必要があります。セキュアトンネリングを使用した存続期間が長い TCP 接続については、ローカルプロキシが HTTPS リクエストをアップグレードして、[セキュアトンネリングデバイス接続エンドポイント](https://docs.aws.amazon.com/general/latest/gr/iot_device_management.html)のいずれかへの WebSockets 接続を確立します。

デバイスが、ウェブプロキシを使用するネットワーク内にある場合、ウェブプロキシは接続をインターネットに転送する前にそれらをインターセプトできます。セキュアトンネリングデバイス接続エンドポイントに対して存続期間が長い接続を確立するには、[WebSocket の仕様](https://tools.ietf.org/html/rfc6455#section-4.1)で説明されているとおり、ウェブプロキシを使用するようにローカルプロキシを設定します。

**注記**  
[AWS IoT Device Client](iot-sdks.md#iot-sdk-device-client)は、ウェブプロキシを使用するデバイスをサポートしていません。ウェブプロキシに対応させるには、以下で説明されているように、ローカルプロキシを使用してウェブプロキシに対応するように設定する必要があります。

以下の手順は、ローカルプロキシとウェブプロキシがどのように連動するかを説明するものです。

1. ローカルプロキシは、HTTP `CONNECT` リクエストをウェブプロキシに送信します。このリクエストには、セキュアトンネリングサービスのリモートアドレスと共に、ウェブプロキシ認証情報が含まれています。

1. 次に、ウェブプロキシがリモートセキュアトンネリングエンドポイントに対する存続期間が長い接続を作成します。

1. TCP 接続が確立され、ローカルプロキシは、データ伝送の送信元モードと送信先モードの両方で稼働します。

**Topics**
+ [ローカルプロキシを構築します](#build-local-proxy)
+ [ウェブプロキシを設定します](#configure-web-proxy)
+ [ローカルプロキシを設定、起動します](#configure-start-local-proxy)

## ローカルプロキシを構築します
<a name="build-local-proxy"></a>

GitHub リポジトリで、[ローカルプロキシのソースコード](https://github.com/aws-samples/aws-iot-securetunneling-localproxy)を開き、ローカルプロキシを構築、インストールするための手順に従います。

## ウェブプロキシを設定します
<a name="configure-web-proxy"></a>

ローカルプロキシは、[HTTP/1.1 の仕様](https://tools.ietf.org/html/rfc7231#section-4.3.6)で説明されている HTTP トンネリングメカニズムに依存しています。この仕様に準拠するには、ウェブプロキシが `CONNECT` メソッドの使用をデバイスに許可する必要があります。

ウェブプロキシの設定方法は、使用しているウェブプロキシと Wウェブプロキシのバージョンによって異なります。ウェブプロキシを正しく設定されるように、ウェブプロキシのドキュメントを確認してください。

Web プロキシを設定するには、まず ウェブプロキシ URLを特定し、ウェブプロキシが、HTTP トンネリングをサポートしているかどうかを確認します。ウェブプロキシURL は、後でローカルプロキシを設定して起動する時に使用されます。

1. 

**ウェブプロキシの URL を特定します**  
ウェブプロキシ URL は以下の形式になるでしょう。

   ```
   protocol://web_proxy_host_domain:web_proxy_port
   ```

   AWS IoT セキュアトンネリングは、ウェブプロキシの基本認証のみをサポートします。ベーシック認証を使用するには、**username**および**password**をウェブプロキシ URLの一部として指定する必要があります。ウェブプロキシ URL は、次の形式になります。

   ```
   protocol://username:password@web_proxy_host_domain:web_proxy_port
   ```
   + *protocol* は、`http` または `https` にすることが可能です。`https` を使用することをお勧めします。
   + [*proxy\$1host\$1domain*]は、ウェブプロキシの IP アドレス、またはウェブプロキシの IP アドレスを解決する DNS 名です。
   + [*web\$1proxy\$1port*]は、ウェブプロキシがリッスンするポートです。
   + ウェブプロキシはこの**username**および**password**を使用してリクエストを認証します。

1. 

**ウェブプロキシの URL をテストします**  
Web プロキシが TCP トンネリングをサポートしているかどうかを確認するには、`curl`コマンドを使用し、必ず`2xx`または`3xx`レスポンスを受け取る事を確認してください。

   例えば、ウェブプロキシ URL が `https://server.com:1235` の場合は、`curl` コマンドで `proxy-insecure` フラグを使用します。これは、ウェブプロキシが自己署名証明書に依存する可能性があるためです。

   ```
   export HTTPS_PROXY=https://server.com:1235
   curl -I https://aws.amazon.com --proxy-insecure
   ```

   ウェブプロキシ URL に`http`ポート (例、`http://server.com:1234`)がある場合は、`proxy-insecure`フラグを使う必要はありません。

   ```
   export HTTPS_PROXY=http://server.com:1234
   curl -I https://aws.amazon.com
   ```

## ローカルプロキシを設定、起動します
<a name="configure-start-local-proxy"></a>

ウェブプロキシを使用するためにローカルプロキシを設定するには、DNS ドメイン名、またはウェブプロキシが使用する IP アドレスとポート番号で`HTTPS_PROXY` 環境変数を設定する必要があります。

ローカルプロキシを設定したら、この [README](https://github.com/aws-samples/aws-iot-securetunneling-localproxy#readme) ドキュメントに説明されているようにローカルプロキシを使用できます。

**注記**  
環境変数の宣言では、大文字と小文字が区別されます。一度、すべて大文字またはすべて小文字のいずれかを使用して、それぞれの変数を定義する事をお勧めいたします。以下の例は、大文字で宣言された環境変数を示しています。同じ変数が大文字と小文字の両方を使用して指定されている場合は、小文字を使用して指定された変数が優先されます。

以下のコマンドは、ウェブプロキシを使用するように送信先で実行されているローカルプロキシを設定して、ローカルプロキシを開始する方法を示しています。
+ `AWSIOT_TUNNEL_ACCESS_TOKEN`: この変数は、送信先のクライアントアクセストークン (CAT) を保持します。
+ `HTTPS_PROXY`: この変数は、ローカルプロキシを設定するための Web プロキシ URL または IP アドレスを保持します。

以下の例にあるコマンドは、使用するオペレーティングシステムと、ウェブプロキシが HTTP ポートまたは HTTPS ポートのどちらでリッスンしているかに応じて異なります。

### HTTP ポートでリッスンする ウェブプロキシ
<a name="configure-start-local-proxy-http"></a>

ウェブプロキシが HTTP ポートでリッスンしている場合は、`HTTPS_PROXY` 変数にウェブプロキシ URL または IP アドレスを指定できます。

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

Linux または macOS では、ターミナルで次のコマンドを実行して、HTTP ポートをリッスンする Web プロキシを使用するように宛先でローカルプロキシを設定および起動します。

```
export AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token}
export HTTPS_PROXY=http:proxy.example.com:1234
./localproxy -r us-east-1 -d 22
```

プロキシで認証する必要がある場合は、**username**および**password**を`HTTPS_PROXY`変数の一部として実行します。

```
export AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token}
export HTTPS_PROXY=http://username:password@proxy.example.com:1234
./localproxy -r us-east-1 -d 22
```

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

Windows では、Linux や macOS の場合と同様にローカルプロキシを設定しますが、環境変数の定義方法は、他のプラットフォームとは異なります。`cmd` ウィンドウで以下のコマンドを実行して、HTTP ポートをリッスンするウェブプロキシを使用するように送信先のローカルプロキシを設定して、ローカルプロキシを開始します。

```
set AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token}
set HTTPS_PROXY=http://proxy.example.com:1234
.\localproxy -r us-east-1 -d 22
```

プロキシで認証する必要がある場合は、**username**および**password**を`HTTPS_PROXY`変数の一部として実行する必要があります。

```
set AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token}
set HTTPS_PROXY=http://username:password@10.15.20.25:1234
.\localproxy -r us-east-1 -d 22
```

------

### HTTPS ポートでリッスンする ウェブプロキシ
<a name="configure-start-local-proxy-https"></a>

ウェブプロキシが HTTPS ポートでリッスンしている場合は、以下のコマンドを実行します。

**注記**  
Web プロキシに自己署名証明書を使用している場合、またはネイティブの OpenSSL サポートおよびデフォルト設定がない OS でローカルプロキシを実行している場合は、[[Certificate setup](https://github.com/aws-samples/aws-iot-securetunneling-localproxy#certificate-setup)](証明書セットアップ)セクションを GitHub リポジトリに追加します。

以下のコマンドは、HTTP プロキシ用にウェブプロキシを設定した方法と似ていますが、上記の説明どおりにインストールされた証明書ファイルへのパスも指定するという点が異なります。

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

Linux または macOS では、ターミナルで以下のコマンドを実行して、HTTPS ポートをリッスンするウェブプロキシを使用するように送信先で実行されているローカルプロキシを設定します。

```
export AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token}
export HTTPS_PROXY=http:proxy.example.com:1234
./localproxy -r us-east-1 -d 22 -c /path/to/certs
```

プロキシで認証する必要がある場合は、`HTTPS_PROXY` 変数の一部として **username** および **password** を指定する必要があります。

```
export AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token}
export HTTPS_PROXY=http://username:password@proxy.example.com:1234
./localproxy -r us-east-1 -d 22 -c /path/to/certs
```

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

Windows では、`cmd` ウィンドウで以下のコマンドを実行して、HTTP ポートをリッスンするウェブプロキシを使用するように送信先で実行されているローカルプロキシを設定し、ローカルプロキシを開始します。

```
set AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token}
set HTTPS_PROXY=http://proxy.example.com:1234
.\localproxy -r us-east-1 -d 22 -c \path\to\certs
```

プロキシで認証する必要がある場合は、`HTTPS_PROXY` 変数の一部として **username** および **password** を指定する必要があります。

```
set AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token}
set HTTPS_PROXY=http://username:password@10.15.20.25:1234
.\localproxy -r us-east-1 -d 22 -c \path\to\certs
```

------

### コマンドと出力の例
<a name="example-cmd-output-localproxy-webproxy"></a>

以下は、Linux OS で実行するコマンドと、対応する出力の例です。この例では、HTTP ポートでリッスンしているウェブプロキシと、ウェブプロキシを `source` および `destination` モードの両方で使用するようにローカルプロキシを設定する方法を説明します。これらのコマンドを実行する前に、トンネルをオープンし、送信元と宛先のクライアントアクセストークンを取得しておく必要があります。また、前述の説明に従ってローカルプロキシを構築し、ウェブプロキシを設定しておく必要もあります。

ここでは、ローカルプロキシを起動した後の手順の概要を示します。ローカルプロキシ:
+ ウェブプロキシURLを識別し、そのURLを使用してプロキシサーバーに接続できるようにします。
+ ウェブプロキシとの TCP 接続を確立します。
+ HTTP `CONNECT` リクエストをウェブプロキシに送信し、接続が確立されたことを示す `HTTP/1.1 200` レスポンスを待ちます。
+ HTTPS プロトコルを WebSockets にアップグレードして、存続時間が長い接続を確立します。
+ セキュアトンネリングデバイスエンドポイントへの接続を介してデータの送信を開始します。

**注記**  
この例で使用される以下のコマンドは、ローカルプロキシを実行した後の異なるステップ (先ほど説明したもの) の概要を説明するために `verbosity` フラグを使用します。このフラグはテストのみに使用することが推奨されます。

**出典モードでのローカルプロキシの実行**  
以下のコマンドは、ローカルプロキシを出典モードで実行する方法を示しています。

```
export AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token}
export HTTPS_PROXY=http:username:password@10.15.10.25:1234
./localproxy -s 5555 -v 5 -r us-west-2
```

以下は、ローカルプロキシを `source` モードで実行したサンプル出力です。

```
...

Parsed basic auth credentials for the URL
Found Web proxy information in the environment variables, will use it to connect via the proxy.

...

Starting proxy in source mode
Attempting to establish web socket connection with endpoint wss://data.tunneling.iot.us-west-2.amazonaws.com:443
Resolved Web proxy IP: 10.10.0.11
Connected successfully with Web Proxy
Successfully sent HTTP CONNECT to the Web proxy
Full response from the Web proxy:
HTTP/1.1 200 Connection established
TCP tunnel established successfully
Connected successfully with proxy server
Successfully completed SSL handshake with proxy server
Web socket session ID: 0a109afffee745f5-00001341-000b8138-cc6c878d80e8adb0-f186064b
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
Seting 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
```

**送信先モードでのローカルプロキシの実行**  
以下のコマンドは、送信先モードでローカルプロキシを実行する方法を示しています。

```
export AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token}
export HTTPS_PROXY=http:username:password@10.15.10.25:1234
./localproxy -d 22 -v 5 -r us-west-2
```

以下は、ローカルプロキシを `destination` モードで実行したサンプル出力です。

```
...

Parsed basic auth credentials for the URL
Found Web proxy information in the environment variables, will use it to connect via the proxy.

...

Starting proxy in destination mode
Attempting to establish web socket connection with endpoint wss://data.tunneling.iot.us-west-2.amazonaws.com:443
Resolved Web proxy IP: 10.10.0.1
Connected successfully with Web Proxy
Successfully sent HTTP CONNECT to the Web proxy
Full response from the Web proxy:
HTTP/1.1 200 Connection established
TCP tunnel established successfully
Connected successfully with proxy server
Successfully completed SSL handshake with proxy server
Web socket session ID: 06717bfffed3fd05-00001355-000b8315-da3109a85da804dd-24c3d10d
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
Seting up web socket pings for every 5000 milliseconds
Scheduled next read:

...

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