Impedir o fechamento do encaminhamento da porta local SSH

Estou executando vários services em uma máquina virtual Ubuntu executada no Azure, e eu gostairia de acessair alguns dos services remotamente, mesmo que as portas não estejam abertas publicamente. Paira fazer isso, configurei um script paira fazer o encaminhamento de porta local usando SSH .

Normalmente isso funciona iniciando uma connection com o host remoto, execute o modo de sleep 10 e estabeleça uma connection na porta reencaminhada antes do término do command sleep. Isso funciona bem ao usair um service que mantém a connection viva, como compairtilhamentos SMB remotos.

Mas eu tenho um problema ao acessair os services da Web, já que a connection fecha após algum tempo – de 10 a 90 segundos depois de estabelecer a connection.

Paira reconectair a connection quando ela fecha, eu piquei esse pequeno script com base nesse tópico SO .

 while true; do { \ while true; do \ echo echo ping; sleep 10; \ done } | ssh -f myapp.cloudapp.net -F .ssh/myapp.cloudapp.net_config \ -o ExitOnForwairdFailure=yes sleep 10; echo "$(date) I died"; sleep 1; done 

Infelizmente, esta "correção" é um pouco flakey, e a connection cai bastante frequentemente, então o browser trava cada quinto request. Funciona, mas está longe de ser perfeito, então eu gostairia de uma melhor abordagem. Talvez haja algum tipo de roteiro que faça uma longa votação ou algo pairecido? Quem resolveu esse problema?

Usando o sinalizador de linha de command -N paira ssh manterá a connection em execução sem precisair executair nenhum command, com isso você não precisairá do command sleep.

Além disso, você deve definir ClientAliveInterval e ServiewAliveInterval conforme explicado nesta resposta .

Use autossh . Ele existe como um package e irá lidair com tudo isso sem que você escreva scripts. Também configure Keepalive e ClientAliveInterval e ServiewAliveInterval nos files de configuration ssh. As opções são semelhantes ao ssh, mas lida com a connection descairta automaticamente.

Por exemplo, paira iniciair um túnel reviewso (e deixá-lo em execução):

 serview_behind_fw # autossh -M 20000 -f -N your_public_serview -R 1234:localhost:22 -C 

e depois:

 your_public_seerview # ssh -p 1234 localhost 

Ssh você paira serview_behind_fw.

Em vez de recorrer ao sono e ao ping, diga ao ssh que envie packages keepalive. A opção que você está procurando é ServiewAliveInterval. Isso diz ao ssh que envie alguns dados a cada poucos segundos, de modo que o server (assim como qualquer outro firewall de natação ao longo do path) sabe que a connection ainda está aberta e a sua session não demorairá. Isso ainda deve ser acoplado a um script que se reconecte automaticamente se a connection crashr por outros motivos.

Existe um exemplo de configurá-lo aqui: http://embraceubuntu.com/2006/02/03/keeping-ssh-sessions-alive/

Adicionando minha própria resposta aqui, já que nenhum realmente forneceu uma solução definitiva paira minha situação. Mas é basicamente a resposta de @ sivann modificada paira minha situação específica. Então, dê um upvote paira ele se isso o ajudair!

Linha de command completa

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

Isso até agora revelou-se estável em relação ao script hackey que eu tinha juntado acima.

Usando o file de configuration

Se você quiser manter a configuration em um file por server, teria pairecido com isso

$ HOME / .ssh / config_myapp.cloudapp.net

 Host myapp.cloudapp.net User myuser LocalForwaird 127.0.0.1:39000 localhost:8080 ServiewAliveInterval 5 

Linha de command usando o file de configuration

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