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-host
とtarget-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 スプリングボード マシンからトンネルを開始し、ポート フォワーディングを確立するには、これを逆にする必要があります。この時点で、リモート ポート フォワーディングが形成されます。スプリングボード マシンは次のコマンドを実行し、ローカル コンピューター local
の 2121
ポートをバインドし、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-host
のlocalhost:2999
です。つまり、tunnel1-host
がリクエストを受信した後です。このマシンから、独自の2999
ポートに転送されます。
次に、最初のスプリングボード マシン (tunnel1-host
) で次のコマンドを実行して、新しい第 2 レベルのトンネルを作成します。
$ ssh -L 2999:ターゲットホスト:7999 トンネル2ホスト -N
上記のコマンドは、最初のスプリングボード マシンtunnel1-host
の2999
ポートを、2 番目のスプリングボード マシンtunnel2-host
を介してターゲット サーバーtarget-host
の7999
ポートに接続します。
最終的な効果は、ローカル マシンの7999
ポートにアクセスすると、target-host
の7999
ポートに転送されることです。
参考リンク
- SSH トンネルの図解ガイド、Scott Wiersdorf
- SSH の耐え難いほど詳細なガイド、グラハム ヘルトン
作者: wangdoc
アドレス: https://wangdoc.com/
ライセンス: クリエイティブ・コモンズ 3.0