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

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

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

これは、sshLinux、macOS、およびその他のUNIXライクなオペレーティングシステムに含まれているコマンドを使用して実行できます。組み込みの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サーバーにアクセスできssh.youroffice.com、SSHサーバーのユーザーアカウントはbobです。その場合、コマンドは次のようになります。

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

そのコマンドを実行すると、ローカルホストのポート8888でデータベースサーバーにアクセスできるようになります。したがって、データベースサーバーがWebアクセスを提供している場合は、// 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サーバーは「localhost」のポート1234に送信します。これは、SSHサーバー自体を実行しているのと同じPCです。したがって、上記のコマンドの「localhost」は、リモートサーバーの観点からは「localhost」を意味します。

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

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

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

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

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

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

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」オプションを有効にする必要があります。

動的ポート転送: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にある192.168.1.123場合、SOCKSプロキシを使用してアドレスを任意のアプリケーションに接続すると、ホームネットワークにいるかのようにメディアサーバーにアクセスできます。

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

ssh -D local_port [email protected]

たとえば、でSSHサーバーにアクセスでき、SSHサーバーのssh.yourhome.comユーザー名がであるとします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の適切なオプション)で再接続するだけで、トンネルを再度開くことができます。