O encaminhamento de porta SSH via host de salto, arquivos ssh_config e ONLY “targethost ssh”

1

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:

  1. máquina foo é um host de salto e fornece acesso ao host bar por meio de seu localhost:10022
  2. 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:

  1. 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 .
  2. 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 .
  3. 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.

    
por 0xC0000022L 27.03.2018 / 22:57

1 resposta

1

Primeiro, com o seu tipo de configuração, o que funcionaria , exigindo de qualquer maneira dois ssh:

Host foo
    LocalForward 10022:bar:22

Host bar
    Hostname localhost
    Port 10022
    LocalForward 33389 rdp:3389

term1$ ssh foo # or use ssh -f -N -o ExitOnForwardFailure=yes foo for background task
term2$ ssh bar

O que você realmente precisa não seria o RemoteCommand, mas o ProxyJump, realmente simplificando sua configuração, com o objetivo alcançado somente com:

ssh -L 33389:rdp:3389 -J foo bar

Ou a configuração equivalente (somente):

Host bar
    ProxyJump foo
    LocalForward 33389 rdp:3389

Com porta intermediária zero necessária.

Infelizmente, o ProxyJump está disponível apenas a partir do openssh 7.3

Mas é facilmente substituído pelo ProxyCommand / -W combo estavam usando antes.

ssh -L 33389:rdp:3389 -o 'ProxyCommand=ssh foo -W %h:%p' bar 

ou como arquivo de configuração:

Host bar
    ProxyCommand ssh -W %h:%p foo
    LocalForward 33389 rdp:3389

Ainda existem dois ssh em execução: o oculto é o único como ProxyCommand parâmetro ainda em execução no host local fazendo o link usando um par de pipes com o principal ssh, ao invés de uma porta extra tcp. Tentando envolver o host intermediário em participar com o encaminhamento de porta é inseguro ou pode entrar em conflito (outros usuários do foo podem acessar o túnel ou usar a mesma porta) e propensos a erros. As extremidades do túnel devem sempre ser mantidas no host do cliente, se possível, onde há controle total. Os túneis intermediários não devem existir ou apontar para o próximo ponto de entrada ssh (esse é o uso de -W aqui).

    
por 31.03.2018 / 20:09