SSHトンネル(ポートフォワード)について少し調べてみました。
いままでも何度となく使っていたのだけど、きちんと調べたことはなかったので。
ローカル→リモート
ssh [email protected] -L 15901:localhost:5901
これは、ローカル→リモートのポートフォワードで、手元のマシンのlocalhost:15901にアクセスすると、bar.com:5901(VNC)に接続されます。
bar.comが5901ポートを外部に公開していない(ファイアウォールがかかっている)場合でも、SSHが可能ならばVNC接続できるということになります。
これは最も単純なSSHトンネルで、私がいままで使ってきたのは、ほとんどこれ。
ssh [email protected] -L 15901:192.168.10.10:5901
これもOKです。手元のマシンでlocalhost:15901にアクセスすると、bar.comを経由して192.168.10.10の5901ポートに接続します。192.168.10.10はプライベートIPアドレスなので、外部のネットワークからは接続できないけど、bar.comと同じネットワークにある(もしくはVPNがつながっている)ような場合に有効。
リモート→ローカル
上記の例は外部の方から踏み台とするサーバを使って内部のサーバに接続できるようなポートフォワードを設定していたのですが、逆に内部のサーバ側から接続可能な状態を作ることもできます。
192.168.10.10のサーバにログインして、
ssh [email protected] -R 15901:localhost:5901
こうすると、bar.com:15901にアクセスすれば自分(192.168.10.10)の5901ポートに接続されることになります。
この場合、bar.comの15901はファイアウォールで遮断されていることが多いでしょうから、手元のマシンからは、
ssh [email protected] -L 15901:localhost:15901
というポートフォワードを行い、localhost(手元のマシン):15901へのアクセスが、bar.comの15901ポートへの接続になるようにします。で、bar.com:15901は、192.168.10.10:5901へのポートフォワードになっているので、結局は192.168.10.10のVNCが開くことになります。
基本的には-L
だけ使っておけば中継もできるので問題なさそうですが、bar.comも192.168.10.10にアクセスできないような場合は(その逆はできるなら)、192.168.10.10側から-R
でポートフォワードするという必要もあるというわけですね。