Servidor HTTP através de tunelamento ssh reverso

5

Eu tenho um dispositivo baseado em Linux (digamos um Raspberry Pi) que hospeda um servidor HTTP. Este dispositivo altera regularmente o ponto de acesso WiFi e muitas vezes não é acessível publicamente devido a NAT e / ou firewall.

Eu quero configurar um túnel ssh reverso usando um servidor publicamente disponível ( rpi.example.com below) tal que rpi behind NAT estabeleça um túnel para rpi.example.com na inicialização. rpi.example.com encaminhará qualquer solicitação HTTP para o rpi behind NAT .

Diagrama de sequência:

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

Como configurar um túnel SSH reverso assim? Existe uma alternativa melhor?

    
por DurandA 14.03.2017 / 12:30

1 resposta

3

Acho que uma VPN (por exemplo, openVPN ou uma solução IPSEC como strongswan) pode funcionar melhor.

Você pode usar o SSH com a opção -R :

-R remote_socket:local_socket

Specifies that connections to the given TCP port or Unix socket on the remote (server) host are to be forwarded to the given host and port, or Unix socket, on the local side. This works by allocating a socket to listen to either a TCP port or to a Unix socket on the remote side. Whenever a connection is made to this port or Unix socket, the connection is forwarded over the secure channel, and a connection is made to either host port hostport, or local_socket, from the local machine.

Você precisaria apenas de algo no seu Pi para iniciar a conexão e reiniciá-lo se ele falhar. O NAT aqui é irrelevante, porque o túnel seria diretamente entre seu host público e Pi - no seu host, você teria um ouvinte (por exemplo, 127.0.0.1:9999) e configuraria seu servidor da Web para usar esse ouvinte como um a montante.

Provavelmente, você desejaria ter um usuário dedicado para criar este encaminhamento (já que seu Pi precisaria ser capaz de se autenticar em seu servidor, o que quase certamente significa que você precisaria de uma chave privada sem senha). Você também precisaria criar uma conexão encaminhada por porta, se você precisasse de mais de uma.

Eu suspeito que uma VPN seria mais fácil de fazer o trabalho de forma confiável, e exigiria menos scripts, essencialmente. Ambas as abordagens funcionariam, no entanto.

    
por 14.03.2017 / 12:41