SSH ポートフォワディングで社内 PROXY 環境から AWS にリモートデスクトップ接続する

# <i class="fa fa-map-marker"></i> 目的
　社内 HTTP プロキシに阻まれて AWS 上の Windows Server にリモートデスクトップ接続できなかったため、SSH ポートフォワーディングを許可した Linux インスタンス経由でのリモートデスクトップ接続や SQL Server 接続をしました。その記録です。

# <i class="fa fa-globe"></i> 概念図
こんなかんじ
![AWS Design (1).png](https://qiita-image-store.s3.amazonaws.com/0/130874/5b20c263-c581-871a-3fb8-b2f1c9834320.png)
(作図は [Cacoo](https://cacoo.com/) を使いました)

# <i class="fa fa-map-o"></i> 構成
- 踏み台となる Linux インスタンス はポートフォワーディングを許可します
    - サーバ：LinuxServer
    - 接続プロトコル：SSH 22
    - EIP で接続します
- 接続確認のため、EC2 でWindows インスタンス、RDS で SQL Server を作成しました
    - WindowsServer
        - 接続プロトコル：RDP 3389
        - EIP で接続します
    - RDS-SQLServer
        - 接続プロトコル：SQLServer 1433
        - エンドポイントで接続します
- ローカル端末 は PuTTY を導入してポートフォワーディングの設定をします
    - LOLACMACHINE
        - Windows 7 32bit
        - PuTTY ごった煮版 0.60
    - 使用するローカルポート：10000、100001
- 社内のプロキシサーバは HTTP プロキシのみ許可されています、外から見るとグローバル IP が1つです。毎度いろんなことの邪魔をしてくれます。
    - PROXYSERVER:8080

*サーバ名はぼかして書いていますので、ホスト名または IP が入るものと読み替えてください。*

# <i class="fa fa-location-arrow"></i> 手順

## 事前準備
## 踏み台 Linux インスタンス作成
　ポートフォワーディングを許可する Linuxサーバを1つ作成しました。

- LinuxServer
    - EIP 設定
    - セキュリティグループ：社内ネットワークのグローバルIP:22 Inbound のみ許可

## 接続確認用インスタンス作成
　接続確認用として EC2 と RDS をそれぞれ作成してみました。

- WindowsServer
    - EIP 設定
    - セキュリティグループ：LinuxServer:3389 Inbound のみ許可
- RDS-SQLServer
    - セキュリティグループ：LinuxServer:1433 Inbound のみ許可


## LinuxServer
SSHD にポートフォワーディングの設定を行います。

``` bash:console
$ sudo vi /etc/ssh/sshd_config
```

変更箇所（行頭コメント#を取るだけ）

``` bash:vi
AllowAgentForwarding yes
```

サービス再起動

``` bash:console
$ sudo service sshd restart
Stopping sshd:                  ​​​​​                           [  OK  ]
Starting sshd:                                             [  OK  ]
```

## ローカル端末（LOCALMACHINE）
　[PuTTY ごった煮版（putty-0.60-JP_Y-2007-08-06）](http://yebisuya.dip.jp/Software/PuTTY/) を導入しました。設定したのは以下のとおりです。設定後に起動して接続しておきます。*読みはプティじゃなくパティです。*

- セッション
    - ホスト名：LinuxServer
    - ポート：22
- 接続
    - データ
        - 自動ログインのユーザ名：ec2-user
    - プロキシ
        - プロキシホスト名：PROXYSERVER
        - ポート：8080
        - ユーザ名：USERNAME
        - パスワード：PASSWORD
    - SSH
        - Keepalive の間隔：30
        - 認証
            - 認証のためのプライベートキーファイル：LINUXSERVERPRIVATEKAY.ppk
            - [PEM → PPK 変換が必要です](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/putty.html)
        - **トンネル**
            - ローカルポートは他のホストからの接続を受け入れる：チェック
            - WindowsServerの設定追加
                - **源ポート：10000**
                - **送り先：WindowsServer:3389**
                - ローカル：チェック
                - IPv4：チェック
            - WindowsServerの設定追加
                - **源ポート：10001**
                - **送り先：RDS-SQLServer:1433**
                - ローカル：チェック
                - IPv4：チェック

　*源ポートって日本語あやしいですね。みなもとポートと読むんですか。*

　必要に応じてファイアーウォールの設定を行います。localhost で使用する場合は設定不要ですが、トンネルサーバとして公開する場合などに必要になります。

- Windows Firewall
    - TCP
        - プロトコルおよびポート
            - ローカルポート
            - 特定のポート：10000-10001
        - 詳細設定
            - ドメイン：チェック

## 接続確認
　リモートデスクトップ、できました。
![image](https://qiita-image-store.s3.amazonaws.com/0/130874/066c2226-344c-594e-7c98-bca5fb4e1689.png)

　RDS-SQLServer も接続できました。*なんでカンマ区切りなのこれ。*
![image](https://qiita-image-store.s3.amazonaws.com/0/130874/3404711d-0a48-7761-7dd0-776382af2436.png)

# <i class="fa fa-code-fork"></i> 補足：Windows 向けの SSH Tunnel Manager
　今後接続先をふやしていくにあたって、PuTTY で接続先管理したり、接続が切断されたときのリトライ処理をするのがしんどそうなので Windows 向けの SSH Tunnel Manager （SSH Tunnel Daemon とも呼ぶらしい）を探していくつか試しました。

- [Google Code Archive - Long-term storage for Google Code Project Hosting.](https://code.google.com/archive/p/ssh-tunnel-manager/)
    - 唯一使えました。いい感じです。
    - 接続先 VPC ごとに踏み台インスタンスの接続定義を増やしたりが簡単にできそうです。
    - 設定は適当に。
        - Options
            - General
                - Local ports accept connections from other hosts：チェック

![image](https://qiita-image-store.s3.amazonaws.com/0/130874/5f96f6a4-b784-1e75-73f7-08a8ffc083fb.png)

*すごいどうでもいいけど、About 画面がツボでした。*
*CURSOR DISCO! JOIN IN!*
![disco3.gif](https://qiita-image-store.s3.amazonaws.com/0/130874/217ca745-f938-7650-7017-715dd2daa3b4.gif)

- [SSH Tunnel | programmerplanet.org](http://www.programmerplanet.org/projects/ssh-tunnel/)
    - 秘密鍵方式に対応していないようです。
- [N2 - MyEnTunnel - A background SSH tunnel daemon](http://nemesis2.qx.net/pages/MyEnTunnel)
    - 秘密鍵方式に対応していないようです。プロキシ設定もできません。

　ほかにも、接続先を管理する用のテキストファイルと、それを読み込んで plink.exe を起動、切れたらリトライするようなバッチファイルを作っておいてもいいかなと思いました。コマンドサンプルです。

`plink.exe -ssh -load PUTTYSESSIONNAME ec2-user@LinuxServer -P 22 -i C:\LINUXSERVERPRIVATEKAY.ppk -v -N -L 10000:WindowsServer:3389 -L 10001:RDS-SQLServer:1433`

　Mac だと [SSH Tunnel Manager](https://www.tynsoe.org/v2/stm/) というのがメジャーなようです。


# <i class="fa fa-external-link"></i> 参考リンク
（お世話になりました）

- [SSHポートフォワーディングの設定](http://rose.cc.tsukuba.ac.jp/manual/putty/ssh-port-forward.html)
- [sshポートフォワーディング - Qiita](http://qiita.com/mechamogera/items/b1bb9130273deb9426f5)
- [Windows環境から SSHでポートフォワード(port forwarding)[別名 SSHトンネル]するには何が最適か？ - Qiita](http://qiita.com/ynott/items/6f0088b412b3a4128910)
- [SSHのポートフォワードを利用してファイアウォール越しに社内環境とAWS上のインスタンスを連携する - Qiita](http://qiita.com/osuo/items/1fe9d6db2f5534440242)
- [SSHトンネルでSFTP接続 - Qiita](http://qiita.com/Zero_Kohaku/items/308c73fa1ab355699032)

（以上）