Corrigir as configurações do arquivo de configuração ssh para encapsular em uma terceira máquina

19

Estou tentando encapsular um servidor por meio de um servidor ponte. Até agora, consegui fazê-lo funcionar a partir do shell de comandos corretamente, usando o seguinte comando:

ssh -A -t bridge_userid@bridgemachine.com ssh -A remote_userid@remoteserver.com

Mas eu tenho tentado agrupar isso no meu ~/.ssh/configarquivo e tenho problemas. Eu tentei:

Host axp
  User          remote_userid
  HostName      remoteserver.com
  IdentityFile  ~/.ssh/id_rsa.eric
  ProxyCommand ssh -A -t bridge_userid@bridge_userid.com ssh -A remote_userid@%h

Mas quando recebo, recebo a seguinte mensagem de erro remoteserver.come não sei ao certo o que está causando isso:

ksh: SSH-2.0-OpenSSH_6.8 ^ M: não encontrado

Eu sei que quando eu entro remoteserver.com, meu shell é /usr/bin/ksh.

Eu tentei adicionar argumentos de caminho aos comandos ssh no arquivo de configuração, mas não fez diferença.

Alguma idéia do que pode ser?

Eric B.
fonte
Não ProxyCommandé assim que se destina a ser usado. Normalmente, ele é usado com o netcat, onde o ssh está canalizando sua saída através dele e o netcat está atuando como um túnel para a porta SSH do servidor de controle remoto . Você precisa de um ProxyCommand semelhante a ssh -W %h:%p [email protected]se quiser usar esse recurso.
DanSut 9/10/2015
Infelizmente, meu servidor bridge não possui o netcat instalado, então estou tentando fazer com que isso funcione de outra maneira. Imaginei que, se pudesse funcionar na linha de comando, deveria haver uma maneira de colocar as informações em um arquivo de configuração.
Eric B.
No uso da linha de comando que funciona ssh -A [email protected]como um comando para executar na máquina ponte, o config não fornece uma maneira de fornecer comandos padrão. O que você tenta fazer workspor si só, mas o ssh tenta usar o seu ProxyCommandcomo um túnel e começa a disparar o protocolo SSH para baixo, onde há um shell aguardando na outra extremidade, em vez de um sshd escutando o protocolo SSH.
DanSut 9/10/2015
@dansut funcionou muito bem. Valeu!
Eric B.

Respostas:

24

A resposta de Jakuje está certa, mas desde o OpenSSH 7.3, agora você pode usar o -J ProxyJumpque é mais fácil. Veja minhas anotações:

OpenSSH 7.3ou superior

Use ProxyJump. Conforme explicado no manual:

-J [usuário @] host [: porta]
Conecte-se ao host de destino, primeiro fazendo uma conexão ssh com o host de salto e, em seguida, estabelecendo um encaminhamento TCP para o destino final a partir daí. Vários saltos de salto podem ser especificados separados por caracteres de vírgula. Este é um atalho para especificar uma diretiva de configuração ProxyJump.

~/.ssh/configExemplo de ProxyJump

~/.ssh/config

Host server1
  Hostname server1.example.com
  IdentityFile ~/.ssh/id_rsa

Host server2_behind_server1
  Hostname server2.example.com
  IdentityFile ~/.ssh/id_rsa
  ProxyJump server1

Conectar com

ssh server2_behind_server1 -v

Adicionar -vpara saída detalhada

Exemplo de -Jlinha de comando ProxyJump

~/.ssh/config

Host server1
  Hostname server1.example.com
  IdentityFile ~/.ssh/id_rsa

Host server2
  Hostname server2.example.com
  IdentityFile ~/.ssh/id_rsa

Conectar com

ssh server2 -J server1 -v

Ou use -o

ssh server2 -o 'ProxyJump server1' -v

OpenSSH 5.4ou superior

Use ProxyCommandcom-W

~/.ssh/config

Host server1
  Hostname server1.example.com
  IdentityFile ~/.ssh/id_rsa

Host server2
  Hostname server2.example.com
  IdentityFile ~/.ssh/id_rsa
  ProxyCommand ssh server1 -W %h:%p

Conectar com

ssh server2 -v

Ou use -o

ssh server2 -o 'ProxyCommand ssh server1 -W %h:%p' -v

OpenSSH abaixo 5.4

~/.ssh/config

Host server1
  Hostname server1.example.com
  IdentityFile ~/.ssh/id_rsa

Host server2
  Hostname server2.example.com
  IdentityFile ~/.ssh/id_rsa
  ProxyCommand ssh server1 nc %h %p 2> /dev/null

Conectar com:

ssh server2 -v

Ou use -o

ssh server2 -o 'ProxyCommand ssh server1 nc %h %p 2> /dev/null' -v

Fontes

-Jadicionado no OpenSSH 7.3

  • ssh (1): adicione uma opção ProxyJump e o sinalizador de linha de comando -J correspondente para permitir a indireção simplificada por meio de um ou mais bastiões SSH ou "jump hosts".

-Wadicionado no OpenSSH 5.4

  • Adicionado um 'modo netcat' ao ssh (1): "ssh -W host: porta ..." Isso conecta o stdio no cliente a uma única porta encaminhada no servidor. Isso permite, por exemplo, usar ssh como um ProxyCommand para rotear conexões por meio de servidores intermediários. bz # 1618
GabLeRoux
fonte
3

Você não precisa netcatna sua ponte. Como o DanSut propôs nos comentários, você pode usar a ssh -Wopção de linha de comando, essa configuração deve funcionar para você:

Host axp
  User          remote_userid
  HostName      remoteserver.com
  IdentityFile  ~/.ssh/id_rsa.eric
  ProxyCommand ssh -AW %h:%p bridge_userid@bridge_userid.com
Jakuje
fonte
Funcionou. Obrigado. Não sei por que, mas tenho certeza de que já tentei uma vez com falha, mas tentei novamente com sucesso. Obrigado.
Eric B.