SSH ポートフォワーディング

導入

SSH はサーバーにログインするだけでなく、暗号化通信の仲介としても使用され、2 つのサーバー間の暗号化通信の踏み台として機能し、元の暗号化されていない通信を暗号化通信に変えます。この機能はポート転送と呼ばれ、SSH トンネルとも呼ばれます。

ポート転送には 2 つの主な機能があります。

(1) SSH セキュア接続で暗号化されていないデータを送信すると、もともと安全ではなかったネットワーク サービスのセキュリティが強化されます。たとえば、ポート転送を通じて Telnet や FTP などの平文サービスにアクセスする場合、データ送信は暗号化されます。

(2) ネットワークファイアウォールをバイパスして、データ通信の暗号化された踏み台として。

ポート転送を使用するには、動的転送、ローカル転送、およびリモート転送の 3 つの方法があります。以下に一つずつ紹介していきます。

動的転送

動的転送とは、ローカル マシンと SSH サーバーの間に暗号化された接続が作成され、ローカル マシン内の特定のポートに対するすべての通信がこの暗号化された接続を通じて転送されることを意味します。その使用シナリオの 1 つは、SSH 転送を通じてすべての外部 Web サイトにアクセスすることです。

動的転送には、ローカル ポートを SSH サーバーにバインドする必要があります。 SSH サーバーがどの Web サイトにアクセスしたいかについては、完全に動的であり、元の通信に依存するため、動的転送と呼ばれます。

$ ssh -D ローカルポートトンネルホスト -N

上記のコマンドで、-Dは動的転送を意味し、local-portはローカル ポート、tunnel-hostは SSH サーバー、-Nは、この SSH 接続がポート転送のみを実行し、実行できないことを意味します。リモート シェルにログインしないと、リモート コマンドはトンネルとしてのみ機能します。

たとえば、ローカル ポートが2121の場合、動的転送コマンドは次のようになります。

$ ssh -D 2121 トンネルホスト -N

この転送では SOCKS5 プロトコルが使用されることに注意してください。外部 Web サイトにアクセスする場合、HTTP リクエストをローカル ポートに転送するには、HTTP リクエストを SOCKS5 プロトコルに変換する必要があります。

以下はSSHトンネル確立後の使用例です。

$カール -x 靴下5://localhost:2121 http://www.example.com

上記のコマンドでは、curl の -x パラメータはプロキシ サーバーを指定します。つまり、SOCKS5 プロトコルのローカル 2121 ポートを介して http://www.example.com にアクセスします。

動的転送を頻繁に使用する場合は、SSH クライアント上のユーザーの個人構成ファイル (~/.ssh/config) に設定を書き込むことができます。

DynamicForward トンネルホスト:ローカルポート

ローカル転送

ローカル転送とは、ローカル ポートを作成し、このポートに送信されたすべての通信を SSH サーバー経由で指定されたリモート サーバーのポートに転送することを指します。この場合、SSH サーバーは、ローカル コンピューターが直接接続できないリモート サーバーに接続するための出発点として機能する単なる仲介者です。ローカル転送は、ローカル コンピュータ上で確立される転送ルールです。

構文は次のとおりです。ローカル ポート (local-port)、SSH サーバー (tunnel-host)、リモート サーバー (target-host)、およびリモート ポート (target-port) が指定されます。

$ ssh -L -N -f ローカルポート:ターゲットホスト:ターゲットポートのトンネルホスト

上記のコマンドには、3 つの構成パラメータがあります。

  • -L: ローカルポートを転送します。
  • -N: コマンドは送信されません。接続を確立するためにのみ使用されます。このパラメータを指定しないと、SSH サーバー上でシェルが開きます。
  • -f: SSH 接続をバッ​​クグラウンドに置きます。このパラメータを指定しないと、SSH 接続が一時的に使用されない場合、端末は応答しなくなります。

たとえば、SSH サーバーtunnel-hostがあり、このマシンを使用して、ローカルの2121ポートとターゲット Web サイトwww.example.comの 80 ポートの間に SSH トンネルを確立したいとします。それはこのように。

