SSHトンネリングを使用して制限付きサーバーにアクセスし、安全に参照する方法

公開: 2022-01-29

SSHクライアントはSecureShellサーバーに接続します。これにより、別のコンピューターの前に座っているかのようにターミナルコマンドを実行できます。 ただし、SSHクライアントを使用すると、ローカルシステムとリモートSSHサーバー間のポートを「トンネリング」することもできます。

SSHトンネリングには3つの異なるタイプがあり、それらはすべて異なる目的で使用されます。 それぞれ、SSHサーバーを使用してトラフィックを1つのネットワークポートから別のネットワークポートにリダイレクトする必要があります。 トラフィックは暗号化されたSSH接続を介して送信されるため、転送中に監視または変更することはできません。

これは、Linux、macOS、およびその他のUNIXライクなオペレーティングシステムに含まれているsshコマンドを使用して行うことができ、設定を保存するためのssh構成ファイルを作成できます。 組み込みのsshコマンドが含まれていないWindowsでは、SSHサーバーに接続するための無料のツールPuTTYをお勧めします。 SSHトンネリングもサポートしています。

ローカルポートフォワーディング:ローカルシステムでリモートリソースにアクセスできるようにする

「ローカルポートフォワーディング」を使用すると、インターネットに公開されていないローカルネットワークリソースにアクセスできます。 たとえば、自宅からオフィスのデータベースサーバーにアクセスするとします。 セキュリティ上の理由から、そのデータベースサーバーはローカルオフィスネットワークからの接続のみを受け入れるように構成されています。 ただし、オフィスでSSHサーバーにアクセスでき、そのSSHサーバーがオフィスネットワークの外部からの接続を許可している場合は、自宅からそのSSHサーバーに接続して、オフィスにいるかのようにデータベースサーバーにアクセスできます。 さまざまな異なるネットワークリソースを保護するよりも、単一のSSHサーバーを攻撃から保護する方が簡単であるため、これはよくあることです。

これを行うには、SSHサーバーとのSSH接続を確立し、ローカルPCの特定のポート(ポート1234など)からデータベースのサーバーのアドレスとオフィスネットワーク上のポートにトラフィックを転送するようにクライアントに指示します。 したがって、現在のPC「localhost」のポート1234でデータベースサーバーにアクセスしようとすると、そのトラフィックはSSH接続を介して自動的に「トンネリング」され、データベースサーバーに送信されます。 SSHサーバーは中央に配置され、トラフィックを前後に転送します。 任意のコマンドラインまたはグラフィカルツールを使用して、ローカルPCで実行されているかのようにデータベースサーバーにアクセスできます。

広告

ローカル転送を使用するには、SSHサーバーに通常どおり接続しますが、 -L引数も指定します。 構文は次のとおりです。

 ssh -L local_port:remote_address:remote_port [email protected]

たとえば、オフィスのデータベースサーバーがオフィスネットワークの192.168.1.111にあるとします。 ssh.youroffice.comでオフィスのSSHサーバーにアクセスでき、SSHサーバーのユーザーアカウントはbobです。 その場合、コマンドは次のようになります。

 ssh -L 8888:192.168.1.111:1234 [email protected]

そのコマンドを実行すると、ローカルホストのポート8888でデータベースサーバーにアクセスできるようになります。 したがって、データベースサーバーがWebアクセスを提供している場合は、http:// localhost:8888をWebブラウザに接続してアクセスできます。 データベースのネットワークアドレスを必要とするコマンドラインツールがある場合は、localhost:8888を指定します。 PCのポート8888に送信されるすべてのトラフィックは、オフィスネットワークの192.168.1.111:1234にトンネリングされます。

SSHサーバー自体と同じシステムで実行されているサーバーアプリケーションに接続する場合は、もう少し混乱します。 たとえば、オフィスコンピュータのポート22でSSHサーバーを実行しているが、同じアドレスの同じシステムのポート1234でデータベースサーバーを実行しているとします。 自宅からデータベースサーバーにアクセスしたいのですが、システムはポート22でのみSSH接続を受け入れており、そのファイアウォールは他の外部接続を許可していません。

この場合、次のようなコマンドを実行できます。

 ssh -L 8888:localhost:1234 [email protected]

