Como posso configurar uma conexão SSH reversa para o computador de conexão?

19

Vou implantar várias máquinas em um futuro próximo, que estarão por trás dos roteadores. Não será possível configurar o DNS dinâmico em cada roteador e o encaminhamento de portas, então existe uma maneira de configurar essas máquinas para iniciar uma conexão TCP em meu computador e fazer com que meu computador inicie uma conexão SSH com o computador remoto. essa conexão?

IE:

COMPUTER A OPENS TCP CONNECTION TO COMPUTER B
COMPUTER B OPENS SSH CONNECTION OVER THE EXISTING TCP CONNECTION TO COMPUTER A
COMPUTER B NOW HAS SSH CONNECTION TO COMPUTER A

Isso é possível e, em caso afirmativo, como posso fazê-lo?

    
por Naftuli Kay 01.08.2011 / 20:51

1 resposta

20

Em /etc/ssh/sshd para o conjunto Computador B :

AllowTcpForwarding yes
TCPKeepAlive yes

Do Computador A :

$ ssh -R 2222:localhost:22 ip.of.computer.b

De Computador B :

$ ssh localhost -p 2222

Note que 2222 é um número arbitrário de porta alta que eu escolhi. Essa porta no Computador B será então encapsulada através da conexão SSH inicializada no Computador A para a porta 22. Se você tiver várias máquinas, deverá usar uma porta diferente para cada máquina.

Para o seu caso de uso, você provavelmente desejará executá-lo a partir de um script, para que possa torná-lo um daemon e, periodicamente, tentar reconectar-se se o link for eliminado. Você provavelmente desejará uma conta especial com um shell de apenas /bin/true no Computador B para manipular as conexões de entrada. Você pode, então, configurar uma única chave ou várias chaves para cada máquina que tem permissão para "ligar para casa".

Em Computador A , você pode achar as opções -n , -N e -T úteis para desconectá-lo da entrada local (para que ele possa ser executado em segundo plano) e não tentar executar qualquer comando remoto, basta abrir o túnel e não criar um tty.

A maioria dos métodos normais de gerar um daemon não funciona muito bem com a configuração de um túnel de rede como este. Um problema na conectividade de rede faria com que ele tentasse derrubar o muro para passar. Um loop simples com um sono para esperar deve fazer o truque. Dez minutos é um bom número, porque não sobrecarrega a rede e os arquivos de log com tentativas se houver um problema (como o Computador B estar offline), mas ainda assim você fica razoavelmente rápido se a conexão é dropado.

#/bin/sh
while true; do
    sleep $((60*10))
    ssh -nNT -R 2222:localhost:22 ip.of.computer.b
done

Um script como esse pode ser executado no boot /etc/rc.local . Sua primeira mudança para entrar na máquina será iniciada cerca de dez minutos depois que o Computador A for inicializado.

    
por 01.08.2011 / 21:19

Tags