Corrija la configuración del archivo de configuración ssh para hacer un túnel a una tercera máquina

19

Estoy tratando de hacer un túnel a un servidor a través de un servidor puente. Hasta ahora, he podido hacer que funcione desde el shell de comandos correctamente usando el siguiente comando:

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

Pero he estado tratando de incluir esto en mi ~/.ssh/configarchivo y tengo problemas. He intentado:

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

Pero cuando lo hago, recibo el siguiente mensaje de error remoteserver.comy no estoy seguro de qué lo está causando:

ksh: SSH-2.0-OpenSSH_6.8 ^ M: no encontrado

Sé que cuando inicio sesión remoteserver.com, mi shell es /usr/bin/ksh.

Intenté agregar argumentos de ruta a los comandos ssh en el archivo de configuración, pero no hizo ninguna diferencia.

Alguna idea de lo que puede ser?

Eric B.
fuente
Simplemente no ProxyCommandes así como se debe usar. Por lo general, se usa con netcat donde ssh está canalizando su salida a través de él y netcat actúa como el túnel hacia el puerto SSH del servidor remoto . Necesita un ProxyCommand similar a ssh -W %h:%p [email protected]si desea usar esa función.
DanSut
Desafortunadamente, mi servidor bridge no tiene instalado netcat, así que estoy tratando de hacer que esto funcione de otra manera. Pensé que si podía funcionar desde la línea de comando, debería haber una manera de poner la información en un archivo de configuración.
Eric B.
En el uso de la línea de comandos que funciona ssh -A [email protected]como un comando para ejecutar en la máquina del puente, config no le proporciona una forma de proporcionar comandos predeterminados. Lo que intenta hacer worksen sí mismo, pero luego ssh intenta usar su ProxyCommandcomo un túnel y comienza a disparar el protocolo SSH hacia abajo donde hay un shell esperando en el otro extremo en lugar de un sshd que escucha el protocolo SSH.
DanSut
@dansut funcionó muy bien. ¡Gracias!
Eric B.

Respuestas:

24

La respuesta de Jakuje es correcta, pero desde OpenSSH 7.3, ahora puede usar -J ProxyJumpcuál es más fácil. Ver mis notas:

OpenSSH 7.3o superior

Uso ProxyJump. Como se explica en el manual:

-J [usuario @] host [: puerto]
Conéctese al host de destino haciendo primero una conexión ssh con el host de salto y luego estableciendo un reenvío TCP al destino final desde allí. Se pueden especificar varios saltos de salto separados por comas. Este es un acceso directo para especificar una directiva de configuración ProxyJump.

~/.ssh/configEjemplo 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 con

ssh server2_behind_server1 -v

Agregar -vpara salida detallada

Ejemplo de -Jlínea de comando de ProxyJump

~/.ssh/config

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

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

Conectar con

ssh server2 -J server1 -v

O usar -o

ssh server2 -o 'ProxyJump server1' -v

OpenSSH 5.4o superior

Usar ProxyCommandcon-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 con

ssh server2 -v

O usar -o

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

Abajo OpenSSH 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 con:

ssh server2 -v

O usar -o

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

Fuentes

-Jagregado en OpenSSH 7.3

  • ssh (1): Agregue una opción ProxyJump y el correspondiente indicador de línea de comando -J para permitir la indirección simplificada a través de uno o más bastiones SSH o "hosts de salto".

-Wagregado en OpenSSH 5.4

  • Se agregó un 'modo netcat' a ssh (1): "ssh -W host: port ..." Esto conecta stdio en el cliente a un único puerto hacia adelante en el servidor. Esto permite, por ejemplo, usar ssh como un ProxyCommand para enrutar conexiones a través de servidores intermedios. bz # 1618
GabLeRoux
fuente
3

No necesitas netcaten tu puente. Como DanSut propuso en los comentarios, puede usar la ssh -Wopción de línea de comando, esta configuración debería funcionar para usted:

Host axp
  User          remote_userid
  HostName      remoteserver.com
  IdentityFile  ~/.ssh/id_rsa.eric
  ProxyCommand ssh -AW %h:%p bridge_userid@bridge_userid.com
Jakuje
fuente
Funcionó. Gracias. No estoy seguro de por qué, pero estoy seguro de que ya lo había intentado una vez en fracaso, pero lo intenté nuevamente con éxito. Gracias.
Eric B.