ゆるテックノート

SSHポートフォワーディングとは?VPNとの違い

SSHポートフォワーディングは、SSH接続の中に別の通信を通す仕組みです。VPNと同じように「遠くのネットワークへ安全に届かせる」目的で使われることがありますが、得意なのはネットワーク全体の接続ではなく、特定のポートやアプリへの細い通り道を作ることです。

SSHポートフォワーディングの基本

SSHはもともと安全にサーバーへログインするための仕組みですが、その暗号化された接続の中へ別のTCP通信を流すこともできます。これをSSHポートフォワーディング、またはSSHトンネルと呼びます。

何ができる?

  • 手元のPCから、外部公開されていない管理画面やデータベースへ一時的に接続する。
  • 踏み台サーバーを経由して、社内やクラウド内の特定サービスへアクセスする。
  • 通信内容をSSHの暗号化された経路に包んで、中間ネットワークから見えにくくする。
  • VPNクライアントを入れずに、必要な接続だけを小さく開ける。

ローカル転送を開始する

OpenSSHでの例です。user@example.comを利用権限のあるSSHユーザーとサーバーに、db.internal:5432をそのサーバーから接続できるDBの名前とポートに置き換えます。DBクライアントの接続先は手元の127.0.0.1:15432にします。

ssh -N -o ExitOnForwardFailure=yes -L 127.0.0.1:15432:db.internal:5432 user@example.com

転送を終了する・失敗を見分ける

-Nはリモートコマンドを実行せず転送に使う指定です。端末を開いたまま利用し、終了時はCtrl+Cで止めます。ExitOnForwardFailure=yesは待ち受けの確保などに失敗すると終了しますが、DBへの接続成功を保証するものではありません。

3つの転送方式

SSHポートフォワーディングは、どちら側に入口を作るかで使い方が変わります。リモート転送も既定ではSSHサーバー自身からの接続に限定されます。他の端末からの接続可否は、サーバーのGatewayPorts設定やファイアウォールにも依存します。

方式の違い

方式 よく使う形 向いている用途
ローカル転送(-L) 自分のPCのポートを、SSHサーバー側から見える宛先へつなぐ 社内DB、管理画面、Redis、RDPなどへ一時的に接続する
リモート転送(-R) SSHサーバー側のポートを、自分のPC側や手元ネットワークの宛先へつなぐ NAT内の開発環境をSSHサーバー側から確認する、逆向きの接続を作る
動的転送(-D) 自分のPCにSOCKSプロキシを作り、接続先を都度切り替える ブラウザや一部アプリの通信をSSH経由にする

VPNとの違い

VPNとSSHポートフォワーディングはどちらも暗号化されたトンネルを作れます。ただし、扱う範囲と運用の前提がかなり違います。

比較表

観点 SSHポートフォワーディング VPN
接続範囲 指定したTCPポートやSOCKS経由の通信が中心 端末全体、特定サブネット、アプリ単位など広く設計できる
主な用途 管理者や開発者が特定サービスへ一時接続する 在宅勤務、拠点間接続、常時接続、個人向けプライバシー補助
対応通信 基本はTCP。UDPやICMPはそのまま扱いにくい 方式によってIPレベルでTCP/UDP/ICMPなどを扱える
設定の重さ SSHアカウントと鍵があれば小さく始めやすい クライアント、ルーティング、DNS、認証、端末管理の設計が必要
権限管理 SSHログイン権限とサーバー側設定に強く依存する ユーザー、端末、ネットワーク、アプリ単位で設計しやすい製品が多い
利用者層 技術者向けになりやすい 一般利用者向けクライアントや企業管理に向く

ざっくりした使い分け

  • 「特定のDBや管理画面だけに入りたい」ならSSHポートフォワーディングが扱いやすい。
  • 「社内ネットワークや複数アプリを普段どおり使いたい」ならVPNのほうが向いている。
  • 「ブラウザだけSSH経由にしたい」なら動的転送(SOCKS)も選択肢になる。
  • 「全社員に配るリモートアクセス基盤」なら、認証、ログ、端末管理を含めてVPNやZTNA系を検討する。

よくある利用例

SSHポートフォワーディングは、外部公開したくない管理系サービスへ、必要な人だけが一時的に入る用途でよく使われます。

ローカル転送の例

  • 本番DBをインターネットへ公開せず、踏み台サーバー経由で管理ツールから接続する。
  • クラウド内の管理画面を localhost 経由で開く。
  • リモートデスクトップやVNCなどを、公開ポートなしで一時的に使う。

動的転送を開始する

接続先を自分の環境に置き換えて実行し、利用するアプリのSOCKS5プロキシを127.0.0.1、ポートを1080に設定します。端末全体には適用されません。名前解決もSSH側へ送るには、アプリ側のSOCKS経由DNS設定を確認します。

ssh -N -o ExitOnForwardFailure=yes -D 127.0.0.1:1080 user@example.com

注意点

SSHが暗号化するのはSSHクライアントとSSHサーバーの間です。SSHサーバーからDBなどの宛先までの区間は、必要に応じてTLSなどで別に保護します。

安全に使うためのポイント

  • 公開鍵認証の鍵を適切に管理し、接続先のホスト鍵の指紋も信頼できる経路で照合する。
  • サーバーのAllowTcpForwardingで転送方式、PermitOpenでローカル転送の宛先、PermitListenでリモート転送の待ち受けを制限できる。シェル利用者は別の中継プログラムを動かせるため、転送設定だけではアクセスを完全には制限できない。
  • 127.0.0.1で待ち受けても同じPCの別プロセスは利用できるため、DBなどの認証を省略しない。0.0.0.0で待ち受けると、到達可能な他端末にも入口を開く。
  • SSHサーバーに入れる人は、内部サービスへの経路を作れる場合がある。踏み台サーバーのログと権限管理が重要。
  • 長期・多数ユーザー・広範囲アクセスに使うなら、VPNやゼロトラスト系アクセス製品のほうが運用しやすいことがある。

まとめ

SSHポートフォワーディングは「特定の通信だけをSSHで通す」ための軽量な方法です。VPNは「端末やネットワークの通信経路を設計する」ための仕組みです。

覚え方

  • SSHポートフォワーディングは、点と点をつなぐ細いトンネル。
  • VPNは、端末やネットワークをまとめて扱う太いトンネル。
  • 小さな管理用途ならSSH、大きなリモートアクセス基盤ならVPN、と考えると選びやすい。
  • VPNの見え方や守れる範囲は、VPN利用時に誰から何が見える?やVPNで守れること・守れないことも合わせて確認する。

仕様・公式資料

OpenSSH ssh / ssh_config: ExitOnForwardFailure / sshd_config / RFC 4254: TCP/IP forwarding