$ ssh -L 2121:www.example.com:80 トンネルホスト -N

次に、このマシンの2121ポート (www.example.comの 80 番ポート) にアクセスします。

$カール http://localhost:2121

ローカル ポート転送は HTTP プロトコルを使用するため、SOCKS5 プロトコルに変換する必要がないことに注意してください。

もう 1 つの例は、暗号化されたアクセス メール取得プロトコル POP3 です。

$ ssh -L 1100:mail.example.com:110 mail.example.com

上記のコマンドは、ローカル マシンのポート 1100 をメール サーバーmail.example.comのポート 110 (POP3 プロトコルのデフォルト ポート) にバインドします。ポート転送が確立されると、POP3 メール クライアントはローカル マシンのポート 1100 にアクセスするだけで済み、リクエストは SSH サーバー (ここではmail.example.com) を介してmail.example.comのポート 110 に自動的に転送されます。 com`)。

上記の状況には前提条件があります。つまり、mail.example.com が SSH サーバーを実行している必要があります。それ以外の場合は、別の SSH サーバーを経由する必要があり、実行されるコマンドは次のように変更されます。

$ ssh -L 1100:mail.example.com:110 other.example.com

上記のコマンドでは、ローカル マシンのポート 1100 は依然としてmail.example.comのポート 110 にバインドされていますが、mail.example.comは SSH サーバーを実行していないため、other.example.comを経由する必要があります。 example.com」を仲介します。このマシンの POP3 要求はポート 1100 を通過し、最初にother.example.comのポート 22 (sshd のデフォルトのポート) に送信され、後者はそれを取得した後、mail.example.comに転送します。データの場合も同じように返されます。

上記の仲介方法では、ローカルコンピュータからother.example.comまでの区間のみが暗号化され、other.example.comからmail.example.comまでの区間は暗号化されないことに注意してください。

このコマンドに-Nパラメータを追加するのが最善です。これは、リモート コマンドが SSH スプリングボード上で実行されず、SSH がトンネルとしてのみ機能することを意味します。 SSH 接続がバックグラウンドで実行されることを示す-fパラメータもあります。

ローカル転送を頻繁に使用する場合は、SSH クライアントのユーザー個人構成ファイル (~/.ssh/config) に設定を書き込むことができます。

test.example.com をホストする
LocalForward クライアント IP:クライアント ポート サーバー IP:サーバー ポート

リモート転送

リモート転送とは、リモート SSH サーバーで確立された転送ルールを指します。

これはローカル転送の逆です。ローカル コンピュータからリモート SSH サーバーへのトンネルを確立した後、ローカル転送はローカル コンピュータを介してリモート SSH サーバーにアクセスし、リモート転送はリモート SSH サーバーを介してローカル コンピュータにアクセスします。コマンド形式は以下の通りです。

$ ssh -R リモートポート:ターゲットホスト:ターゲットポート -N リモートホスト

上記のコマンドで、-Rパラメータはリモート ポート転送を表します。remote-portはリモート SSH サーバーのポート、target-hosttarget-portはターゲット サーバーとそのポートです。 Remotehost` はリモート SSH サーバーです。

リモート転送は主にイントラネットの状況で使用されます。以下に 2 つの例を示します。

最初の例は、イントラネット上のサーバーlocalhostがポート 80 でサービスを開いたことです。このポート 80 は、リモート転送によってパブリック IP アドレスを持つmy.public.serverサーバーのポート 8080 にマッピングできます。アドレスmy.public.server:8080にアクセスすると、そのイントラネット サーバーのポート 80 にアクセスできます。

$ ssh -R 8080:localhost:80 -N my.public.server

上記のコマンドは、イントラネットのlocalhostサーバー上で実行され、localhostからmy.public.serverへの SSH トンネルが確立されます。実行後、ユーザーがmy.public.server:8080にアクセスすると、自動的にlocalhost:80にマッピングされます。

