SSH ポート転送、ローカル ポート転送、リモート ポート転送、動的ポート転送の詳細

SSH ポート転送、ローカル ポート転送、リモート ポート転送、動的ポート転送の詳細

パート 1 SSH ポート転送の概要

カフェで無料Wi-Fiを利用しているとき、誰かがあなたのパスワードや個人情報を盗んでいるのではないかと考えたことはありませんか?研究室のファイアウォールがネットワーク アプリケーション ポートをブロックしていることに気付いたとき、悲惨な気持ちになりますか? SSH のポート転送機能がどのようなメリットをもたらすか見てみましょう。

SSH ポート転送の概要

まずポート転送の概念を理解しましょう。 SSH は SSH クライアントとサーバー間のすべてのネットワーク データを自動的に暗号化および復号化することがわかっています。ただし、SSH にはポート転送という非常に便利な機能も備わっています。

SSH リンクを介して他の TCP ポートからのネットワーク データを転送し、対応する暗号化および復号化サービスを自動的に提供できます。 SSH は他の TCP リンクが送信するための安全なチャネルを提供するため、このプロセスは「トンネリング」と呼ばれることもあります。

たとえば、Telnet、SMTP、LDAP などの TCP アプリケーションはすべて、ユーザー名、パスワード、個人情報のプレーンテキスト送信を回避することで、この機能のメリットを享受できます。同時に、職場環境のファイアウォールで一部のネットワーク ポートの使用が制限されているものの、SSH 接続は許可されている場合は、TCP ポートを転送することで SSH を使用して通信することもできます。

一般に、SSH ポート転送は次の 2 つの主要な機能を提供できます。

SSH クライアントと SSH サーバー間の通信データを暗号化します。

ファイアウォールの制限を突破し、これまで確立できなかったいくつかの TCP 接続を完了します。

図1. SSHポート転送

上図に示すように、ポート転送を使用すると、TCP ポート A と B は直接通信しなくなり、SSH クライアントとサーバーに転送されて通信が行われるため、データの暗号化が自動的に実現され、ファイアウォールの制限が回避されます。

パート2 SSHローカルポート転送とリモートポート転送

SSH ローカルポート転送の例の分析

最初の例を見てみましょう。研究室には LDAP サーバー (LdapServerHost) がありますが、この LDAP サーバーに直接接続できるのは、ローカル コンピューターに展開されたアプリケーションに制限されています。

デバッグやテストの目的で、リモート マシン (LdapClientHost) からこの LDAP サーバーに一時的に直接接続したい場合、これを実現する方法はありますか?

答えは間違いなくローカル ポート転送です。そのコマンド形式は次のとおりです。

ssh -L <local port>:<remote host>:<remote port> <SSH hostname>

ローカル SSH ポート転送を確立するには、LdapClientHost で次のコマンドを実行します。例:

$ ssh -L 7001:localhost:389 LdapServerHost

図2. ローカルポート転送

この例では、ローカル リスニング ポートとしてポート 7001 を選択していることに注意してください。ポート番号を選択する際は、管理者以外のアカウントにはポート 1 ~ 1023 をバインドする権限がないため、通常は使用されていない 1024 ~ 65535 のポート番号を選択することに注意してください。

次に、リモート マシン (LdapClientHost) 上のアプリケーションを、LDAP サーバーのポート 389 ではなく、ローカル マシンのポート 7001 に直接構成できます。データフローは次のようになります。

LdapClientHost 上のアプリケーションは、ローカル マシンのポート 7001 にデータを送信します。

ローカル SSH クライアントは、ポート 7001 で受信したデータを暗号化し、LdapServertHost の SSH サーバーに転送します。

SSH サーバーは受信したデータを復号化し、リスニング LDAP ポート 389 に転送します。

最後に、LDAP から返されたデータが返され、プロセス全体が完了します。

