Reconectando automaticamente o túnel TCP

9

Eu tenho uma conexão de rede não confiável entre duas máquinas: às vezes, as conexões TCP ativas são descartadas por motivos fora do meu controle. Eu quero estabelecer uma conexão TCP confiável entre as duas máquinas.

Se a rede fosse confiável, eu apenas rodaria ssh -L 1234:localhost:1234 remotehost, com o servidor escutando na porta 1234 remotehoste apontaria o cliente localhost:1234. Mas se a conexão ssh morrer, a conexão encaminhada também será. Como posso organizar a restauração automática da conexão entre o cliente e o servidor?

Não soluções:

  • Isso não é para aplicativos interativos; portanto, a tela não se aplica.
  • Este não é apenas sobre a reconexão de um túnel SSH automaticamente, la autossh . Desejo continuar usando a mesma conexão TCP encapsulada, não iniciar uma nova.
  • Em princípio, uma VPN faria o truque. Mas parece um exagero quando eu apenas quero uma conexão TCP e gostaria de uma solução que funcione mesmo que eu não tenha permissões de root em nenhum dos lados.

Eu tenho uma memória fraca de um programa chamado rocksque fez exatamente isso, mas parece que caiu na cara da web. Estou mais interessado no Linux dos dois lados (embora eu espere que um programa nesse nível seja portátil para outros departamentos), mas se você souber de um programa que funcione entre QNX e VMS, tanto melhor.

Gilles 'SO- parar de ser mau'
fonte
Gilles, você está usando keepcives tcp com suas conexões ssh? Se não, tente este primeiro ... algumas conexões implementações tempo NAT rapidamente
Mike Pennington
@ Mike: Obrigado pela dica. Eu não tenho uma necessidade imediata, mas já enfrentei situações em que alguma rota intermediária veio e foi (para que as atividades de manutenção do TCP causassem mais mal do que bem) e situações em que um NAT me sobrecarregou e me derrubou (para que as atividades de manutenção do TCP pudessem ajudar). Keepalives TCP não importariam para um fluxo contínuo de qualquer maneira (por exemplo, scp), importariam? De qualquer forma, gostaria de manter isso em geral: da próxima vez que me deparar com uma rede esquisita de qualquer sabor, o que posso fazer?
Gilles 'SO- stop be evil'
Gilles, as soluções são diferentes para fluxos constantes como scp. Eu estava respondendo com keepalives w / ssh com base no seu exemplo de encaminhamento de porta. Re: flaky hop downstream, não há muito que você possa fazer, além de criar uma sessão ssh com keepalives mais tolerantes (ou seja, permitir mais keepalives descartados com ServerAliveInterval > 0e ServerAliveCountMax > 3). O NAT requer intervalos mais baixos de manutenção de atividade. A questão principal é identificar qual é o problema e adaptar de acordo. Coloque as opções em .ssh/configque eles estão sempre lá para você
Mike Pennington
@ Mike: Um dos meus casos de uso inclui o cliente obtendo seu IP de um NAT sobrecarregado que descarta aleatoriamente até conexões ativas (pense em mais P2P do que deveria). Após alguns segundos, o cliente consegue se reconectar, mas pode obter um endereço IP diferente. Não há como a conexão TCP sobreviver nesse caso. Rocks lida com isso, mas eu prefiro algo que seja compilado imediatamente nos sistemas atuais.
Gilles 'SO- stop be evil'
no caso do NAT dando-lhe novos IPs, não há muito que você pode fazer do que começar o NAT fixo ou esperança para outra rocksaplicação ... embora este é, obviamente, uma verdadeira kludge
Mike Pennington

Respostas:

5

O antigo é um soquete confiável ( rochas ) não-mantido que você procura?

aguardando em desespero silencioso
fonte
1
Obrigado, Rocks é realmente o que eu lembrei. Claro que prefiro algo que é mantido.
Gilles 'SO- stop be evil'
@ Gilles'SO-stopbeingevil 'Não só é sem manutenção, mas parece que caiu completamente na cara da internet!
Michael
1

O único protocolo padrão que conheço com esse recurso é o MPTCP . É transparente para a camada de aplicação, portanto, o SSH sobre o MPTCP deve funcionar. Ele pode executar as conexões TCP subjacentes por caminhos diferentes com IPs diferentes; portanto, em princípio, pode ser usado para migrar sua conexão SSH para dentro e para fora da conexão VPN, dependendo se a conexão VPN está ativa.

Não sei muito sobre a maturidade das implementações do MPTCP, mas o design do protocolo parece bastante robusto.

Ele deve proteger suas conexões SSH de se perderem devido à conectividade de rede inadequada. Ele não o protegerá contra um mitm que deseja interromper sua conexão SSH. Um mitm ainda pode injetar dados corrompidos, que o SSH detectará e interromperá a conexão.

Um método de reconexão MPTCP incorporado ao protocolo SSH seria o método que eu poderia imaginar mantendo uma conexão ativa pelo maior tempo possível. Mas não acho que esse recurso tenha sido projetado para o protocolo SSH.

Kasperd
fonte
0

Você pode usar daemontoolspara manter a porta ssh voltada para cima; ele não manterá necessariamente os programas, dependendo da conexão, enquanto estiver inativo (como presumivelmente quando o ssh desconecta a porta local começará a recusar suas conexões), mas é um começo.

Eu suspeito que existem alguns iptablestruques, como causar essa porta para pacotes DROP assim que o ssh forward desaparecer, então os programas de conexão apenas sabem que os pacotes estão desaparecendo, não sendo recusados. Estou apenas aprendendo a daemontoolsmim mesmo (de novo), então não tenho certeza se você pode executar um script personalizado quando um serviço morre, mas suspeito que sim.

Gordon Morehouse
fonte
-2

O TCP faz isso automaticamente. Você só precisa desativar ou enfraquecer os hacks de limpeza práticos típicos usados ​​para matar conexões TCP moribundas. Desative o keepalive TCP para sua conexão e aumente bastante o limite para retransmissões excessivas. No Linux, por exemplo, escreva um número grande /proc/sys/net/ipv4/tcp_retries2.

No entanto, em uma rede moderna, é provável que um firewall com inspeção de pacotes com estado esquecerá uma conexão TCP que não troque pacotes regularmente, para que possa chover em seu desfile.

aecolley
fonte
1
É verdade que o TCP pode lidar com a situação, desde que cada ponto de extremidade tenha um endereço IP estático e não haja caixas intermediárias com estado. A pergunta menciona reasons beyond my control, que eu li como IP dinâmico ou caixas intermediárias com estado. Em tais cenários, o TCP keepalive pode ajudar um pouco. Mas não importa como você configure o TCP keepalive, não será suficiente para manter a conexão ativa quando uma caixa intermediária perder o estado devido à reinicialização.
precisa saber é o seguinte
@kasperd Eu concordo. No entanto, é inútil tentar manter uma conexão TCP aberta nesses casos. Portanto, presumi que o questionador não estivesse enfrentando esses desafios específicos.
aecolley 16/08/14
Não é inútil se você controlar os dois pontos de extremidade e puder atualizá-los para uma pilha com suporte ao MPTCP. Além disso, uma solução de camada de aplicativo pode ser implementada sobre o TCP sem a necessidade de MPTCP.
kasperd