O antigo é um Sockets confiáveis não-mantidos ( Rocks ) o que você está procurando?
Eu tenho uma conexão de rede não confiável entre duas máquinas: às vezes, conexões TCP ativas são descartadas por motivos além 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 executaria ssh -L 1234:localhost:1234 remotehost
, com o servidor ouvindo na porta 1234 em remotehost
e apontando o cliente para localhost:1234
. Mas se a conexão ssh morrer, o mesmo acontecerá com a conexão encaminhada. Como posso organizar automaticamente a conexão entre o cliente e o servidor?
Não soluções:
Eu tenho uma memória fraca de um programa chamado rocks
que fez exatamente isso, mas parece ter caído fora da web. Estou interessado principalmente no Linux em ambos os lados (embora eu espere que um programa neste nível seja portátil para outros unices), mas se você conhece um programa que funciona entre o QNX e o VMS, melhor ainda.
O antigo é um Sockets confiáveis não-mantidos ( Rocks ) o que você está procurando?
O único protocolo padrão que conheço com esse recurso é o MPTCP . É transparente para a camada de aplicação, portanto, o SSH no topo do MPTCP deve funcionar. Ele pode executar as conexões TCP subjacentes em diferentes caminhos com IPs diferentes, portanto, em princípio, ele poderia ser usado para migrar sua conexão SSH para dentro e para fora da conexão VPN, dependendo de a conexão VPN estar ativa.
Eu 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 perder devido à conectividade de rede escamosa. Não irá protegê-lo contra um mitm que queira interromper sua conexão SSH. Um mitm ainda pode injetar dados corrompidos, que o SSH detectará e interromperá a conexão.
Um MPTCP como método de reconectar construído no protocolo SSH seria o método que eu poderia imaginar mantendo uma conexão viva pelo maior tempo possível. Mas eu não acho que esse recurso tenha sido projetado para o protocolo SSH.
Você pode usar daemontools
para manter a porta ssh avançada; ele não necessariamente manterá os programas dependendo da conexão enquanto estiver inativa (como presumivelmente quando o ssh desconectar 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 os pacotes DROP assim que o forward ssh desaparecer, então os programas de conexão apenas sabem que os pacotes estão desaparecendo, não sendo recusados. Eu estou apenas aprendendo daemontools
myself (novamente), então não tenho certeza se você pode executar um script personalizado quando um serviço morrer, mas eu suspeito que você pode.
O TCP faz isso automaticamente. Você só precisa desabilitar ou enfraquecer os típicos hacks de limpeza usados para matar conexões TCP moribundas. Desative o TCP keepalive para sua conexão e aumente significativamente o limite de retransmissões excessivas. No Linux, por exemplo, escreva um número grande em /proc/sys/net/ipv4/tcp_retries2
.
No entanto, em uma rede moderna, é provável que um firewall de inspeção de pacotes com informações de estado esqueça uma conexão TCP que não consegue trocar pacotes regularmente, portanto pode chover em sua parada.