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

この記事を書いた人

井上 研一

株式会社VIVINKO 代表取締役
経済産業省推進資格ITコーディネータ/ITエンジニア

AI・IoTに強いITコーディネータとして活動していたところ、2017年に北九州市主催のビジネスコンテスト「北九州でIoT」に当時主催していたコミュニティで応募したアイディアが入選。2018年、株式会社ビビンコ(現VIVINKO)を北九州市に設立し、IoTソリューションの開発・導入や、画像認識モデルを活用したアプリの開発を行う。2024年、生成AIを業務に組み込むためのサービス「Gen2Go」を開発し、北九州発!新商品創出事業の認定を受ける。日本全国でセミナー・研修講師としての登壇も多数。