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.