web-dev-qa-db-ja.com

リバースSSHトンネリングによるHTTPサーバー

HTTPサーバーをホストするLinuxベースのデバイス(Raspberry Piとしましょう)があります。このデバイスはWiFiアクセスポイントを定期的に変更し、NATおよび/またはファイアウォールのために公にアクセスできないことがよくあります。

ブート時にrpi.example.comrpi behind NATへのトンネルを確立するように、公的に利用可能なサーバー(以下のrpi.example.com)を使用してリバースsshトンネルをセットアップしたいと思います。 rpi.example.comは、HTTPリクエストをrpi behind NATに転送します。

シーケンス図:

HTTP client       rpi.example.com     rpi behind NAT
     +                   +                   +
     |                   |       ssh -R      |
     |                   | <-----------------+
     |    GET /temp      |                   |
     +-----------------> |                   |
     |                   +-----------------> |
     |                   |   [SSH tunnel]    |
     |                   | <-----------------|
     |  HTTP/1.1 200 OK  |                   |
     | <-----------------+                   |
     |                   |                   |

そのようなリバースSSHトンネルをセットアップする方法?より良い代替案はありますか?

5
DurandA

VPN(openVPNやstrongswanのようなIPSECソリューションなど)のほうがうまくいくと思います。

-Rスイッチを使用すると、SSHを完全に使用できます。

-R remote_socket:local_socket

指定されたTCPポートまたはリモート(サーバー)ホスト上のUnixソケットへの接続が、ローカル側の指定されたホストおよびポート、またはUnixソケットに転送されることを指定します。これは、 TCPポートまたはリモート側のUnixソケットのいずれかをリッスンするようにソケットを割り当てます。このポートまたはUnixソケットへの接続が行われると、接続は安全なチャネルを介して転送されます。また、ローカルマシンからホストポートhostportまたはlocal_socketへの接続が行われます。

接続を開始し、失敗した場合は再起動するために、Piに何かが必要です。 NATここは関係ありません。トンネルはパブリックホストとPiの間に直接あるためです。ホストでは、実質的にリスナー(たとえば、127.0.0.1:9999)があり、そのリスナーをアップストリームとして使用するようにWebサーバーを構成します。

ほとんどの場合、この転送を作成するための専用ユーザーが必要になります(Piがサーバーに対して認証できる必要があるため、ほとんどの場合、パスワードのない秘密キーが必要になるためです)。また、複数必要な場合は、ポートごとに1つの転送接続を作成する必要があります。

VPNの方が確実に機能する方が簡単であり、基本的に必要なスクリプトが少ないと思います。ただし、どちらの方法でも機能します。

3