プロセスアプリケーション全体がLDAPサーバーに直接接続するのではなく、ローカルリスニングポートに接続していることがわかりますが、SSHポート転送が完了しています。

暗号化、転送、復号化、通信など、残りのすべての作業が完了します。

ここで注意すべき点がいくつかあります:

SSH ポート転送は SSH 接続を通じて確立され、ポート転送を有効にするにはこの SSH 接続を維持する必要があります。この接続が閉じられると、対応するポート転送も閉じられます。

SSH 接続を確立するときにのみポート転送を作成できますが、既存の SSH 接続にポート転送を追加することはできません。

上記のコマンドの<remote host>が localhost を使用する理由を疑問に思うかもしれません。どのマシンを指しているのでしょうか?この場合、LdapServertHost を指します。 IP アドレスやホスト名の代わりに localhost を使用するのはなぜですか?

実際、これは、以前に LDAP がローカル マシンからのみアクセスできるように制限した方法によって異なります。

ルックバック インターフェイスのみにアクセスが許可されている場合、当然、localhost または IP 127.0.0.1 のみがアクセスでき、実際の IP またはホスト名は使用できません。

コマンド内の<remote host><SSH hostname>は同じマシンである必要がありますか?実際には、必ずしもそうではなく、2 つの異なるマシンである場合もあります。これについては、次の例でさらに詳しく説明します。

LdapClientHost でポート転送を確立しましたが、このポート転送は他のマシンでも使用できますか?たとえば、LdapClientHost のポート 7001 に直接接続するために、新しい LdapClientHost2 を追加できますか?

答えは「いいえ」です。主流の SSH 実装では、ローカル ポート転送はルックバック インターフェイスにバインドされているため、ローカル ポート転送を使用できるのは localhost または 127.0.0.1 のみです。

他のマシンから開始された接続は、単に「接続が拒否されました」というメッセージが表示されます。

幸いなことに、SSH には GatewayPorts キーワードも用意されており、これを指定してこのローカル ポート転送を他のマシンと共有できます。

ssh -g -L <local port>:<remote host>:<remote port> <SSH hostname>

SSH リモート ポート転送の例の分析

2 番目の例を見てみましょう。今回は、ネットワークまたはファイアウォールの理由により、SSH を使用して LdapClientHost から LDAP サーバー (LdapServertHost) に直接接続することはできないが、逆の接続は許可されていると想定しています。すると、この時点での私たちの選択は当然リモート ポート転送になります。

コマンドの形式は次のとおりです。

ssh -R <local port>:<remote host>:<remote port> <SSH hostname>

たとえば、LDAP サーバー (LdapServertHost) で次のコマンドを実行します。

$ ssh -R 7001:localhost:389 LdapClientHost

図3. リモートポート転送

ローカル ポート転送と比較すると、この図では SSH サーバーと SSH クライアントの位置が入れ替わっていますが、データ フローは同じままです。

LdapClientHost 上のアプリケーションはローカル マシンのポート 7001 にデータを送信し、ローカル SSH サーバーはポート 7001 で受信したデータを暗号化して、LdapServertHost の SSH クライアントに転送します。

SSH クライアントは受信したデータを復号化し、リスニング中の LDAP ポート 389 に転送し、最後に LDAP から返されたデータを返してプロセス全体を完了します。

これを読んで、少し混乱しましたか?なぜローカル転送と呼ばれ、リモート転送と呼ばれることもあるのでしょうか?この2つの違いは何でしょうか?

ローカル SSH ポート転送とリモート SSH ポート転送の比較と分析

はい、SSH サーバー、SSH クライアント、LdapServertHost、LdapClientHost、ローカル ポート転送、リモート ポート転送、

非常に多くの名詞が人々を混乱させる可能性があります。

構造を分析してみましょう。

まず、SSH ポート転送には当然 SSH 接続が必要であり、SSH 接続は SSH クライアントから SSH サーバーへの方向性があります。

