Eu tenho um caso semelhante (ainda mais complexo) recentemente e consegui resolver o problema.
A resposta curta: use ProxyCommand
em vez de encaminhamento pelo agente.
A longa história:
No meu caso, quatro hosts estão envolvidos:
- desktop Linux no meu escritório
- Servidor VPN Linux em algum lugar da Internet
- Servidor inicial Linux no meu apartamento
- laptop Linux no meu apartamento
O roteador no meu apartamento não recebe endereço público do ISP, portanto, os portáteis e os servidores domésticos estão atrás do NAT duplo, de maneira nenhuma eu posso fazer o encaminhamento de porta ou algo assim porque não consigo controlar dispositivos ISP. Por algum motivo, o servidor inicial está sempre conectado a um servidor VPN com endereço público. Dessa forma, posso ssh -A
no servidor VPN e ssh -A
no servidor inicial e, finalmente, ssh
no meu laptop doméstico.
Mas às vezes eu preciso transferir arquivos. Eu não quero rsync
/ scp
várias vezes hop por hop.
ProxyCommand
vem para resgatar. Coloque isso no ~/.ssh/ssh_config
:
# Host A is a VPN gateway with public address.
Host a.example.org
HostName 1.2.3.4
# Host B is a home server / gateway with no public address.
# It's connected to host A via VPN.
Host b.example.org
HostName 10.255.255.100
ProxyCommand ssh -W %h:%p a.example.org
# Host C is my home laptop.
Host c.example.org
HostName 192.168.2.100
ProxyCommand ssh -W %h:%p b.example.org
# vim: ft=sshconfig:
Isso pode ser indefinidamente encadeado. Você pode manter o encadeamento do host D, host E, etc., desde que seus hosts tenham conexões rápidas. Não há necessidade de fazer ssh -L
ou ssh -D
hop pelo salto manualmente e conectar através de portas não padrão. Agora posso fazer ssh c.example.org
diretamente de qualquer lugar, desde que eu possa me conectar a a.example.org
. É claro que outros protocolos baseados em SSH, como Rsync, SCP, SFTP, etc., são automaticamente suportados.