Como posso configurar de forma que eu possa sempre fazer o SSH no meu sistema pela Internet em um IP dinâmico?

11

Basicamente, eu quero poder fazer algo como o teamviewer, onde, independentemente da configuração da rede, desde que meu servidor ssh (Máquina A) e cliente ssh (Máquina B) tenham acesso à Internet (e algum terceiro servidor, Máquina C) ), Posso obter acesso - o motivo é que quero poder mover a máquina A, conectá-la à energia, conectá-la automaticamente a uma das várias redes wifi pré-configuradas (cada uma única / diferente) , sem ter configurado o encaminhamento de porta ou similar nas redes e poder fazer login nela pela Internet a partir da Máquina B

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

editar para maior clareza: tenho 3 máquinas, AB e C

A é um pi framboesa decapitado que será ligado / desligado em locais aleatórios, conecte-se a uma rede wifi pré-configurada

B é a máquina com um monitor, teclado, etc. adequados, dos quais quero conectar

C é um servidor AWS alugado que possuo com um endereço IP estático, pode fazer 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

user2813274
fonte
Você pode ssh na 3ª máquina?
Anthon
@Anthon Eu acho que sim, eu re-nomeou-AB e C e descrições adicionados para eles, espero que resolve isso
user2813274
tosse no-ip.com tosse
Joshua
1
no-ip.com não ajudará se o firewall de perímetro no seu local não permitir tráfego de retorno!
bobstro
Eu costumava usar sshtúneis, muito brevemente. Eu nunca consegui que eles ficassem acordados, mesmo com autossh; se o uplink caísse por qualquer motivo, eles sempre teriam que ser reiniciados manualmente. Eventualmente, configurei uma pequena VPN para mim com o OpenVPN, e ele fez o trabalho bem.
Blacklight Shining

Respostas:

11

Como você possui a máquina C na Internet, crie uma conta especial com o nome lá sesamee, em A, crie uma conta com uma chave pública / privada da qual copiou a chave pública para a sesameconta em C.

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

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

(você pode combinar isso com uma declaração de suspensão ou, por exemplo, 10 segundos e envolvê-la em um loop sem fim, para que a conexão seja restabelecida se o Wi-Fi desativado fizer com que ela se quebre)

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

ssh localhost -p 19930

Obviamente, você pode usar um número diferente de 19930.

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

Você pode realmente definir o shell de login para sesamenos /etc/passwdpara /bin/false, então você não pode usar a conta de login.

Anthon
fonte
Essa solução é diferente de usar o TeamViewer. Lá, o servidor é usado para abrir as portas que são redirecionadas para se comunicar diretamente. Assim como programas como o BitTorrent se comunicam diretamente depois de encontrar máquinas para fazer o download (sem a necessidade de abrir as portas com antecedência).
Anthon
Portanto, a principal diferença é que dessa forma, TODO o tráfego passa pelo servidor C, vs C sendo usado apenas para estabelecer um link e depois não sendo usado para o restante da conexão - eu estou bem com isso. Você tem um bom argumento no que diz respeito à segurança; há algo que devo fazer em particular para tornar o gergelim incapaz de fazer qualquer coisa em C, além do mínimo de logon? (RHEL system)
user2813274
1
@ user2813274 De fato, todo o tráfego passa por C nesse cenário (o que tiraria a utilidade do BitTorrent). Não sei até que ponto você pode limitar a sesameconta em C; pode ser que seja possível executá-la /bin/falsecomo shell de logon (já que o ssh nunca efetua login) ou limitá-la adicionando um command=parâmetro em~/.ssh/authorized_keys
Anthon
@ user2813274 Caso ainda não tenha tentado: se você possui uma conta especial para configurar o proxy reverso, pode desativar os logins nessa conta alterando o shell de login para /bin/false.
Anthon
1
@ user2813274 Sim eu tentei isso e ele me deixou configurar o túnel reverso (você precisa de uma conta diferente para chegar ao servidor C para fazer o ssh localhost -p portnumclaro)
Anthon
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á online sempre que seu Pi estiver online. 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, em que você se conecta por IPv4 a C e, em seguida, ssh por IPv6 de C a seu Pi.

garethTheRed
fonte
Eu gosto disso, pois nem sequer exige C se as redes suportam IPV6, mas terei que experimentá-lo - algum problema quanto aos firewalls que bloqueiam isso por padrão?
User2813274
1
O Sixxs fornece mais de um protocolo para o encapsulamento do IPv6. Se você usar qualquer coisa (AYIYA), precisará das portas TCP 3874 e UDP 5072 abertas do Pi para a Internet. Nas redes domésticas, isso deve ser bom; as redes corporativas ou do campus podem ser diferentes.
garethTheRed
A instalação do túnel parecia factível, mas parece que eu precisaria me inscrever no serviço Sixxs, esperar que eles retornassem para mim com um endereço IP etc. - não tão simples assim - ainda potencialmente uma boa solução, mas eu não pense que é o caminho que eu vou seguir agora.
user2813274
1

Também dê uma olhada nisso:

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 as configurações completas dentro de um contêiner do Docker, para que o sistema principal esteja seguro caso algo seja comprometido.

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

dashohoxha
fonte
0

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

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

Se você usa o Telegram, pode simplificar sua rede e, pelo menos, reduzir a máquina C para executar o Hub, porque o servidor C está legendado com o servidor de mensagens de telegrama. Máquina também, você pode instalar o cliente de telegrama para um sistema operacional específico, se quiser .. segurança? a mensagem de telegrama está criptografada. Se alguém quiser fazer o ddo do seu raspi? eles ddos ​​o servidor de telegrama primeiro ..

Desde que o seu raspi possa se conectar ao servidor de telegrama (simplesmente seu raspi se conecte à Internet), mesmo que o raspi esteja protegido por firewall / proxy / IP privado / IP dinâmico / dinâmico, você sempre poderá fazer o controle remoto.

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

Wicaksono Trihatmaja
fonte
Wat. Isso é inseguro, você está confiando em algum aplicativo de mensagens aleatórias, está dizendo que o OP deve modificar o aplicativo de mensagens aleatórias para fazê-lo funcionar. Isso não é nem perceber que o aplicativo de mensagens aleatórias quebraria completamente algo como o vim e teria uma latência horrível.
Outro usuário
Bem, se você usá-lo apenas para enviar comandos eu acho que é ok .. se você usá-lo para algo como vim, eu não acho que é bom .. bons conselhos .. eu vou editar a minha resposta
Wicaksono Trihatmaja
Eu não acho que isso é o que eu quero, quero acesso total ao shell, nada realmente menos do que isso - no que diz respeito à distribuição do Pi. Não estou realmente preocupado, antes de mais nada, porque preciso fazer uma configuração especial para até mesmo se conectar a ele mesmo, segundo porque é conexões será intermitente e, aleatoriamente, mudando de qualquer maneira
user2813274
0

Eu acho que você deve dar uma olhada no encaminhamento de porta ssh reversa. Em poucas palavras, você primeiro inicia um ssh de A para C usando a sintaxe abaixo e depois usa essa porta para voltar de C para A. Você não atingirá o firewall doméstico de A quando fizer isso porque o R-Pi já possui um tunel.

ssh -R 2210: localhost: 22 myCoolAwsSite.com

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

Hopping Bunny
fonte
Err ... como isso é diferente da resposta de Anthon?
user2813274