Como um túnel SSH reverso “desconectado”, mas ainda conectado, pode ser captado novamente?

0

Eu tenho um computador Raspberry Pi remoto que se conecta por trás de seu firewall restritivo ao meu servidor pelo túnel SSH reverso. Imagine que esse Raspberry Pi esteja no telhado de difícil acesso de um prédio em outro país (talvez enquanto uma tempestade estiver em andamento), então quero que sua conexão seja confiável.

Para se conectar ao servidor, o Raspberry Pi executa um processo como este:

while true; do
    ssh -R 19999:localhost:22 www.sern.pro
    sleep 30
done

A parte 19999:localhost:22 basicamente significa que todo o tráfego na porta 19999 no servidor deve ser encaminhado para a porta 22 do Raspberry Pi. Então, eu posso conectar ao Raspberry Pi por SSHing para o servidor e, em seguida, executar um comando como o seguinte:

ssh localhost -p 19999

Isso normalmente funciona bem e, no servidor, um comando como netstat --all --timers --program --numeric | egrep '127.0.0.1:*(LISTEN|.*)' | sort lista a conexão reversa do SSH como algo assim:

tcp        0      0 127.0.0.1:19999         0.0.0.0:*               LISTEN      2972/5           off (0.00/0/0)

No entanto, ocasionalmente, descobri que esta listagem no servidor desaparece enquanto o Raspberry Pi mantém sua conexão SSH com o servidor . Ou seja, o comando ssh localhost -p 19999 resulta em uma mensagem de erro como a seguinte:

ssh: connect to host localhost port 19999: Connection refused

No entanto, a conexão Raspberry Pi SSH permanece perfeitamente bem, capaz de executar comandos no servidor. Eu não sei as palavras certas para descrever o que está errado quando isso acontece.

Então ... menos de reservar um voo e subir ao telhado de um prédio, como eu poderia pegar essa conexão SSH ativa novamente como um túnel SSH reverso adequado? Como posso obter acesso à porta local novamente?

    
por BlandCorporation 27.06.2017 / 18:12

2 respostas

1

Mais de uma década atrás, autossh utility foi escrito para tais propósitos.

Você pode usar o seguinte script de conexão

#!/bin/sh
export AUTOSSH_GATETIME=0 

autossh -M 0
-o "PubkeyAuthentication=yes" \
-o "StrictHostKeyChecking=false" \
-o "PasswordAuthentication=no" \
-o "ExitOnForwardFailure=yes" \
-o "ServerAliveInterval 60" \
-o "ServerAliveCountMax 3" \
-fNR 19999:localhost:22 www.sern.pro

Claro, você precisa estabelecer uma autenticação baseada em chave antes de iniciar este script.

    
por 28.06.2017 / 23:26
0

O problema que você está vendo significa que a conexão não está disponível, se você verificar no final do comando que lista todas as conexões, você talvez veja que a conexão para aquela porta não está mais em LISTEN e agora é TIME -WAIT ou CLOSE-WAIT, isso significa que as conexões ainda estão "vivas", mas apenas como um processo em execução na framboesa.

Para conseguir isso, você pode criar um script que verifique se existe uma conexão reversa se não for configurada.

Para resolver o problema, você pode adicionar código ao script para verificar se há um id de processo ssh na unidade e, se você tiver um arquivo de marcador, então você mata esse processo para reiniciar o túnel novamente.

Por exemplo, você tem um arquivo vazio chamado RESTARTSSH, no seu script você pode verificar se esse arquivo existe, se sim, então procure o id do processo do ssh e o mate, então reinicie o túnel.

Para verificar o código do processo, você pode usar:

ps -ef | grep ServerAliveInterval | grep -v grep | awk '{print $2}'
    
por 27.06.2017 / 21:09