SSHによるポートフォワーディング
SSHのポートフォワーディング
案件によっては頻繁に使いますが、全然使わないよってこともあって、使おうとするとあれ?って思いますのでメモ。
実際の利用例
· ローカルポートの転送(-L オプション)
ローカルからリモート方向へのトンネリングを実現する。
例1 (単純なフォワーディング)
# ssh -L 1234:hostA:22 user@hostA |
例2 (ファイアーウォールの外から内部へアクセス可能)
ローカルホストの1234ポートにアクセスするとhostAのポート22にアクセスできる。
# ssh -L 1234:hostB:22 user@hostA |
ローカルホストの1234ポートにアクセスすると、hostA経由でhostBのポート22にアクセスできる。直接は到達不可能なホストにもアクセス可能
例3 (ローカルポートのサービスを別ポートに転送)
# ssh -L 1234:localhost:22 user@localhost |
ローカルのポート22で行われているサービスを1234からもアクセス可能にする
· リモートポートの転送(-R オプション)
リモートホストからローカル方向へのトンネリングを実現する。
例1~3までの逆方向を行えるだけで、基本的な機能は同じ。
例4
# ssh -R 1234:localhost:22 user@hostA |
hostAのポート1234にアクセスするとローカルホストのポート22にアクセスできる。
ローカルホストがファイアーウォール内、hostAがグローバルの場合便利。
例5
# ssh -R 1234:hostB:22 user@hostA |
hostAのポート1234にアクセスすると、ローカルホスト経由でhostBのポート22にアクセスできる。
例6
# ssh -R 1234:localhost:22 user@localhost |
結果は例3と全く同じ。
ポートフォワーディングを行う際に知っておきたいこと
暗号化される経路
暗号化が行われるのはローカルホスト~リモートログイン先のホストまでである。
例2の場合、ローカルホスト~hostA間は暗号化されるが、hostA~hostB間は暗号化されない。
ユーザーの権限と利用できるポート
ローカルホストの特権ポートでlistenする際にはsshコマンドの実行権限がrootと同等でなければならない。
リモートホストの特権ポートでlistenする際にはリモートログイン時のユーザー権限がrootと同等でなければならない。
· ポートフォワーディングと組み合わせると便利なオプション
よく使うオプションの組合せ例
# ssh -C -N -f -L 1234:hostA:22 user@hostA |
このようなオプションで起動すると、ローカルホストの1234がhostAのポート22につながるようにポートフォワーディングが行われる。
加えて、-Cオプションによる圧縮、-fオプションによるバックグラウンドでの動作、-Nオプションによるリモートでのコマンド実行無し(通常はシェルが起動してしまう)という指定が可能。
簡単にまとめると、ポートフォワーディングのみを実現するプロセスが作れます。(しかもデータ圧縮をした転送)
よく使うオプションの簡単な説明
セッションの圧縮 (-C オプション)
SSHを用いた通信経路において、データを圧縮した通信を行う。
設定ファイルに「圧縮レベル」や、「オプションなしでも常時圧縮」などの設定が可能。
リモートでコマンドを実行しない(-N オプション)
リモートでのコマンド実行が行われないため、ポートフォワードのみを行いたい時に有効。
特に指定しない場合、SSHでのコネクションはリモートでシェルが起動する。
バックグラウンドで実行(-f オプション)
実行するとそれ移行バックグラウンドのプロセスとなる。
停止させるときはプロセスを探して普通にkillすればいい。
プロトコルの指定 (-1 , -2 オプション)
プロトコルのバージョンを指定することができる。
数字がそのままバージョンを表している。
IPバージョンの指定 (-4 , -6 オプション)
IPバージョンを指定することができる。
数字がそのままバージョンを表している。