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

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

この記事を書いた人

井上 研一

株式会社ビビンコ代表取締役、ITエンジニア/経済産業省推進資格ITコーディネータ。AI・IoTに強いITコーディネータとして活動。画像認識モデルを活用したアプリや、生成AIを業務に組み込むためのサービス「Gen2Go」の開発などを行っている。近著に「使ってわかった AWSのAI」、「ワトソンで体感する人工知能」。日本全国でセミナー・研修講師としての登壇も多数。