Como posso configurar tal que sempre posso SSH para o meu sistema através da internet em um IP dinâmico?

10
Basicamente eu quero ser capaz de fazer algo como teamviewer, onde independente da configuração da rede, desde que meu servidor ssh (Máquina A) e o cliente ssh (Máquina B) tenham acesso à internet (e algum terceiro servidor , Máquina C), eu posso obter acesso - a razão para isso é que eu quero ser capaz de mover a máquina A, ligá-la à energia, conectá-la automaticamente a uma das várias redes Wi-Fi pré-configuradas (cada uma delas é única). / diferente), sem ter configurado o encaminhamento de porta ou similar nas redes, e poder logar através da Internet a partir da Máquina B

Como posso conseguir isso? Eu não me importo de configurar algo em um servidor com um endereço IP estático para ajudar com o handshake, mas eu também não me importo com um servidor de terceiros, se algo já existe (como acontece para, por exemplo, teamviewer)

edite para maior clareza: tenho 3 máquinas, A B e C

A é um raspberry sem cabeça pi que será ligado / desligado em locais aleatórios, conecte-se a uma rede Wi-Fi pré-configurada

B é a máquina com um monitor adequado, teclado, etc. que eu quero conectar de

C é um servidor AWS alugado que possuo com um endereço IP estático, pode ser SSH de forma confiável a partir de B e pode instalar o que for necessário para ajudar B a se conectar a A

    
por user2813274 27.09.2015 / 17:16

5 respostas

11

Como você tem a máquina C na Internet, crie uma conta especial chamada sesame e em A você cria uma conta com uma chave pública / privada da qual você copiou a chave pública para a conta sesame em C.

Agora você pode fazer login de A para C, mas em vez de fazer isso, faça o seguinte:

ssh -N -R 19930:localhost:22 sesame@yourserverC

(você pode querer combinar isso com uma instrução de suspensão ou, por exemplo, 10 segundos e envolvê-lo em um loop infinito para que a conexão seja restabelecida se o WiFi down causar a quebra)

Da máquina B, normalmente faça o login em qualquer conta que você tiver em C (pode ser, mas não precisa ser a conta sesame , diferentes contas são o que eu uso). E quando você estiver em C, faça o login para A usando:

ssh localhost -p 19930

É claro que você pode usar um número diferente de 19930.

É possível executar o ssh -N -R ... de /etc/rc.local se a sua chave privada em A não estiver protegida por senha. Nesse caso, certifique-se de tornar sesame uma conta separada com funcionalidade limitada, para que, quando sua máquina A for comprometida / roubada, o risco para seu servidor C seja limitado. É também por isso que recomendo usar uma conta separada para ir de B para C.

Você pode realmente definir o shell de login para sesame em /etc/passwd para /bin/false , para que você não possa mais usar a conta para fazer login.

    
por 27.09.2015 / 17:51
7

Instale um túnel IPv6 (como o Sixxs ) no seu Raspberry Pi. Agora você terá um endereço IPv6 estático permanente que ficará on-line sempre que seu Pi estiver on-line. Certifique-se de proteger seu Pi como ele está conectado ao mundo agora.

Se o seu B estiver conectado a uma rede IPv6, conecte-se diretamente ao Pi. Se B não estiver conectado a uma rede IPv6, use C como um servidor de salto, onde você se conecta por meio de IPv4 a C e, em seguida, ssh por IPv6 de C a seu Pi.

    
por 27.09.2015 / 18:00
1

Veja também:

A tecnologia usada é a mesma descrita na resposta aceita, mas usa alguns scripts para automatizar as coisas e tornar a solução mais genérica. Ele também faz todas as configurações dentro de um contêiner Docker, de forma que o sistema principal fique seguro caso algo seja comprometido.

No entanto, não fornece conexão automática de A para C, ele deve ser iniciado manualmente. Talvez você possa personalizar a solução um pouco para que ela faça exatamente o que você deseja.

    
por 07.10.2015 / 19:44
0

Talvez você precise usar diferente de ssh ou conceito de tunelamento. Sugiro que você use o conceito de mensagens como whatsapp ou telegrama. Mas eu acho que, se você quiser usar algo como vim, não é tão bom quanto ssh.

O telegrama tem o cliente telegrama-cli que você pode modificar para aceitar e executar determinado comando e implementá-lo no raspi.

Se você usar Telegram você pode simplificar sua rede e pelo menos reduzir a máquina C para fazer o Hub porque o servidor C é subtitulado com o servidor de mensagens de telegramas .. telegrama já vem com o iPhone e o cliente android então eu não acho que você precisa de sua máquina B também, você pode instalar o cliente de telegrama para o SO específico, se você quiser ... segurança? mensagem telegrama é encripted .. Se alguém quiser ddos seu raspi? eles vão ddos o servidor telegrama primeiro ..

Assim, desde que o seu raspi possa se conectar ao servidor de telegramas (basta que o seu raspi se conecte à internet), mesmo que o raspi esteja por trás do firewall / proxy / IP privado / IP dinâmico, você pode fazer o controle remoto.

Com este conceito, você pode fazer o controle remoto em qualquer lugar, a qualquer hora.

    
por 28.09.2015 / 09:43
0

Eu acho que você deveria dar uma olhada no redirecionamento reverso de porta ssh. Em suma, você primeiro inicia um ssh de A para C usando a sintaxe abaixo e então usa essa porta para fazer o tunelamento de C para A. Você não vai atingir o firewall de casa de A quando fizer isso porque o R-Pi já possui um túnel.

ssh -R 2210: localhost: 22 myCoolAwsSite.com

Por favor, considere as ramificações de segurança quando você faz isso. Você pode adicionar algum jujitsu cron para que a conexão seja restabelecida após uma reinicialização.

    
por 30.09.2015 / 10:26