現在のPCのポート8888でデータベースサーバーにアクセスしようとすると、トラフィックはSSH接続を介して送信されます。 SSHサーバーを実行しているシステムに到着すると、SSHサーバーはSSHサーバー自体を実行しているのと同じPCである「localhost」のポート1234に送信します。 したがって、上記のコマンドの「localhost」は、リモートサーバーの観点からは「localhost」を意味します。

広告

WindowsのPuTTYアプリケーションでこれを行うには、[接続]> [SSH]> [トンネル]を選択します。 「ローカル」オプションを選択します。 「送信元ポート」には、ローカルポートを入力します。 「宛先」には、宛先アドレスとポートをremote_address:remote_portの形式で入力します。

たとえば、上記と同じSSHトンネルを設定する場合は、送信元ポートとして8888を入力し、宛先としてlocalhost:1234を入力します。 その後、「追加」をクリックし、「開く」をクリックしてSSH接続を開きます。 もちろん、接続する前に、メインの「セッション」画面でSSHサーバー自体のアドレスとポートを入力する必要があります。

関連: SSHエージェント転送とは何ですか?どのように使用しますか?

リモートポートフォワーディング:リモートシステムでローカルリソースにアクセスできるようにする

「リモートポートフォワーディング」はローカルフォワーディングの反対であり、それほど頻繁には使用されません。 これにより、ローカルPC上のリソースをSSHサーバーで使用できるようにすることができます。 たとえば、前に座っているローカルPCでWebサーバーを実行しているとします。 ただし、PCは、サーバーソフトウェアへの着信トラフィックを許可しないファイアウォールの背後にあります。

リモートSSHサーバーにアクセスできると仮定すると、そのSSHサーバーに接続して、リモートポート転送を使用できます。 SSHクライアントは、SSHサーバーの特定のポート(たとえば、ポート1234)を現在のPCまたはローカルネットワークの特定のアドレスとポートに転送するようにサーバーに指示します。 誰かがSSHサーバーのポート1234にアクセスすると、そのトラフィックはSSH接続を介して自動的に「トンネリング」されます。 SSHサーバーにアクセスできる人は誰でも、PCで実行されているWebサーバーにアクセスできます。 これは事実上、ファイアウォールをトンネリングする方法です。

リモート転送を使用するには、 -R引数を指定してsshコマンドを使用します。 構文は、ローカル転送の場合とほぼ同じです。

 ssh -R remote_port:local_address:local_port [email protected]

ローカルPCのポート1234でリッスンしているサーバーアプリケーションを、リモートSSHサーバーのポート8888で使用できるようにしたいとします。 SSHサーバーのアドレスはssh.youroffice.comで、SSHサーバーのユーザー名はbobです。 次のコマンドを実行します。

 ssh -R 8888:localhost:1234 [email protected]
広告

次に、誰かがポート8888でSSHサーバーに接続すると、その接続は、接続を確立したローカルPCのポート1234で実行されているサーバーアプリケーションにトンネリングされます。

WindowsのPuTTYでこれを行うには、[接続]> [SSH]> [トンネル]を選択します。 「リモート」オプションを選択します。 「送信元ポート」には、リモートポートを入力します。 「宛先」には、宛先アドレスとポートをlocal_address:local_portの形式で入力します。

たとえば、上記の例を設定する場合は、送信元ポートとして8888を入力し、宛先としてlocalhost:1234を入力します。 その後、「追加」をクリックし、「開く」をクリックしてSSH接続を開きます。 もちろん、接続する前に、メインの「セッション」画面でSSHサーバー自体のアドレスとポートを入力する必要があります。

その後、SSHサーバーのポート8888に接続すると、トラフィックがローカルシステムのポート1234にトンネリングされます。

デフォルトでは、リモートSSHサーバーは同じホストからの接続のみをリッスンします。 つまり、SSHサーバー自体と同じシステム上のユーザーのみが接続できます。 これはセキュリティ上の理由によるものです。 この動作をオーバーライドする場合は、リモートSSHサーバーのsshd_configで「GatewayPorts」オプションを有効にする必要があります。

関連: WindowsおよびLinuxでSSH構成ファイルを管理する方法

動的ポート転送:SSHサーバーをプロキシとして使用する

関連: VPNとプロキシの違いは何ですか?

プロキシやVPNと同様に機能する「動的ポート転送」もあります。 SSHクライアントは、使用するアプリケーションを構成できるSOCKSプロキシを作成します。 プロキシを介して送信されるすべてのトラフィックは、SSHサーバーを介して送信されます。 これはローカル転送に似ています。PCの特定のポートに送信されたローカルトラフィックを取得し、SSH接続を介してリモートの場所に送信します。

