Não, isso não é possível. Você precisa de algo público para avançar. Ou para cada visibilidade de conexão de um servidor do outro.
Eu tenho usado uma configuração SSH de 3 máquinas ( A
, B
, C
) por um tempo. Tanto A
como C
são máquinas em duas LANs diferentes que desejo conectar e B
é minha própria caixa com um endereço público.
Na máquina A
, faço isso:
ssh -p 443 -f -N -R 1987:localhost:22 hostname-of-B
Na máquina C
eu tenho isso em ~/.ssh/config
:
Host hostB
User user-of-B
HostName hostname-of-B
Host hostA
User user-of-A
ProxyCommand ssh -o 'GatewayPorts yes' -q hostB nc -q0 localhost 1987
Para que eu possa conectar de C
a A
com:
ssh hostA
Esta configuração funcionou bem, até eu ter que trocar B
para outra máquina com uma conexão de internet pior. Agora tudo é super lento, mesmo que A
e C
tenham uma conexão excelente.
Então, pergunto-me se é possível, após estabelecer a conexão inicial de C
a A
a B
, estabelecer uma conexão direta de A
a C
. Assim, retirando B
da equação e tornando a conexão rápida novamente.
Não, isso não é possível. Você precisa de algo público para avançar. Ou para cada visibilidade de conexão de um servidor do outro.
Você provavelmente poderia evitar o B lento se tiver qualquer outra máquina X que tenha acesso ssh público. Essa pode ser sua máquina em casa ou uma máquina virtual pública alugada muito barata com boa conexão.
Em C você pode abrir um túnel reverso de X de volta para C:
ssh -Nf -R 10022:localhost:22 user-of-X@hostname-of-X
Então em A você adiciona outro "hop-config" via X
Host hostAviaX
User user-of-X
ProxyCommand ssh -o 'GatewayPorts yes'-q hostB nc -q0 localhost 10022
e em A ssh hostAviaX
deve funcionar.
Observe se A é sua máquina cliente em uma rede onde você está controlando o roteador, você pode habilitar o encaminhamento de porta para que A tenha acesso ssh público. Nesse caso, você não precisaria de outro X e poderia substituir X == A no exemplo acima.
Tags ssh