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 remotehost
e 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 rocks
que 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.
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 comServerAliveInterval > 0
eServerAliveCountMax > 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/config
que eles estão sempre lá para vocêrocks
aplicação ... embora este é, obviamente, uma verdadeira kludgeRespostas:
O antigo é um soquete confiável ( rochas ) não-mantido que você procura?
fonte
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.
fonte
Você pode usar
daemontools
para 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
iptables
truques, 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 adaemontools
mim 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.fonte
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.
fonte
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.