What is SSH Tunnel, SSH Reverse Tunnel and SSH Port Forwarding?

SSHトンネルとは?

SSHセッションを利用してデータを転送する手法。 インターネットへポートを開放することなく、セキュアにリモートサーバにアクセスできるようにする。

Local port forwarding

クライアントサーバの特定のポートを経由してデータをリモートサーバに転送する。-Lオプションを利用する。

単体のポート

$ ssh -L 3306:127.0.0.1:3306 user@<remote_db_server>

3306(クライアント)ポート、127.0.0.1(クライアント)を、3306(リモート)ポートに転送する。接続先はuser@<remote_db_server>(リモート)となる。

※クライアントとはsshコマンドを実行したサーバ、リモートとは接続先サーバを指す。

複数のポート

$ ssh -L 3306:localhost:3306 -L 3307:localhost:3307 user@<remote_server>

Tips

127.0.0.1以外からSSHトンネルを利用する場合

Mac内にDockerを立ている(ホスト内にネットワークを作成している)場合。Dockerコンテナ内部から、ホスト(Mac)でSSHでフォーワードしているポートに接続したい場合は、接続元を指定しない設定(0.0.0.0)が必要になる。

$ ssh -L 0.0.0.0:3306:127.0.0.1:3306 user@<remote_db_server>

インタラクティブセッションの無効化

インタラクティブセッションを無効化にするために-Nオプションを付与した方が良い。

$ ssh -N -L 0.0.0.0:3306:127.0.0.1:3306 user@<remote_db_server>

下記でインタラクティブセッションで接続できる。通常では利用しない。(デバッグで用いる?) $ ssh -t user@<remote_db_server> 'echo foo; exec zsh'

Remote port forwarding (reverse tunneling)

リモートサーバのデータをクライアントサーバに転送する。-Rオプションを利用する。

$ ssh -R 80:127.0.0.1:3000 user@<remote_server_ip>

3306(リモート)ポート、127.0.0.1(リモート)を、3306(クライアント)ポートに転送する。接続先はuser@<remote_db_server>(リモート)となる。

Tips

ローカルホストではなくパブリックIFに転送させたい

sshd_config内をGatewayPorts yesに書き換える。

Dynamic port forwarding

クライアントサーバの指定ないポートを利用してデータをリモートサーバに転送する。-Dオプションを利用する。

$ ssh -D 127.0.0.1:6000 user@<remote_server>

全ての(クライアント)ポート、127.0.0.1(クライアント)を、6000(リモート)ポートに転送する。接続先はuser@<remote_db_server>(リモート)となる。