Conexão ssh de fundo permanente para criar um túnel reverso: qual é o caminho correto?

36

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

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 adicionou ao /etc/crontab . Mas eu descobri que funciona se eu só executá-lo "à mão" do shell, mas se ele é chamado pelo cron, o ssh se conecta e imediatamente termina. (assim, o script acima reconecta o tempo todo)

De man ssh , descobri que para conexões de segundo plano eu deveria chamá-lo com -n key, mas isso não ajudava. Então, eu apenas procurei por scripts similares e descobri que funciona se eu chamar tail -f something , ou seja, algum comando "neverending", então eu acabei de criar o arquivo /tmp/dummy_file e agora meu comando ssh tem esta aparência:

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

Funciona agora! Mas, esta solução parece um pouco feia, mais eu não entendo realmente as razões reais desse comportamento. Por acaso, tentei chamar bash em vez de tail -f ( bash parece-me o comando "neverending"), mas não funciona.

Então, alguém poderia, por favor, explicar este comportamento, e qual é a maneira correta de criar uma conexão ssh em background para manter o ssh invertido?

    
por Dmitry Frank 31.05.2014 / 18:29

3 respostas

34

Parece que você quer a opção -N para ssh.

 -N      Do not execute a remote command.  This is useful for just forwarding ports
         (protocol version 2 only).
    
por 31.05.2014 / 21:08
15

Sugiro 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, você pode fazer uma pesquisa na web por autossh upstart para encontrar 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 em todos os momentos para determinados serviços.

    
por 31.05.2014 / 19:58
8

Vou dar uma segunda sugestão de @ 0xC0000022L e usar autossh também. Eu o uso para manter uma conexão SSH do meu laptop enquanto eu o levo de um lugar para outro e isso simplesmente funciona. Eu uso essa conexão para fazer o tunelamento das portas 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, então, mantenho uma entrada Host no meu arquivo $HOME/.ssh/config para o 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 script autossh_mail.sh é executado como parte da minha área de trabalho quando eu faço login. Você pode acessá-lo via gnome-session-properties .

    
por 31.05.2014 / 20:57