SSHトンネルについて調べたこと

SSHトンネル(ポートフォワード)について少し調べてみました。
いままでも何度となく使っていたのだけど、きちんと調べたことはなかったので。

ローカル→リモート

ssh foo@bar.com -L 15901:localhost:5901

これは、ローカル→リモートのポートフォワードで、手元のマシンのlocalhost:15901にアクセスすると、bar.com:5901(VNC)に接続されます。
bar.comが5901ポートを外部に公開していない(ファイアウォールがかかっている)場合でも、SSHが可能ならばVNC接続できるということになります。
これは最も単純なSSHトンネルで、私がいままで使ってきたのは、ほとんどこれ。

ssh foo@bar.com -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 foo@bar.com -R 15901:localhost:5901

こうすると、bar.com:15901にアクセスすれば自分(192.168.10.10)の5901ポートに接続されることになります。
この場合、bar.comの15901はファイアウォールで遮断されていることが多いでしょうから、手元のマシンからは、

ssh foo@bar.com -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でポートフォワードするという必要もあるというわけですね。

この記事を書いた人

井上 研一

経済産業省推進資格ITコーディネータ/ITエンジニア。
合同会社井上研一事務所代表、株式会社ビビンコ代表取締役。
北九州市出身、横浜市在住。AIやIoTに強いITコーディネータとして活動。北九州市主催のビジネスコンテスト「北九州でIoT」に応募したアイディアが入選し、メンバーと株式会社ビビンコを創業。著書に「初めてのWatson」、「ワトソンで体感する人工知能」など。セミナーや研修講師での登壇多数。