Método 1 - cebola (túneis aninhados)
Com o OpenSSH 7.3 e posterior:
Host webserverA
ProxyJump bastionA,bastionB
O mesmo via linha de comando:
$ ssh -J bastionA,bastionB webserverA
Alternativamente (também com 7.3; não misture isto e acima):
Host webserverA
ProxyJump bastionB
Host bastionB
ProxyJump bastionA
Com versões mais antigas - praticamente idênticas (mas não copia automaticamente opções como ssh -v
):
Host webserverA
ProxyCommand ssh bastionB -W %h:%p
Host bastionB
ProxyCommand ssh bastionA -W %h:%p
Este método inicia todas as conexões localmente, configurando um túnel ssh -W
para cada etapa. Portanto, a autenticação acontece localmente (o ForwardAgent e o GSSAPIDelegateCredentials não são necessários) e o seu local .ssh/config
também se aplica a cada etapa. Do lado do servidor, apenas o suporte básico de "TCP forwarding" é necessário, mesmo quando se usa -W
ou -L
.
No entanto, cada camada adiciona sobrecarga extra, uma vez que acaba carregando SSH no SSH em SSH no SSH.
Observe que cada host, exceto o mais externo, lista um ProxyCommand através do servidor imediatamente antes dele. Se você tivesse 3 servidores, usaria [webserverA via bastionC], [bastionC via bastionB] e [bastionB via bastionA].
Método 2 - hop by hop
Host webserverA
ProxyCommand ssh bastionA -A ssh bastionB -W %h:%p
Este método inicia conexões hop por hop, executando ssh
em cada salto para se conectar ao próximo. Portanto, um agente ssh e ForwardAgent
devem estar ativados (ou GSSAPIDelegateCredentials
se você usar o Kerberos); quaisquer outras configurações especiais de .ssh/config
devem ser copiadas para todos os hosts de bastiões.
Por outro lado, implica menos sobrecarga de protocolo (máx. duas camadas em cada etapa).
(Editar: adicionou -A
para sempre solicitar o encaminhamento do agente.)