アプリケーションにも方向があります。たとえば、LDAP サーバーに接続する必要がある場合、LDAP サーバーは当然サーバー側であり、アプリケーション接続の方向もアプリケーションのクライアント側からアプリケーションのサーバー側へとなります。

2 つの接続の方向が同じである場合、それはローカル転送であると言えます。そして、2 つの方向が矛盾している場合は、リモート ポート転送であると言います。

比較のために、上記の 2 つの例を思い出してみましょう。

ローカルポートを転送する場合:

LdapClientHost は、アプリケーションのクライアントであり、SSH クライアントでもあります。両方の接続は、そこから LdapServertHost (LDAP サーバーと SSH サーバーの両方) を指します。

リモートポートを転送する場合:

LdapClientHost はアプリケーションのクライアントですが、SSH サーバーです。一方、LdapServertHost は LDAP のサーバーですが、SSH クライアントです。こうすることで、2 つの接続の方向が正確に反対になります。

もう一つの覚えやすい方法は

サーバー側のポートはすべて定義済みの固定ポート (SSH サーバーの場合はポート 22、LDAP の場合はポート 389) ですが、クライアント側のポートはすべて選択可能な動的ポート (上記の例ではポート 7001 を選択) です。

サーバー側の両方のポートが同じマシン上にあり、クライアント側の両方のポートが別のマシン上にある場合、これはローカル ポート接続です。

これらの 4 つのポートが 2 台のマシンに分散されており、各マシンにサーバー ポートとクライアント ポートがある場合、それはリモート ポート接続です。

両者の違いがわかったところで、類似点を見てみましょう。

ご使用の環境では、LdapClientHost が LdapServerHost への SSH 接続を開始でき、LdapServerHost が LdapClientHost への SSH 接続を開始できる場合。

このとき、同じ機能を実現できるローカル転送またはリモート転送を選択できます。

次に、ポート転送の高度なバージョンを見てみましょう。

これまで取り上げたさまざまな接続/転送には、2 台のマシンのみが関係していました。ローカル転送で言及した問題を覚えていますか?

ローカル ポート転送コマンドの<remote host><SSH hostname>は異なるマシンにできますか?

ssh -L <local port>:<remote host>:<remote port> <SSH hostname>

答えはイエスです! 4 台のマシン (A、B、C、D) を含む例を見てみましょう。

図4. マルチホスト転送アプリケーション

SSH クライアント (C) で次のコマンドを実行して、SSH 接続とポート転送を確立します。

$ ssh -g -L 7001:<B>:389 <D>

次に、アプリケーション クライアント (A) で接続マシン (C) の 7001 ポートを構成します。

マシン (C) によって確立されたローカル ポート転送をマシン (A) が使用できるようにするため、コマンドで「-g」パラメータを指定していることに注意してください。

注目すべきもう 1 つの点は、上記の接続において、(A) <-> (C) と (B) <-> (D) 間の接続は安全な接続ではなく、SSH によって暗号化または復号化されていないことです。

それらの間のネットワークが信頼できるものでない場合は、この接続方法の使用には注意が必要です。

パート3. その他の種類のポート転送

SSH 動的ポート転送の例の分析

そうですね、動的転送はクールですね。

これを見ると、ローカル転送とリモート転送についてはすでに説明しましたが、前提としてアプリケーション サーバーのポート番号は固定されている必要があることに気づいたでしょうか。

たとえば、前の例では LDAP サーバー ポート 389 です。ポート番号がない場合はどうなりますか?等、

このポート番号を持たないアプリケーションはどのようなものでしょうか?たとえば、ブラウザを使用して MSN などの Web を閲覧する場合などです。

安全でない WiFi 環境でインターネットを閲覧する場合、Web ブラウジングと MSN 情報を保護するために SSH 動的転送を使用することが間違いなく必要です。まず、動的転送のコマンド形式を見てみましょう。

$ ssh -D <local port> <SSH Server>

