túnel multi-hop no fundo; matando túnel local não mata túnel remoto

0

Túnel de vários saltos:

Estou abrindo um túnel para um servidor remoto por meio de um servidor de salto.

ssh ${JUMP_HOST} -l ${JUMP_HOST_USER} -L ${PORT}:localhost:${PORT} \
    ssh ${REMOTE_HOST} -l ${REMOTE_HOST_USER} -L ${PORT}:localhost:${PORT}

Agora, quando eu abrir uma conexão com localhost:port , ela encaminhará para jump:port , que por sua vez encaminhará para remote:port

Executar o túnel local em segundo plano:

O problema é que ele abre um shell em remote , enquanto eu quero que o túnel seja executado em segundo plano.

Portanto, adiciono a opção -f ao meu túnel local para solicitar que ele seja executado em segundo plano

ssh -f ${JUMP_HOST} -l ${JUMP_HOST_USER} -L ${PORT}:localhost:${PORT} \
    ssh ${REMOTE_HOST} -l ${REMOTE_HOST_USER} -L ${PORT}:localhost:${PORT}

Isso, no entanto, retorna um erro:

Pseudo-terminal will not be allocated because stdin is not a terminal.

Presumivelmente, este erro está vindo do túnel de jump para remote e é causado porque stdin está fechado quando meu túnel local é daemonizado.

Indique o túnel remoto Não vou executar um comando:

Eu então tentei executar o túnel jump-> remote com -N para dizer que não vou executar um comando remoto.

ssh -f ${JUMP_HOST} -l ${JUMP_HOST_USER} -L ${PORT}:localhost:${PORT} \
    ssh -N ${REMOTE_HOST} -l ${REMOTE_HOST_USER} -L ${PORT}:localhost:${PORT}

Isso funciona muito bem - o túnel é executado em segundo plano e eu posso me conectar com sucesso a remote:port conectando-se a localhost:port .

Problema:

O problema que estou tendo é quando eu quero fechar os túneis.

Se eu enviar um sinal de morte para o pid do meu ssh local, ele será fechado, mas o túnel ssh em execução no jump continuará em execução.

Parece que quando eu daemonize meu túnel local, o túnel em jump também é daemonizado.

Pergunta:

É possível executar o meu túnel local em segundo plano, mas quando eu o mato, ele tem que desligar todos os túneis que ele gerou em todos os servidores remotos?

    
por Steve Lorimer 09.05.2018 / 20:37

1 resposta

1

Execute os dois ssh -s localmente. Primeiro, conecte-se ao servidor de salto e crie um túnel que permitirá a você ssh para o host remoto do computador local :

ssh -fN $jump_host -l $jump_host_user -L ${helper_port}:${remote_host}:22

Em seguida, use este túnel para se conectar ao host remoto, criando o túnel desejado; ainda do computador local:

ssh -fN localhost -p $helper_port -l ${remote_host_user} -L ${port}:localhost:${port}

Como os dois processos ssh são locais, você pode kill ambos sempre que desejar; mas acho que matar o primeiro deve ser o suficiente, tente.

Notas:

  • Essa abordagem pode ser inconveniente se o seu "secundário" ssh depender da configuração específica armazenada em ssh_config no host de salto.
  • usei nomes de variáveis em letras minúsculas; veja esta resposta .
por 09.05.2018 / 22:00

Tags