Túnel SSH reversível confiável

6

Estou usando autossh para abrir um túnel SSH reverso usando chaves privadas. O shell do usuário do encapsulamento é rssh e é verificado como funcionando.

O problema que estou tendo é como tal, independentemente de ClientAliveInterval ( 15 ) e ClientAliveCountMax ( 3 ) (os sshd defaults), no lado do cliente, o túnel é aberto com:

exec autossh -N                   \
  -o "ServerAliveInterval 60"     \
  -o "ServerAliveCountMax 3"      \
  -o "StrictHostKeyChecking no"   \
  -R ${tunnel_port}:localhost:22  \
  -i ./tunnel                     \
  -v                              \
  [email protected]

O ${tunnel_port} vem de uma pequena chamada curl que procura uma porta livre no host de encapsulamento, a porta não muda (ela é atribuída com base no endereço mac da caixa solicitante)

O problema é que quando TERM inating o cliente de encapsulamento, as portas ficam ocupadas no host e o processo sshd continua sendo executado:

Tambémnãoconsigofazerloginnasmáquinaspormeiodotúnel:

ubuntu@ip-10-252-138-233:~$ssh-p39777pi@localhostssh:connecttohostlocalhostport39777:Connectionrefused

Euestouquerendosaberoqueeupossofazerparatornarotúnelmaisconfiável,paratercertezadequequandoaextremidadedesceécompletamentemorto,derrubadoenãopodeentraremumestado"quebrado".

Se eu estivesse tunelando pela porta 80 ou semelhante, eu poderia escrever um script check (este daemon com runit ) para verificar se alguma página HTML estava disponível de ponta a ponta através do túnel, no entanto, quando é sobre SSH, e como um túnel reverso, eu estou com uma perda de como o cliente poderia saber se o túnel é realmente trabalhando contra apenas correndo?

    
por Lee Hambley 24.06.2013 / 10:20

1 resposta

3

Acho que você tem duas perguntas aqui.

Primeiro, como ter certeza de que os processos do servidor sshd terminam, liberando as portas, assim que o cliente se desconectar. Se o cliente se desconecta, não sei por que os processos do servidor ficam pendurados, a menos que talvez eles tenham processos filhos, mas sua captura de tela mostra que não. Se o cliente não desconectar, mas apenas parar de responder, o processo do servidor deverá ser encerrado por aproximadamente ClientAliveInterval * ClientAliveCountMax segundos depois.

Segundo, é como o cliente pode determinar se o túnel está funcionando. Isso é o que o recurso de monitoramento de porta do autossh faz. Se você adicionar, por exemplo, -M 20000 para a chamada para o autossh, ele configurará a porta para enviar tráfego para o host remoto na porta 20000 e recebê-lo de volta na porta 20001. Ele tentará enviar tráfego ao redor do loop a cada AUTOSSH_POLL segundos (padrão 600) , e se detectar que a conexão parou de funcionar, termine-a e inicie uma nova conexão ssh.

Adicionando a opção -M à sua chamada de auto-atendimento, e provavelmente configurando AUTOSSH_POLL mais baixo, para dizer 30, pode ajudar se o ssh não tiver terminado corretamente.

    
por 15.07.2013 / 11:45