関連:暗号化されたWebサイトにアクセスしている場合でも、パブリックWi-Fiネットワークの使用が危険な場合がある理由

たとえば、パブリックWi-Fiネットワークを使用しているとします。 詮索されることなく安全に閲覧したい。 自宅でSSHサーバーにアクセスできる場合は、SSHサーバーに接続して、動的ポート転送を使用できます。 SSHクライアントは、PC上にSOCKSプロキシを作成します。 そのプロキシに送信されるすべてのトラフィックは、SSHサーバー接続を介して送信されます。 パブリックWi-Fiネットワークを監視している人は、ブラウジングを監視したり、アクセスできるWebサイトを検閲したりすることはできません。 アクセスするWebサイトから見ると、自宅のPCの前に座っているように見えます。 これは、米国外でこのトリックを使用して米国のみのWebサイトにアクセスできることも意味します。もちろん、米国内のSSHサーバーにアクセスできると仮定します。

広告

別の例として、ホームネットワーク上にあるメディアサーバーアプリケーションにアクセスしたい場合があります。 セキュリティ上の理由から、SSHサーバーのみがインターネットに公開されている場合があります。 インターネットからメディアサーバーアプリケーションへの着信接続を許可しません。 動的ポート転送を設定し、SOCKSプロキシを使用するようにWebブラウザーを構成してから、自宅のSSHシステムの前に座っているかのように、Webブラウザーを介してホームネットワークで実行されているサーバーにアクセスできます。 たとえば、メディアサーバーがホームネットワークのポート192.168.1.123にある場合、SOCKSプロキシを使用してアドレス192.168.1.123を任意のアプリケーションに接続すると、ホームネットワークにいるかのようにメディアサーバーにアクセスできます。 。

動的転送を使用するには、次のように-D引数を指定してsshコマンドを実行します。

 ssh -D local_port [email protected]

たとえば、 ssh.yourhome.comでSSHサーバーにアクセスでき、SSHサーバーのユーザー名がbobであるとします。 動的転送を使用して、現在のPCのポート8888でSOCKSプロキシを開く必要があります。 次のコマンドを実行します。

 ssh -D 8888 [email protected]

次に、ローカルIPアドレス(127.0.01)とポート8888を使用するようにWebブラウザーまたは別のアプリケーションを構成できます。そのアプリケーションからのすべてのトラフィックは、トンネルを介してリダイレクトされます。

WindowsのPuTTYでこれを行うには、[接続]> [SSH]> [トンネル]を選択します。 「動的」オプションを選択します。 「送信元ポート」には、ローカルポートを入力します。

広告

たとえば、ポート8888でSOCKSプロキシを作成する場合は、送信元ポートとして8888と入力します。 その後、「追加」をクリックし、「開く」をクリックしてSSH接続を開きます。 もちろん、接続する前に、メインの「セッション」画面でSSHサーバー自体のアドレスとポートを入力する必要があります。

次に、ローカルPC上のSOCKSプロキシ(つまり、ローカルPCを指すIPアドレス127.0.0.1)にアクセスするようにアプリケーションを構成し、正しいポートを指定できます。

関連: Firefoxでプロキシサーバーを構成する方法

たとえば、SOCKSプロキシを使用するようにFirefoxを設定できます。 Firefoxは独自のプロキシ設定を持つことができ、システム全体のプロキシ設定を使用する必要がないため、これは特に便利です。 FirefoxはSSHトンネルを介してトラフィックを送信しますが、他のアプリケーションは通常どおりインターネット接続を使用します。

Firefoxでこれを行う場合は、「手動プロキシ設定」を選択し、SOCKSホストボックスに「127.0.0.1」と入力し、「ポート」ボックスに動的ポートを入力します。 [HTTPプロキシ]、[SSLプロキシ]、および[FTPプロキシ]ボックスは空のままにします。

SSHセッション接続が開いている限り、トンネルはアクティブで開いたままになります。 SSHセッションを終了してサーバーから切断すると、トンネルも閉じられます。 適切なコマンド(またはPuTTYの適切なオプション)で再接続するだけで、トンネルを再度開くことができます。

関連:開発者と愛好家のための最高のLinuxラップトップ