例えば:

$ ssh -D 7001 <SSH Server>

図5. 動的ポート転送

シンプルに思えます。ローカル ポート番号として 7001 を引き続き選択します。実際、SSH はここで SOCKS プロキシ サービスを作成します。ヘルプドキュメントの -D パラメータの説明を見てみましょう。

-Dポート
これは、ローカルのポートをリッスンするためのソケットを割り当てることによって機能します。
側であり、このポートに接続するたびに、
接続は安全なチャネルを介して転送され、アプリケーションは
tionプロトコルは、どこから接続するかを決定するために使用されます
リモートマシン。現在SOCKS4とSOCKS5プロトコル
がサポートされており、sshはSOCKSサーバーとして機能します。rootのみ
特権ポートを転送できます。動的ポート転送も
設定ファイルで指定する必要があります。

その後の使用は簡単です。localhost:7001 を通常の SOCKS プロキシとして直接使用し、ブラウザまたは MSN に直接設定できます。

SSH クライアントでアクセスできなかった Web サイトを正常に閲覧できるようになりました。現時点での SSH 保護の範囲には、ブラウザ (SSH クライアント) から SSH サーバーへの接続のみが含まれ、SSH サーバーから対象の Web サイトへの接続は含まれないことに注意してください。

接続の後半部分のセキュリティが完全に保証できない場合、このアプローチは依然として適切なソリューションではありません。

Xプロトコルポート転送例の分析

さて、最後の例として、X プロトコル転送を見てみましょう。

日常業務では、開発やメンテナンスを行うために Linux/Unix/Solaris/HP マシンにリモートでログインすることがよくあります。また、DB2/WebSphere などをインストールするためにグラフィカル インターフェイスを必要とするなど、一部のプログラムを GUI モードで実行する必要があることもよくあります。

これには通常、VNC または X ウィンドウの 2 つのオプションがあります。後者について見てみましょう。

X Window を使用するには通常、X クライアントと X サーバーを個別にインストールする必要があります。

この例では、X クライアントはアクセスされるリモート Linux/Unix/Solaris/HP であり、X サーバーはアクセスを開始するローカル マシン (目の前にあるラップトップやデスクトップなど) です。

X クライアントの X ウィンドウを X サーバー上に表示するには、まず X クライアント上で X サーバーの場所を指定する必要があります。コマンドの形式は次のとおりです。

export DISPLAY=<X Server IP>:<display #>.<virtual #>

例えば:

export DISPLAY=myDesktop:1.0

次に、X アプリケーションを実行すると、ローカル側で X ウィンドウが自動的に開きます。

すべて正常に動作していましたが、IT 部門が突然、リモートの Linux/Unix/Solaris/HP の前にファイアウォールを追加しました。

残念ながら、プロトコル X は許可されたプロトコルのリストに含まれていません。何をするか? VNC が唯一の選択肢ですか?いいえ、実はSSHポート転送を使えばそれが可能で、同時にX通信データも暗号化されるので、まさに一石二鳥です。

(もちろん、この方法を使用する前に、違法な操作を避けるために、関連するセキュリティ規制に準拠しているかどうかを関係する IT 部門に相談することをお勧めします。)

コマンドの確立も非常に簡単です。次のように、ローカル マシン (X サーバー側) から SSH 接続を開始するだけです。

$ ssh -X <SSH Server>

図5. X転送

接続が確立されると、リモート X アプリケーションを直接実行できます。 X 転送を確立した後、DISPLAY 環境変数は自動的に (通常は localhost:10.0 に) 設定されることに注意してください。接続後にこの環境変数を変更する必要はなく、変更すべきでもありません。

一般的なシナリオは、ローカル マシンが Windows オペレーティング システムである場合です。この場合、オープン ソースの XMing を XServer として選択し、任意の SSH クライアントを選択できます。たとえば、PuTTY と Cygwin は、SSH へのアクセス中に X 転送を確立するように構成できます。

