NB: Os clientes do OpenSSH que estou usando estão todos na versão 7.2 , portanto não há RemoteCommand disponível.
Assuma a seguinte configuração:
- máquina
foo é um host de salto e fornece acesso ao host bar por meio de seu localhost:10022
-
bar fica dentro de uma rede dentro da qual podemos acessar o host rdp e acessar sua porta RDP (3389). Na verdade, dou o IP de rdp dentro de minhas linhas de comando e configuração, mas presumo que seja legítimo usar seu nome, desde que a pesquisa de nomes funcione. Por brevidade, estou usando rdp aqui.
O objetivo agora é obter acesso a rdp:3389 conectando-se a bar através do host de salto foo e encaminhá-lo para localhost:33389 na máquina local da qual estou invocando ssh bar .
[local:33389] --> {foo} --> {bar} --> [rdp:3389]
Interlúdio
Eu resolvi isso anteriormente com o PuTTY da seguinte forma:
- crie uma conexão com
foo e configure um encaminhamento local -L 33389:localhost:33389 , vinculando localhost:33389 na máquina local a localhost:33389 on foo .
- use o seguinte comando remoto para transportar o encaminhamento de porta para a rede dentro da qual
bar fica passando ssh -L 33389:rdp:3389 -A bar .
-
Host bar está configurado em foo dentro de .ssh/config para se conectar a localhost:10022 e, assim, acabar em bar através do host de salto.
A configuração do PuTTY funciona como um encanto, mas depende de um comando remoto para ser executado. Enquanto um alias de shell seria uma maneira de fazer isso, eu queria saber se existe uma maneira de manter tudo dentro do ssh_config(5) usado pelo meu cliente, usando ProxyCommand ?
Um equivalente aproximado da configuração PuTTY acima é este:
ssh -L 33389:localhost:33389 foo ssh -t -L 33389:rdp:3389 -p 10022 localhost
ou, desde que Host bar esteja configurado em foo para passar por localhost:10022 de foo :
ssh -L 33389:localhost:33389 foo ssh -t -L 33389:rdp:3389 bar
E isso parece fazer o trabalho.
Mas é claro que isso é suficiente para digitar e seria melhor colocar este all no arquivo de configuração e simplesmente digitar ssh bar na máquina local.
Com RemoteCommand como introduzido no OpenSSH 7.6, isso parece ser bastante trivial:
Host bar
HostName foo
RemoteCommand ssh -L 33389:rdp:3389 -A -p 10022 localhost
LocalForward 33389 localhost:33389
... o que deve ser traduzido aproximadamente para a invocação de ssh mostrada acima. Mas, como mencionado anteriormente, estou usando uma versão mais antiga (compactada) do OpenSSH sem suporte para a sub-rotina RemoteCommand .
Aqui está a tentativa que parece chegar mais perto do que eu quero alcançar.
Host bar
HostName localhost
Port 10022
ProxyCommand ssh -L 33389:localhost:33389 -W %h:%p foo
LocalForward 33389 rdp:3389
A idéia é que na máquina local eu simplesmente invoco ssh bar . Na verdade, funciona porque acabei no prompt do shell de bar , mas o encaminhamento de porta não funciona. Enquanto sudo lsof -i|grep 3389 na máquina local me dá:
ssh 15271 accden 6u IPv6 7933201 0t0 TCP localhost:33389 (LISTEN)
ssh 15271 accden 7u IPv4 7933202 0t0 TCP localhost:33389 (LISTEN)
No host de salto, não vejo nada escutando em nenhuma porta que contenha 3389 .
Como ProxyCommand estabelece a conexão com foo e estou dando um LocalForward para a conexão com bar , espero que isso funcione.
O que estou fazendo de errado?
A meta é usar ssh bar para se conectar a bar e, ao mesmo tempo, disponibilizar rdp:3389 na máquina local como localhost:33389 . Ajustar os arquivos ssh_config(5) na máquina local e foo são permitidos. No entanto, passar comandos remotos não é uma resposta válida.