Suspender o processo sshd no host remoto após a conexão reversa do túnel ssh ser quebrada

2

Eu configurei o túnel reverso dessa maneira:

function startconn () {
    ssh -N -b ${SRCIP} -X -R ${REMOTEIP}:${REMOTEPORT}:${LOCALIP}:${LOCALPORT} root@${REMOTEIP} &
    SSHPID=$!
    echo "$SSHPID" > $PIDFILE
    echo "Forwarding port ${REMOTEPORT} at ${REMOTEIP} to ${LOCALIP}:${LOCALPORT}"
}

Este encaminha REMOTEPORT @ REMOTEIP via link de backup disponível via rede SRCIP (tenho NIC auxiliar com SRCIP == 192.168.5.2 que se conecta ao gateway de link de backup em 192.168.5.1).

Funciona muito bem, mas há um problema: se a conexão ssh for interrompida, por exemplo, pela reinicialização do gateway, etc, em geral, qualquer coisa que interrompa a conexão TCP / IP da sessão ssh do túnel reverso, o processo sshd no REMOTEIP está interrompido, impedindo o restabelecimento do túnel reverso para esta porta (30200 abaixo é REMOTEPORT):

netstat -anp | grep 30200
tcp        0      0 0.0.0.0:30200           0.0.0.0:*               LISTEN      8772/sshd: root

A única solução viável que vejo por agora é o script de reconexão que faz o logon da conexão perdida com o REMOTEIP e mata o processo do sshd "manualmente" antes de tentar restabelecer o túnel reverso.

Existe alguma maneira mais inteligente / menos complicada de impedir a porta REMOTEIP do bloqueio remoto do processo sshd?

    
por LetMeSOThat4U 03.02.2014 / 12:23

1 resposta

2

Sim, isso é autossh , um wrapper em torno de ssh projetado exatamente para isso. A página de autossh man afirma:

autossh is a program to start a copy of ssh and monitor it, restarting it as necessary should it die or stop passing traffic.

Eu uso em uma dúzia de máquinas, e seu tempo de atividade é de 100%.

Eu uso da seguinte forma: eu coloco esta linha

   su my_name -c /home/my_name/bin/auto

no arquivo /etc/rc.local da máquina que está iniciando o túnel reverso (chame-o de A). O arquivo executável (* chmod 755 auto) auto é:

  #!/bin/sh

 /usr/lib/autossh/autossh -M 6527 -f -p 5298 -2 -N -R 8400:localhost:2222 userB@remote_hostB -i /home/my_name/.ssh/crypto-keyB

Aqui 5298 é a porta ssh do host remoto (eu chamei de B), 2222 a porta ssh da máquina chamadora A. A porta 6527 é usada para verificar o status da conexão; ele precisará ser aberto no firewall do servidor remoto (A) para que isso funcione.

Isso configura o túnel reverso. A partir de um terminal no servidor remoto (B), posso agora conectar a máquina iniciando o túnel reverso (A) por meio do comando

 sh -Y userA@localhost -p 8400 -i /home/userB/.ssh/crypto-keyA

Você deve se lembrar de conectar uma vez de qualquer máquina ao outro antes de configurar o túnel, porque será necessário responder de forma interativa a pergunta usual: A máquina A respondeu com a chave criptográfica. .; deveria ser escrito em hosts conhecidos ?.

Uma vez feito isso, você está pronto para ir. É basicamente fogo e esqueça.

    
por 03.02.2014 / 13:58