ウェブサイト検索

SSH トンネル: 安全なリモート アクセスとポート転送


SSH は、暗号化された接続により、リモート ホストにアクセスし、安全でないネットワーク上でデータを安全に転送できるようにする通信プロトコルです。 SSH トンネリング技術を使用すると、ファイアウォールの制限をバイパスして、ローカル マシンとの間で TCP トラフィックを転送できます。このチュートリアルでは、ローカル SSH トンネルとリモート SSH トンネルの違いと、それらの作成方法を学びます。

このチュートリアルでは次のことを学びます:

  • ローカル SSH トンネルとリモート SSH トンネルの違いは何ですか
  • ローカルおよびリモートの SSH トンネルを作成する方法

ローカル SSH トンネルの作成

ローカル SSH トンネルを使用すると、 ローカル マシン上の特定の TCP ポートからのあらゆるトラフィックを、 特定のリモート ホスト アドレスとポートに転送できます。これは、ネットワークからは直接アクセスできないが、別のマシンからはアクセスできるサービスにアクセスしたい場合に便利です。以下に例を示します。外部ネットワークからはアクセスできず、そのプライベート ネットワーク内の他のホストからのみアクセスできるマシン上で実行されている Apache サーバー インスタンスがあるとします。このマシンのローカル IP は 192.168.1.6 です。その上で、Apache Web サーバーはポート 80 でリッスンしています。

インターネット経由でマシンに直接アクセスすることはできませんが、同じプライベート ネットワーク内にある別のマシンへの SSH 接続を確立でき、serverone.mydomain.com FQDN を使用して外部からアクセスできます。

ローカル SSH トンネルを作成すると、Apache が自分のマシン上で実行され、ポート 8000 でリッスンしているかのように、リモート マシン上の Apache によって提供される Web ページにアクセスできます。ローカル トンネルを作成するには、-L オプションを指定して ssh クライアントを呼び出し、次の構文を使用してホスト マッピングを引数として渡します。

[local-address]:local-port:remote-address:remote-port

ローカル アドレスはオプションです。ローカル アドレスを指定しない場合、転送されたポートはすべてのインターフェイスで使用可能になります。この場合は明示的に 192.168.0.39 を使用します。トンネルを作成するには、次のコマンドを実行します。

$ ssh -N -L 192.168.0.39:8000:192.168.1.6:80 user@serverone.mydomain.com

上記のコマンドで -N オプションを使用していることがわかります。これは、コマンドを実行したくないが、リモート サーバーとの接続を確立したいだけであることを指定するために必要です。接続が確立されると、Web ブラウザを開いて http://192.168.0.39:8000 に移動することで、リモート プライベート サーバー上の Apache によって提供されるコンテンツにアクセスできるようになります。

リモート SSH トンネルの作成

リモート、つまり「リバース」SSH トンネルは、ローカル トンネルの逆方向に機能します。リモート SSH トンネルを使用すると、 特定のリモート アドレスと TCP ポートへの接続をローカル ホストとポートに転送するように指定できます。リモート SSH トンネルを作成する必要があるのはどのような状況ですか?

Web サイトを開発しているので、ノートブック上で実行されている Apache Web サーバーのインスタンスがあり、ポート 80 をリッスンしているとします。私たちのマシンのローカル IP アドレスは、再度、192.168.0.39 です。マシンは NAT ファイアウォールの内側にあるため、外部からアクセスできません。それにもかかわらず、私たちはサービスを直接公開することなく、プロジェクトがどのように進化しているかをサードパーティに見せられるようにしたいと考えています。どうすれば目標を達成できるでしょうか? リモート SSH トンネルを作成できました。

SSH 経由でパブリックにアクセス可能なサーバーに接続します。このサーバーは、ポート 22 のほかに、ポート 8888 も外部に公開します。リモート SSH トンネルを使用すると、そのポートで発生するすべての TCP トラフィックがマシン上のポート 80 に転送されます。これは、ローカル Apache Web サーバーがリッスンしているポートです。サードパーティのクライアントは、http://serverone.mydomain.com:8888 のローカル Web サーバー インスタンスによって提供されるページを表示できます。

外部クライアントが SSH 経由で転送されたポートにアクセスできるようにしたいため、トンネルが機能するには、SSH サーバー構成で GatewayPorts オプションが「yes」に設定されていることを確認する必要があります。このディレクティブは通常、/etc/ssh/sshd_config ファイルの 88 行目にコメント化されています。

#AllowTcpForwarding yes
GatewayPorts yes
#X11Forwarding no

変更を有効にするには、ssh サービスを再起動する必要があります。

$ sudo systemctl restart sshd

ここで、リモート SSH トンネルを作成するために、ローカル マシンで -R オプションを指定して ssh を実行し、ホストとポートのマッピングを渡します。

[remote-address]remote-port:local-address:local-port

ここで、「remote-address 」と「remote-port 」はそれぞれ、クライアントがサービスにアクセスできるアドレスとポートであり、「local-address 」と「local-port 」はローカル アドレスとサーバーがリッスンしているポート。リモート トンネルを作成するには、次のコマンドを実行します。

$ ssh -N -R serverone.mydomain.com:8888:192.168.0.39:80 user@serverone.mydomain.com

最後に

このチュートリアルでは、ローカル SSH トンネルとリモート SSH トンネルの違いを学び、Linux 上で SSH トンネルを作成する方法を説明しました。ローカル トンネルは、インターネット経由で直接アクセスできないサービスにアクセスする場合に役立ちます。代わりにリモート トンネルを使用すると、ローカル マシンが NAT ファイアウォールの内側にある場合でも、他の人がそのローカル マシンで実行されているサービスにアクセスできるようになります。

関連記事: