Evitar o fechamento do encaminhamento de porta local SSH

2

Estou executando vários serviços em uma máquina virtual do Ubuntu em execução no Azure e gostaria de acessar alguns dos serviços remotamente, mesmo que as portas não estejam abertas publicamente. Para fazer isso, eu configurei um script para fazer encaminhamento de porta local usando SSH .

Normalmente, isso funciona iniciando uma conexão com o host remoto, executa sleep 10 e estabelece uma conexão na porta encaminhada antes que o comando sleep termine. Isso funciona bem ao usar um serviço que mantém a conexão ativa, como compartilhamentos SMB remotos.

Mas tenho um problema ao acessar os serviços da Web, pois a conexão é fechada após algum tempo - de 10 a 90 segundos após o estabelecimento da conexão.

Para reconectar a conexão quando ela é fechada, eu hackeei esse pequeno script com base nesse SO thread .

while true; do { \
    while true; do \
      echo echo ping; sleep 10; \
    done } | ssh -f myapp.cloudapp.net -F .ssh/myapp.cloudapp.net_config  \
             -o ExitOnForwardFailure=yes  sleep 10; echo "$(date) I died"; 
    sleep 1;
done
Infelizmente, essa "correção" é um pouco superficial, e a conexão é interrompida com bastante frequência, então o navegador trava a cada quinto pedido. Isso funciona, mas está longe de ser perfeito, então eu gostaria de uma abordagem melhor. Talvez pudesse haver algum tipo de script fazendo longas pesquisas ou algo parecido? Alguém que resolveu este problema?

    
por oligofren 23.05.2014 / 23:58

4 respostas

2

Adicionando minha própria resposta aqui, como nenhuma delas realmente forneceu uma correção definitiva para a minha situação. Mas é basicamente a resposta de @ sivann modificada para minha situação específica. Então dê um upvote para ele se isso te ajudar!

Linha de comando completa

# This forwards all requests to my local 39000 port to port 8080 on the server
LOCAL_PORT=39000
REMOTE_PORT=8080
SERVER=myapp.cloudapp.net
autossh -M20000 -N -L $LOCAL_PORT:$SERVER:$REMOTE_PORT myuser@$SERVER

Isso até agora se mostrou estável em relação ao script de hackey que eu tinha montado acima.

Usando o arquivo de configuração

Se você quiser manter a configuração em um arquivo por servidor, seria assim

$ HOME / .ssh / config_myapp.cloudapp.net

Host myapp.cloudapp.net
User myuser
LocalForward 127.0.0.1:39000 localhost:8080
ServerAliveInterval 5

Linha de comando usando o arquivo de configuração

autossh -M 12345 -N -F $HOME/.ssh/config_myapp.cloudapp.net 192.168.10.2

    
por 24.05.2014 / 13:01
5

Use o autossh . Ele existe como um pacote e lidará com tudo isso sem você escrever scripts. Também configure Keepalive e ClientAliveInterval, e ServerAliveInterval nos arquivos de configuração ssh. As opções são semelhantes ao ssh, mas lida com conexão descartada automaticamente.

Por exemplo para iniciar um túnel reverso (e deixá-lo funcionando):

server_behind_fw # autossh -M 20000 -f -N your_public_server -R 1234:localhost:22 -C

e depois:

your_public_seerver # ssh -p 1234 localhost

ssh você para server_behind_fw.

    
por 24.05.2014 / 11:04
3

Em vez de gostar de dormir e ping, diga ao ssh para enviar pacotes keepalive. A opção que você está procurando é ServerAliveInterval. Isso faz com que o ssh envie alguns dados a cada segundo para que o servidor (assim como qualquer firewall nativo ao longo do caminho) saiba que a conexão ainda está aberta, e sua sessão não irá expirar. Isso ainda deve ser acoplado a um script que reconectará automaticamente se a conexão falhar por outros motivos.

Existe um exemplo de configuração aqui: link

    
por 24.05.2014 / 06:37
3

Usar o sinalizador de linha de comando -N para ssh manterá a conexão em execução sem precisar executar nenhum comando, com isso você não precisará do comando sleep.

Além disso, você deve definir ClientAliveInterval e ServerAliveInterval conforme explicado em este responder .

    
por 24.05.2014 / 07:36