Se você precisa acessar um computador Linux inacessível via SSH, existe uma solução engenhosa: fazer com que ele “ligue” para você e, em seguida, use essa conexão para estabelecer sua própria sessão SSH remota. Vamos explorar como isso é possível.
Quando o Túnel SSH Reverso é Necessário
Às vezes, alcançar computadores remotos pode ser um desafio. Restrições de firewall ou configurações complexas de Tradução de Endereço de Rede podem dificultar o acesso. Como, então, você pode se conectar a esse computador se for necessário?
Para facilitar o entendimento, vamos definir alguns termos. Seu computador será chamado de “computador local” e o computador que você deseja acessar será chamado de “computador remoto”.
Neste artigo, o computador remoto, chamado de “wdzwdz”, utiliza o Ubuntu Linux, com janelas de terminal na cor roxa. Já o computador local, chamado de “Sulaco”, roda o Manjaro Linux, com janelas de terminal amarelas.
Normalmente, você iniciaria uma conexão SSH do computador local para o computador remoto. No entanto, esse cenário de rede impede essa abordagem. A complexidade da rede torna o SSH direto inviável. Este método é útil sempre que o acesso SSH direto ao computador remoto não é possível.
Se a sua configuração de rede permitir, o computador remoto pode se conectar ao seu. Embora isso não seja suficiente para criar uma sessão de linha de comando no computador remoto, é um primeiro passo. Uma conexão foi estabelecida entre os dois computadores.
A solução está no tunelamento SSH reverso.
O que é Tunelamento SSH Reverso?
O tunelamento SSH reverso permite que você utilize a conexão estabelecida para criar uma nova conexão do seu computador local para o computador remoto.
Como a conexão original foi do computador remoto para você, usá-la para ir na direção oposta é “invertê-la”. E como o SSH é seguro, você está criando uma conexão segura dentro de outra conexão segura. Essa nova conexão com o computador remoto age como um túnel privado dentro da conexão original.
É assim que surgiu o nome “tunelamento SSH reverso”.
Como Funciona?
O tunelamento SSH reverso depende do computador remoto utilizar a conexão existente para aguardar novas solicitações de conexão do computador local.
O computador remoto fica escutando em uma porta de rede no computador local. Se detectar uma solicitação SSH para essa porta, ela a retransmitirá de volta para si mesma através da conexão estabelecida. Isso cria uma nova conexão do computador local para o computador remoto.
A configuração é mais simples do que a explicação.
Utilizando o Tunelamento SSH Reverso
O SSH já deve estar instalado no seu computador Linux, mas talvez seja necessário iniciar o daemon SSH (sshd) se o seu computador local nunca aceitou conexões SSH antes.
sudo systemctl start sshd
Para que o daemon SSH seja iniciado automaticamente sempre que você reiniciar o computador, execute este comando:
sudo systemctl enable sshd
No computador remoto, utilize o seguinte comando:
A opção -R (reverso) indica ao SSH que novas sessões SSH devem ser criadas no computador remoto.
O “43022:localhost:22” diz ao SSH que as solicitações de conexão para a porta 43022 no computador local devem ser redirecionadas para a porta 22 no computador remoto. A porta 43022 foi escolhida por estar listada como não alocada. Não é um número especial.
[email protected] é a conta de usuário que o computador remoto usará para se conectar ao computador local.
ssh -R 43022:localhost:22 [email protected]
Pode surgir um aviso informando que você nunca se conectou ao computador local antes, ou um aviso quando os detalhes da conexão forem adicionados à lista de hosts SSH conhecidos. O que você verá, se houver algum aviso, depende se já foram feitas conexões do computador remoto para o computador local.
A senha da conta que você está usando para se conectar ao computador local será solicitada.
Observe que, quando a conexão for estabelecida, o prompt de comando mudará de [email protected] para [email protected]
Agora estamos conectados ao computador local a partir do computador remoto, o que significa que podemos executar comandos nele. Vamos usar o comando who para visualizar os logins no computador local.
who
Podemos ver que o usuário “dave” está conectado ao computador local e que o computador remoto também se conectou (usando as mesmas credenciais de usuário) a partir do endereço IP 192.168.4.25.
Conectando ao Computador Remoto
Como a conexão do computador remoto foi bem-sucedida e está escutando conexões, podemos tentar nos conectar ao computador remoto a partir do local.
O computador remoto está ouvindo na porta 43022 no computador local. Portanto, de forma um pouco contraintuitiva, para nos conectarmos ao computador remoto, solicitamos ao SSH que se conecte ao computador local na porta 43022. Essa solicitação de conexão será encaminhada ao computador remoto.
ssh localhost -p 43022
Será solicitado que você forneça a senha da conta de usuário. Após isso, você estará conectado ao computador remoto a partir do computador local. Seu computador Manjaro exibirá a mensagem “Bem-vindo ao Ubuntu 18.04.2 LTS”.
Observe que o prompt de comando mudou de [email protected] para [email protected]. Atingimos nosso objetivo de estabelecer uma conexão SSH com nosso computador remoto de difícil acesso.
Usando SSH com Chaves
Para tornar mais conveniente a conexão do computador remoto ao computador local, podemos configurar chaves SSH.
No computador remoto, digite este comando:
ssh-keygen
Será solicitada uma senha complexa (passphrase). Você pode simplesmente pressionar Enter para ignorar as perguntas sobre a senha, mas isso não é recomendado. Significa que qualquer pessoa no computador remoto poderia estabelecer uma conexão SSH com o seu computador local sem ter que digitar uma senha.
Uma senha robusta seria composta de três ou quatro palavras separadas por símbolos.
Suas chaves SSH serão geradas.
Precisamos transferir a chave pública para o computador local. Use este comando:
ssh-copy-id [email protected]
A senha da conta de usuário que você está usando para fazer o login será solicitada, neste caso, [email protected]
Na primeira vez que você enviar uma solicitação de conexão do computador remoto para o computador local, você precisará fornecer a senha complexa (passphrase). Não será necessário digitá-la novamente para futuras solicitações de conexão, enquanto a janela do terminal permanecer aberta.
Nem Todos os Túneis são Assustadores
Alguns túneis podem ser escuros e sinuosos, mas o tunelamento SSH reverso não é tão difícil de entender se você consegue manter a relação entre o computador remoto e o computador local bem clara. Basta lembrar de inverter a ordem.