イントラネットからSSH転送でELBやS3に接続する

## 1. はじめに

イントラネットから接続するAWSの開発環境があって、

```
イントラネット内PC → AWS踏み台(Linux) → EC2(Windows) → ELB → EC2(OS知らない)
                                                        └→ EC2(OS知らない)

イントラネット内PC → AWS踏み台(Linux) → EC2(Windows) → S3
```

と、なっています。
EC2(Windows)にSSH転送でリモートデスクトップする手順だけ提供されました。

|ローカルポート|リモートアドレス|リモートポート|
|---|---|---|
|任意|EC2(Windows)のローカルIPアドレス|3389|

ELBの80番ポートに通信するクライアントライブラリがEC2(Windows)にあるけれども、Oracleがない。
Oracleと通信するアプリケーションからELBに接続したい。また、そのアプリケーションからAWS CLIを呼び出してS3にも接続したい。

このため、SSH転送を使用して、Oracleに接続できるイントラネット内PCから上記のELBとS3に接続するようにしました。
Tera Termにはイントラネット内のプロキシサーバの設定を行っています。

AWSは詳しくないので、以降の説明の部分URLはおかしいところがあるかもしれません。VPCもあるようです。

## 2. イントラネット内PCから接続

下記の通り、EC2(Windows)を無視します。

```
イントラネット内PC → AWS踏み台(Linux) → ELB → EC2(OS知らない)
                                         └→ EC2(OS知らない)

イントラネット内PC → AWS踏み台(Linux) → S3
```

イントラネット内PCでTera Teramを起動し、踏み台にログインする。

SSH転送設定(ELB)

|ローカルポート|リモートアドレス|リモートポート|
|---|---|---|
|10080|ホスト.リージョン.elb.amazonaws.com|80|

ローカルポート80番がうまくいかなかったので、10080にしました。
EC2(Windows)から ホスト.リージョン.elb.amazonaws.com に接続する代わりに、イントラネット内PCで localhost:10080 に接続します。

SSH転送設定(S3)

|ローカルポート|リモートアドレス|リモートポート|
|---|---|---|
|10443|bucket.ホスト.リージョン.vpce.amazonaws.com|443|
|443|s3.リージョン.amazonaws.com|443|

S3については、endpointのSSH転送と、AWS CLI(awsコマンド)が接続するアドレス(s3.リージョン.amazonaws.com)のSSH転送を行います。
awsコマンドがそのアドレスにhttpsで接続しに行きます。1行目のendpointのほうだけ設定してawsコマンドを実行すると、s3.リージョン.amazonaws.com に接続できなかったと標準エラー出力に出力されるので分かります。hostsファイルにそのホストをlocalhostと指定し、SSH転送のローカルポートは443としています。これにより、https://localhost:443 → SSH転送の s3.リージョン.amazonaws.com:443 と繋がります。

イントラネット内PCのhosts(S3接続用)
```
127.0.0.1 s3.リージョン.amazonaws.com
```

EC2(Windows)から endpoint bucket.ホスト.リージョン.vpce.amazonaws.com に接続する代わりに、localhost:10443 に接続します。

Tera TermマクロでSSH転送を設定する場合には、connectのオプションに、
```
/ssh-L10080:ホスト.リージョン.elb.amazonaws.com:80,10443:bucket.ホスト.リージョン.vpce.amazonaws.com:443,443:s3.リージョン.amazonaws.com:443
```
と指定します。
```
/ssh-Llocalhost:10080:ホスト.リージョン.elb.amazonaws.com:80,localhost:10443:bucket.ホスト.リージョン.vpce.amazonaws.com:443,localhost:443:s3.リージョン.amazonaws.com:443
```
でも同じで、リッスンは空欄となります。

## 3. イントラネット内PCにHyper-Vを入れて、Hyper-VゲストからELBとS3に接続

イントラネットに直接接続していないHyper-Vゲストから接続します。

```
Hyper-Vゲスト → イントラネット内PC(Hyper-Vホスト) → AWS踏み台(Linux) → ELB → EC2(OS知らない)
                                                                      └→ EC2(OS知らない)

Hyper-Vゲスト → イントラネット内PC(Hyper-Vホスト) → AWS踏み台(Linux) → S3
```

|PC|IPアドレス|
|---|---|
|Hyper-Vホスト|192.168.0.1 と イントラネットIPアドレス|
|Hyper-Vゲスト|192.168.0.2|


イントラネット内PC(Hyper-Vホスト)でTera Teramを起動し、踏み台にログインする。

SSH転送設定(ELB)

|リッスン|ローカルポート|リモートアドレス|リモートポート|
|---|---|---|---|
|192.168.0.1|10080|ホスト.リージョン.elb.amazonaws.com|80|

SSH転送設定(S3)

|リッスン|ローカルポート|リモートアドレス|リモートポート|
|---|---|---|---|
|192.168.0.1|10443|bucket.ホスト.リージョン.vpce.amazonaws.com|443|
|192.168.0.1|443|s3.リージョン.amazonaws.com|443|

リッスンが空欄だとlocalhostからのみの接続となります。
リッスンを192.168.0.1にして、192.168.0.2からの通信を受け付けるようにしています。
試していませんが、イントラネットからも受け付けたければ、0.0.0.0 にすれば良いと思います。

Hyper-Vゲストのhosts(S3接続用)
```
192.168.0.1 s3.リージョン.amazonaws.com
```

Hyper-Vゲストで、192.168.0.1:10080 で ELB に接続することができます。
AWS CLIのendpointを 192.168.0.1:10443 にすると、S3に接続することができます。

Tera TermマクロでSSH転送を設定する場合には、connectのオプションに、
```
/ssh-L192:168.0.1:10080:ホスト.リージョン.elb.amazonaws.com:80,192:168.0.1:10443:bucket.ホスト.リージョン.vpce.amazonaws.com:443,192:168.0.1:443:s3.リージョン.amazonaws.com:443
```
と指定します。
リッスンを空欄(その後の:はあり)にすると、0.0.0.0 になります。

あと、443、10080、10443ポートをファイヤーウォールの穴開けをします。

## 4. イントラネット内PCにNIC 2枚挿しにして、ローカルIPアドレス側にPCを接続してそこからELBとS3に接続

イントラネットに直接接続していないローカルPCから接続します。
Hyper-Vのケースと同じなので、できました。

```
ローカルPC → イントラネット内PC → AWS踏み台(Linux) → ELB → EC2(OS知らない)
                                                     └→ EC2(OS知らない)

ローカルPC → イントラネット内PC → AWS踏み台(Linux) → S3
```

|PC|IPアドレス|
|---|---|
|イントラネット内PC|192.168.0.1 と イントラネットIPアドレス|
|ローカルPC|192.168.0.2|

## 5. その他

EC2(Windows)には証明書が入っているのですが、イントラネット内PCやHyper-Vゲストにはその証明書がないため、そのままではAWS CLIがエラーになります。
これを回避するため、awsコマンドに --no-verify-ssl オプションを追加しました。