Conexão ssh permanente em segundo plano para criar túnel reverso: qual é a maneira correta?

41

Pergunta relacionada: iniciar conexão ssh do servidor para o cliente

A resposta de lá me ajudou muito, esse comando faz o que eu preciso:

ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP

Então, eu escrevi o script para reconectar o tempo todo:

 #!/bin/bash

 while true; do
    echo "try to connect..."
    ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host
    echo "restarting in 5 seconds.."
    sleep 5
 done

E acrescentou ao /etc/crontab. Mas descobri que funciona se eu apenas o executar "manualmente" a partir do shell, mas se for chamado pelo cron, o ssh se conectará e terminará imediatamente. (assim, o script acima se reconecta o tempo todo)

De man ssh, descobri que para conexões em segundo plano eu deveria chamá-lo com -nchave, mas não ajudou. Então, procurei por scripts semelhantes e descobri que funcionaria se eu chamar tail -f something, ou seja, algum comando "sem fim", então criei um arquivo vazio /tmp/dummy_filee agora meu comando ssh se parece com o seguinte:

ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file

Funciona agora! Mas, essa solução parece um pouco feia, e eu realmente não entendo as razões reais desse comportamento. Por acaso, tentei ligar em bashvez de tail -f( bashparece-me também um comando "sem fim"), mas não funciona.

Então, alguém poderia explicar esse comportamento e qual é a maneira correta de criar uma conexão ssh em segundo plano para manter o túnel ssh reverso ativo?

Dmitry Frank
fonte
que tal usar &no final do seu comando ssh:ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &
Networker
Mas então meu whileloop será executado repetidamente, iniciando uma nova sshconexão em segundo plano a cada 5 segundos, certo? Não é disso que eu preciso.
Dmitry Frank

Respostas:

37

Parece que você deseja a -Nopção ssh.

 -N      Do not execute a remote command.  This is useful for just forwarding ports
         (protocol version 2 only).
Patrick
fonte
16

Eu sugiro fortemente que você considere autossh. Ele possui certas heurísticas que permitirão determinar se a perda de conexão é o motivo subjacente e diminuirá a frequência de tentativas de reconexão. Além disso, monitora a conexão usando túneis extras, o que a torna altamente útil para cenários como o que você está perguntando.

Se você estiver no Ubuntu, por exemplo, poderá fazer uma pesquisa na web para autossh upstartencontrar alguns exemplos úteis sobre como configurar o Ubuntu para que o túnel seja mantido de forma persistente.

Estou usando isso para manter uma conexão em túnel aberta para o meu servidor o tempo todo para determinados serviços.

0xC0000022L
fonte
Na verdade autossh, tentei , li este artigo: goo.gl/jVuuSR , mas só funcionou para mim se eu tiver conexão com a Internet imediatamente na inicialização do sistema; mas se a conexão for estabelecida posteriormente, não funcionou. Não tenho certeza, talvez eu tenha feito algo errado, mas mesmo neste artigo o autor tem o sleep 10dele /etc/rc.local, para garantir que a conexão à Internet já esteja pronta quando o autossh for chamado.
Dmitry Frank
2
@DmitryFrank: meio injusto sem mencionar isso na sua pergunta, se você já tentou. Eu ainda recomendo. Com upstarte outras substituições init, você pode vincular a inicialização do túnel a um ou mais dispositivos de rede ativos. A melhor das soluções (IMO) da Web é a seguinte: erik.torgesta.com/tag/ssh-upstart ... e não sleep 10, de qualquer maneira , não ajudará nada em alguns casos extremos.
0xC0000022L
Me desculpe por não mencionar isso, para ser honesto, quando não funcionou para mim, decidi fazer isso apenas "manualmente" e esqueci completamente o autossh. Obrigado por ssh-upstart, vou dar uma olhada!
Dmitry Frank
atrasado para a festa, mas eu queria acrescentar que não era possível obter autossh de maneira confiável para manter um túnel reverso. se o túnel reverso falhar por algum motivo, o autossh não notará e não reconstruirá a conexão. Eu preciso vários túneis de vários servidores e isso complica as coisas
DeveloperChris
@ DeveloperChris: Bem, eu estou executando exatamente esse cenário - e de forma confiável. A menos que o servidor remoto fique literalmente inativo e você precise ativá-lo novamente, o túnel sempre é restabelecido. Talvez você deva escrever sua própria pergunta e fornecer detalhes. Certamente isso pode ser feito. Eu usei isso para solucionar problemas de VPN por meses.
0xC0000022L
9

Vou usar a sugestão do @ 0xC0000022Lautossh também. Eu o uso para manter uma conexão SSH do meu laptop quando a levo de um lugar para outro e ele simplesmente funciona. Eu uso essa conexão para encapsular as portas traseiras 25 e 2143 para acessar meus servidores SMTP e IMAP pessoais.

Aqui está o script que eu uso:

$ more /home/saml/bin/autossh_mail.sh
#!/bin/bash

autossh -M 0 -f -N -L 2025:localhost:25 -L 2143:localhost:143 sam@imap-o

Eu mantenho uma Hostentrada no meu $HOME/.ssh/configarquivo para host imap-o.

$ more $HOME/.ssh/config
ServerAliveInterval 15
ForwardX11 yes
ForwardAgent yes
ForwardX11Trusted yes

GatewayPorts yes

Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
IdentityFile ~/.ssh/id_dsa

Host imap-o
    User sam
    ProxyCommand ssh [email protected] nc `echo %h|sed 's/-o//'` %p

O autossh_mail.shscript é executado como parte da minha área de trabalho quando eu entro. Você pode acessá-lo via gnome-session-properties.

       ss # 1

                                          ss # 2

slm
fonte