Eu uso um túnel SSH do trabalho para percorrer vários firewalls idóticos (tudo bem com meu chefe :)). O problema é que, depois de um tempo, a conexão ssh geralmente trava e o túnel está quebrado.
Se pelo menos eu pudesse monitorar o túnel automaticamente, poderia reiniciar o túnel quando ele travar, mas nem imaginei uma maneira de fazer isso.
Pontos de bônus para quem pode me dizer como impedir que minha conexão ssh seja interrompida, é claro!
watch
comando como:watch -n1 60 echo "wiiiii"
. O túnel não morre a menos que a rede esteja quebrada ou você não a use.Respostas:
Parece que você precisa de autossh . Isso irá monitorar um túnel ssh e reiniciá-lo conforme necessário. Nós o usamos há alguns anos e parece funcionar bem.
Mais detalhes sobre o parâmetro -M aqui
fonte
autossh
na resposta?autossh -f -nNT -i ~/keypair.pem -R 2000:localhost:22 [email protected]
Você pode perceber que eu configurei isso usando -nNT, que não cria um terminal remoto, para que eu possa colocar autossh em segundo plano e a opção -i para o SSH usar um arquivo .pem. Se você vai manter uma conexão aberta o tempo todo, eu definitivamente recomendo fazer a configuração extra.-M
parâmetro: bugs.debian.org/cgi-bin/bugreport.cgi?bug=351162Todos os firewalls com monitoração de estado esquecem uma conexão depois de não ver um pacote para essa conexão por algum tempo (para impedir que as tabelas de estado fiquem cheias de conexões nas quais ambas as extremidades morrem sem fechar a conexão). A maioria das implementações de TCP enviará um pacote keepalive após um longo tempo sem ouvir do outro lado (duas horas é um valor comum). Se, no entanto, houver um firewall stateful que se esqueça da conexão antes que os pacotes keepalive possam ser enviados, uma conexão de longa duração, porém inativa, morrerá.
Se for esse o caso, a solução é impedir que a conexão fique inativa. O OpenSSH possui uma opção chamada ServerAliveInterval que pode ser usada para impedir que a conexão fique ociosa por muito tempo (como bônus, ele detectará quando o par morreu mais cedo, mesmo que a conexão esteja ociosa).
fonte
Em sua própria máquina mac ou linux, configure seu ssh para manter o servidor ssh ativo a cada 3 minutos. Abra um terminal e acesse seu .ssh invisível em sua casa:
crie um arquivo de configuração de 1 linha com:
você também deve adicionar:
o padrão é 3, para que ServerAliveInterval 180 pare de enviar após 9 minutos (3 do intervalo de 3 minutos especificado por ServerAliveInterval).
fonte
ServerAliveInterval 180
nos dá 6 minutos? intuição me faz tente o seguinte:180/60 == 3
. Então,ServerAliveInterval
funciona em múltiplos de 30 segundos?Usei o seguinte script do Bash para gerar novos túneis ssh quando o anterior morre. Usar um script é útil quando você não deseja ou não pode instalar pacotes adicionais ou usar o compilador.
Observe que isso requer um arquivo de chave para estabelecer a conexão automaticamente, mas esse também é o caso do autossh.
fonte
O Systemd é ideal para isso.
Crie um arquivo de serviço
/etc/systemd/system/sshtunnel.service
contendo:(Modifique o comando ssh para se adequar)
sshtunnel
portanto, verifique se ele existe primeirosystemctl enable sshtunnel
para configurá-lo para iniciar no momento da inicializaçãosystemctl start sshtunnel
para iniciar imediatamenteAtualização em janeiro de 2018 : algumas distros (por exemplo, Fedora 27) podem usar a política do SELinux para impedir o uso do SSH do systemd init; nesse caso, uma política personalizada precisará ser criada para fornecer as isenções necessárias.
fonte
systemd
sistema. Se alguém usarRestart=on-failure
, a eliminação manual do cliente SSH não resultará em uma reinicialização por sistema como o cliente SSH com saída com êxito.ExecStart
, por exemplo, para construir assh
lista de argumentos, fazer verificações básicas etc, em seguida, chamá-lo a partir do script assimexec /bin/ssh -N ...
. Aqui está o meu comando:exec /bin/ssh -N -oExitOnForwardFailure=Yes -oTCPKeepAlive=no -oServerAliveInterval=5 -oServerAliveCountMax=6 -i "${LOCAL_PRIVATE_KEY}" -L "${TUNNEL_INLET}:${TUNNEL_OUTLET}" "${REMOTE_USER}@${REMOTE_MACHINE}"
ondeTUNNEL_INLET="127.0.0.1:3307"
eTUNNEL_OUTLET="127.0.0.1:3306"
Parece-me que todos vocês estão interpretando mal o ServerAliveCountMax. Pelo que entendi os documentos, é o número de mensagens ativas do servidor que podem ficar sem resposta sem que a conexão seja encerrada. Portanto, em casos como o que estamos discutindo aqui, defini-lo como um valor alto garantirá que uma conexão travada não seja detectada e encerrada!
Simplesmente configurar ServerAliveInterval deve ser suficiente para resolver o problema com um firewall esquecendo a conexão, e deixar ServerAliveCountMax baixo permitirá que o final de origem observe a falha e termine se a conexão falhar de qualquer maneira.
O que você deseja é: 1) que a conexão permaneça aberta permanentemente em circunstâncias normais, 2) que a falha na conexão seja detectada e o lado de origem saia na falha e 3) que o comando ssh seja reemitido toda vez saídas (como você faz isso depende muito da plataforma, o script "while true" sugerido por Jawa é uma maneira, no OS XI realmente configuramos um item launchd).
fonte
Sempre use a
ServerAliveInterval
opção SSH caso os problemas do túnel sejam gerados por sessões NAT expiradas.Sempre use um método de reaparecimento no caso de a conectividade cair completamente, você tem pelo menos três opções aqui:
while true do ssh ...; sleep 5; done
) não remove o comando sleep,ssh
pode falhar rapidamente e você reaparecerá muitos processos/etc/inittab
, para ter acesso a uma caixa enviada e instalada em outro país, atrás do NAT, sem encaminhamento de porta para a caixa, você pode configurá-lo para criar um túnel ssh para você:script inicial no Ubuntu, onde
/etc/inittab
não está disponível:ou sempre use os dois métodos.
fonte
Eu resolvi esse problema com isso:
Editar
E adicione
De acordo com a página de manual do ssh_config:
fonte
ExitOnForwardFailure yes
é um bom complemento para as outras sugestões. Se ele se conectar, mas não conseguir estabelecer o encaminhamento de porta, é tão inútil para você quanto se não tivesse se conectado.fonte
Eu tive uma necessidade de manter um túnel SSH a longo prazo. Minha solução estava sendo executada em um servidor Linux e é apenas um pequeno programa C que reaparece o ssh usando autenticação baseada em chave.
Não tenho certeza do enforcamento, mas tive túneis morrendo devido a tempos limite.
Gostaria de fornecer o código para o respawner, mas não consigo encontrá-lo agora.
fonte
Embora existam ferramentas como o autossh que ajudam a reiniciar a sessão ssh ... o que eu acho realmente útil é executar o comando 'screen'. Ele permite que você CONTINUE suas sessões ssh mesmo depois de desconectar. Especialmente útil se sua conexão não for tão confiável quanto deveria.
... não se esqueça de marcar esta é a resposta 'correta' se ela o ajudar! ;-)
fonte
Um pouco de hack, mas eu gosto de usar a tela para manter isso. Atualmente, tenho um encaminhamento remoto que está em execução há semanas.
Exemplo, iniciando localmente:
Quando o encaminhamento remoto é aplicado e você possui um shell no computador remoto:
Agora você tem um encaminhamento remoto ininterrupto. O truque é executar a tela nos dois lados
fonte
Recentemente, eu mesmo tive esse problema, porque essas soluções exigem que você digite novamente a senha todas as vezes, se você usar um login de senha, usei o sshpass em um loop junto com um prompt de texto para evitar ter a senha no arquivo em lotes.
Pensei em compartilhar minha solução nesse tópico, caso mais alguém tenha o mesmo problema:
fonte
Eu tive problemas semelhantes com meu ISP anterior. Para mim, era o mesmo com qualquer conexão TCP, visitando sites ou enviando correio.
A solução foi configurar uma conexão VPN por UDP (eu estava usando o OpenVPN). Essa conexão era mais tolerante com o que causou as desconexões. Em seguida, você pode executar qualquer serviço através dessa conexão.
Ainda pode haver problemas com a conexão, mas, como o túnel será mais tolerante, qualquer sessão ssh sofrerá uma pequena interrupção em vez de ser desconectada.
Para fazer isso, você precisará de um serviço VPN online, que pode ser configurado em seu próprio servidor.
fonte
Como
autossh
não atende às nossas necessidades (existe com erro se não puder se conectar ao servidor na primeira tentativa), escrevemos um aplicativo bash puro: https://github.com/aktos-io/link- com servidorEle cria um túnel reverso para a porta sshd do NODE (22) no servidor por padrão. Se você precisar executar outras ações (como encaminhar portas adicionais, enviar e-mails na conexão, etc ...), poderá colocar seus scripts
on-connect
eon-disconnect
pastas.fonte