SSHトンネル接続のイロハ
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>(リモート)となる。