パート4 SSHポート転送の概要

これまでに、ローカル ポート転送、リモート ポート転送、動的ポート転送、X 転送の導入が完了しました。

振り返ってみると、一般的な考え方は、TCP 接続を SSH チャネルに転送することで、データの暗号化を解決し、ファイアウォールのさまざまな制限を突破することです。

Telnet/LDAP/SMTP など、既知のポート番号を持つ一部のアプリケーションでは、ローカル ポート転送またはリモート ポート転送を使用して目的を達成できます。

動的ポート転送は、SOCKS プロキシを実装して、Web 閲覧時のファイアウォール制限を暗号化して突破することができます。

X アプリケーションの場合、X 転送が間違いなく最も適しています。各パートを簡単に紹介しましたが、

しかし、これらの技術を柔軟に適用できれば、日常生活や仕事に役立つと信じています。

SSHポート転送に関するその他の記事については、以下の関連記事をクリックしてください。

以下もご興味があるかもしれません:
  • Linux SSHポートを転送する3つの方法
  • イントラネット侵入を実現するためのSSHポート転送
  • SSHリモートログインとポート転送の詳細な説明
  • SSH ポート転送とは何ですか?何の役に立つの?

<<:  JavaScript でフロントエンドのカウントダウン効果を実装する

>>:  MySQL 5.7 で業務を停止せずに従来のレプリケーションを GTID レプリケーションに変更する例

推薦する

サブメニューをクリックする効果を実現するJavaScript

この記事では、クリック時にサブメニューを表示するためのJavaScriptの具体的なコードを参考まで...

xtrabackup による MySQL データベースのバックアップと復元

mysqldump バックアップは、その独自の特性 (テーブルのロック、基本的に挿入スクリプトまたは...

CentOS7.4 起動時の緊急モードへようこそメッセージに対する解決策

今日は仮想マシンを使って実験をしました。システムをインストールし、いくつかのオプションを最適化した後...

HTML の doctype とエンコーディングに関する簡単な説明

文書タイプDoctype は、指示を解析するためにどのバージョンの HTML を使用するかをブラウザ...

VMware pro15 インストール macOS10.13 詳細インストール図(画像とテキスト)

編集者は最近、macOS システムを使い始めたかったので、VMware に macOS イメージ シ...

Docker で Python スクリプトを実行する方法

まず、Docker イメージ用の特定のプロジェクト ディレクトリを作成します。例: mkdir /h...

Vue プロジェクトで SVG コンポーネントをパッケージ化して構成する手順

最近新しい会社に入社しました。プロジェクトに携わった後、タイトルアイコンが svg で作られていると...

ウェブサイトデザインにおいて非常に重要な概念であるdiv+floatの分析

ウェブサイトの構築では、HTML と CSS に関するさまざまな問題に常に遭遇します。ウェブサイト ...

Vueはシンプルなメモ帳機能を実装します

この記事では、参考までに、簡単なメモ帳機能を実装するためのVueの具体的なコードを紹介します。具体的...

シリアルポート使用時のvue-electronの問題解決

エラーは次のとおりです:キャッチされない TypeError: 未定義のプロパティ 'mod...

Xshellの一般的な問題と関連する設定の詳細な説明

この記事では、Xshell と関連する構成の一般的な問題について説明します。この記事の構成は、主に ...

JavaScriptプロトタイプと例の詳細な説明

目次コンストラクタインスタンスとプロトタイプの関係プロトタイププロパティ属性またはメンバーの検索原則...

Dockerコンテナデータをコピーしてバックアップする方法の詳細な説明

ここでは、Jenkins コンテナを例に 3 つの方法を紹介します。方法1コンテナをイメージにパッケ...

MySQL 8.0.12 のインストールと設定のチュートリアル

この記事はMySQL 8.0.12のインストールと設定に関する詳細なチュートリアルを記録しています。...