ssh ポートフォワーディングまとめ

## 概要
SSHのポートフォワーディングがあまりにわかりにくかったのでまとめました。

[mydev01] --> [mydev02]  --> [mydev03]

| サーバ名とglobalIP | 便宜上のlocalhost名 | 役割 |
|:-----:|:-------:|:-------:|
| mydev01(192.168.33.31) | local1 | ssh実行サーバ |
| mydev02(192.168.33.32) | local2 | 踏み台サーバ |
| mydev03(192.168.33.33) | local3 | 接続先サーバ |
それぞれ localhost(127.0.0.1)だが便宜上区別するためにlocalに添字をつけました。


## mydev01 -> mydev02 への接続
### mydev01(global) -> mydev02(global), mydev02(global) -> mydev02(global)

```
[mydev01:term1]
### 以下コマンドを実行してターミナルはそのままにしておく
$ ssh -L 4001:mydev02:22 mydev02
※ -L : ローカルフォワーディング

[mydev01:term2]
### 別ターミナルでmydev02に接続
$ ssh -p 4001 localhost

[mydev02:term2]
$ netstat -ano | less
===================================
tcp        0      0 192.168.33.32:22               192.168.33.32:46727            ESTABLISHED keepalive (7186.15/0/0)
===================================
```
以下の流れで接続
1. [mydev01(global)]:4001 --> [mydev02(global)]:22
2. [mydev02(global)]:46727 --> [mydev02(global)]:22

### mydev01(global) -> mydev02(global), mydev02(local2) -> mydev02(local2)
```
[mydev01:term1]
### 以下コマンドを実行してターミナルはそのままにしておく
$ ssh -L 4001:localhost:22 mydev02

[mydev01:term2]
### 別ターミナルでmydev02に接続
$ ssh -p 4001 localhost

[mydev02:term2]
$ netstat -ano | less
===================================
tcp        0      0 127.0.0.1:22                127.0.0.1:36691             ESTABLISHED keepalive (7186.74/0/0)
===================================
```
以下の流れで接続
1. [mydev01(global)]:4001  --> [mydev02(global)]:22
2. [mydev02(local2)]:36691 --> [mydev02(local2)]:22

この接続方法を使えば、localhostからの接続しか受け付けないmysqlでもリモートから接続する事ができる。

## mydev01 -> mydev02 -> mydev03 の接続
### mydev01(global) -> mydev02(global), mydev02(global) -> mydev03(global)

```
[mydev01:term1]
### 以下コマンドを実行してターミナルはそのままにしておく
$ ssh -L 4001:mydev03:22 mydev02

[mydev01:term2]
### 別ターミナルでmydev02に接続
$ ssh -p 4001 localhost

[mydev03:term2]
$ netstat -ano | less
===================================
tcp        0      0 192.168.33.33:22               192.168.33.32:34252            ESTABLISHED keepalive (7024.55/0/0)
===================================
```
以下の流れで接続
1. [mydev01(global)]:4001 --> [mydev02(global)]:22
2. [mydev02(global)]:34252 --> [mydev03(global)]:22


### mydev01(global) -> mydev02(global), mydev02(local2) -> mydev02(local2), mydev02(global) -> mydev03(global), mydev03(local3) -> mydev03(local3)

```
[mydev01:term1]
### 以下コマンドを実行してターミナルはそのままにしておく
$ ssh -t -L 4001:localhost:4002 mydev02 ssh -L 4002:localhost:22 mydev03

[mydev01:term2]
### 別ターミナルでmydev03に接続
$ ssh -p 4001 localhost

[mydev03:term2]
$ netstat -ano | less
===================================
tcp        0      0 127.0.0.1:22                127.0.0.1:59607             ESTABLISHED keepalive (7175.63/0/0)
===================================
```
以下の流れで接続
1. [mydev01(global)]:4001  --> [mydev02(global)]:22 
2. [mydev02(local2)]:XXXXX --> [mydev02(local2)]:4002
3. [mydev02(global)]:4002  --> [mydev03(global)]:22
4. [mydev03(local3)]:59607 --> [mydev03(local)3]:22

2.の「XXXXX」は調べ忘れ。mydev02の適当なポート番号が入っていたはず。


# 参考
踏み台経由でファイルを転送したい場合は

``` bash
scp -l 16000 -o 'ProxyCommand ssh vagrant@(踏み台サーバ) nc %h %p' hoge.txt vagrant@(転送先サーバ):/tmp
```
でOK

* TeraTerm
    * [teratermを使用した多段ssh転送](http://d.hatena.ne.jp/jranar/20120317/1331962461)
* 踏み台を経由したvnc接続
    * 踏み台サーバにログイン
    * 設定->SSH転送->追加
        * ローカルポート : 12345
        * リッスン : (何もなし)
        * リモート側ホスト : リモートサーバのIP
        * ポート : 3389
    * 設定->設定の保存
    * いったんログアウトして再度踏み台サーバにログイン
    * Windowsでmstsc(リモートデスクトップ)を実行
    * コンピュータ : 127.0.0.1:12345
    * vncのログイン画面が表示される