2 番目の例は、ローカル コンピューターlocalが外部ネットワーク上にあり、SSH スプリングボード マシンとターゲット サーバーmy.private.serverは両方ともイントラネット上にあり、ターゲット サーバーには SSH スプリングボード マシンを介してアクセスする必要があるというものです。 。ただし、ローカル コンピューターlocalはイントラネット内の SSH スプリングボード マシンにアクセスできませんが、SSH スプリングボード マシンはローカル コンピューターにアクセスできます。

このマシンはイントラネット SSH スプリングボードにアクセスできないため、外部ネットワークから SSH トンネルを開始してポート転送を確立できません。 SSH スプリングボード マシンからトンネルを開始し、ポート フォワーディングを確立するには、これを逆にする必要があります。この時点で、リモート ポート フォワーディングが形成されます。スプリングボード マシンは次のコマンドを実行し、ローカル コンピューター local2121 ポートをバインドし、my.private.server:80 にアクセスします。

$ ssh -R 2121:my.private.server:80 -N local

上記のコマンドは SSH スプリングボード マシンで実行され、スプリングボード マシンからlocalへのトンネルが確立され、このトンネルの出口はmy.private.server:80にマッピングされます。

明らかに、リモート転送では、SSH スプリングボード マシンからのリモート ログインを受け入れることができるように、ローカル コンピュータlocalにも SSH サーバーがインストールされている必要があります。

上記のコマンドを実行すると、踏み台マシンからローカルへのトンネルが確立されます。これで、ローカル コンピュータからターゲット サーバーにアクセスできるようになります。つまり、ローカル コンピュータで次のコマンドを実行します。

$カール http://localhost:2121

マシンが上記のコマンドを実行すると、サーバー my.private.server の 80 ポートから返されたコンテンツが出力されます。

リモート ポート転送を頻繁に実行する場合は、SSH クライアントのユーザー個人設定ファイル (~/.ssh/config) に設定を書き込むことができます。

ホストのリモート転送
  ホスト名 test.example.com
  RemoteForward リモート ポート ターゲット ホスト:ターゲット ポート

上記の設定が完了したら、以下のコマンドを実行してリモート転送を確立します。

$ ssh -N リモートフォワード

# に相当
$ ssh -R リモートポート:ターゲットホスト:ターゲットポート -N test.example.com

ポート転送の 2 つの例を見てみましょう。

シンプルな VPN

VPN は、外部ネットワークと内部ネットワークの間に暗号化されたチャネルを確立するために使用されます。内部ネットワーク上のサーバーには外部ネットワークから直接アクセスできず、スプリングボードを経由する必要があります。ローカル マシンがスプリングボードにアクセスできる場合は、SSH ローカル転送を使用して簡単に VPN を実装できます。

$ ssh -L 2080:企業サーバー:80 -L 2443:企業サーバー:443 トンネルホスト -N

上記のコマンドは、SSH スプリングボードを介してローカル マシンの2080ポートをイントラネット サーバーの80ポートにバインドし、ローカル マシンの2443ポートをイントラネット サーバーの443ポートにバインドします。

2 段踏み台

たとえば、2 つの SSH トンネルを作成すると、最初のトンネルが 2 番目のトンネルに転送され、2 番目のトンネルはターゲット サーバーにアクセスできます。

まず、このマシン上に新しい第 1 レベルのトンネルを作成します。

$ ssh -L 7999:localhost:2999 トンネル1-ホスト

上記のコマンドは、ローカルの7999ポートとtunnel1-hostの間にトンネルを確立します。トンネルの出口は、tunnel1-hostlocalhost:2999です。つまり、tunnel1-hostがリクエストを受信した後です。このマシンから、独自の2999ポートに転送されます。

次に、最初のスプリングボード マシン (tunnel1-host) で次のコマンドを実行して、新しい第 2 レベルのトンネルを作成します。

$ ssh -L 2999:ターゲットホスト:7999 トンネル2ホスト -N

上記のコマンドは、最初のスプリングボード マシンtunnel1-host2999ポートを、2 番目のスプリングボード マシンtunnel2-hostを介してターゲット サーバーtarget-host7999ポートに接続します。

最終的な効果は、ローカル マシンの7999ポートにアクセスすると、target-host7999ポートに転送されることです。

参考リンク


作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0