Haga que ssh resuelva los nombres de host de la configuración cuando use ProxyCommand y el modo netcat

16

Estoy tratando de configurar algunas opciones universales para rebotar conexiones ssh. Aquí está mi ~/.ssh/configarchivo, abreviado:

Host *%via
  ProxyCommand ssh gateway -W $(echo %h | cut -d%% -f1) %p

Host gateway
  HostName gateway.example.com
  User username
  ForwardAgent yes
  IdentityFile keypathg

Host target
  User username
  HostName target.example.com
  IdentityFile keypatht

Cuando utilizo *%vialos Hostalias, obtengo:

% ssh -vvv target%via
OpenSSH_5.9p1, OpenSSL 0.9.8y 5 Feb 2013
debug1: Reading configuration data /Users/myuser/.ssh/config
debug1: /Users/myuser/.ssh/config line 5: Applying options for *
debug1: /Users/myuser/.ssh/config line 12: Applying options for *%via
debug1: Reading configuration data /etc/ssh_config
debug1: /etc/ssh_config line 20: Applying options for *
debug1: auto-mux: Trying existing master
debug1: Control socket "/Users/myuser/.ssh/tmp/target%via_22_myuser" does not exist
debug2: ssh_connect: needpriv 0
debug1: Executing proxy command: exec ssh -A gateway -W $(echo target%via | cut -d% -f1):22
debug1: permanently_drop_suid: 501
debug1: identity file /Users/myuser/.ssh/id_rsa type -1
debug1: identity file /Users/myuser/.ssh/id_rsa-cert type -1
debug1: identity file /Users/myuser/.ssh/id_dsa type -1
debug1: identity file /Users/myuser/.ssh/id_dsa-cert type -1
ssh_exchange_identification: Connection closed by remote host

Sin embargo, si utilizo

% ssh target.example.com%via

Llegué al servidor de destino, pero como usuario incorrecto y sin autenticación de clave pública.

Creo que mi pregunta, en este punto, es si este método de rebote, cuando lo utilizo ForwardAgent, pasa a través de toda mi configuración / entorno ssh, o solo las teclas. Si solo son claves, ¿se puede utilizar la primera de alguna manera?

Mi versión ssh es 5.9v1, la puerta de enlace es 5.9v1 y el objetivo es 5.3p1. Creo que -Wse introdujo en 5.4, pero eso no debería importar para el cuadro final en línea. La utilización de la escuela anterior ncno parece diferente.

He verificado que puedo ssh manualmente a cada cuadro en la línea. Hacerlo indica que no se pasa la información del alias del nombre de host, ya que cuando estoy en la puerta de enlace, no puedo ssh targetpero puedo ssh target.example.com. Esto funciona con pubkey auth. La puerta de enlace y el destino tienen el mismo nombre de usuario, por lo que esto funciona si no se empuja ninguna configuración.

Si ForwardAgentuna configuración similar no puede enviar esta información, ¿cuál es la forma más segura de evitarla, manteniendo un .ssh / config en la puerta de enlace con esta información?

Joshua Hogendorn
fuente

Respuestas:

14

Wow, gracias por hacer esta pregunta. Me resulta raro ver a alguien explotando completamente SSH y esta pregunta llega a un par de áreas.

Esto no es un ProxyCommandproblema. El ProxyCommandsimplemente indica al cliente ssh local para hacer algo en la preparación antes de intentar hablar con el cliente remoto. Sí, en nuestra instancia, hablamos con otra sesión ssh, pero esa sesión, -Wsimplemente toma nuestra entrada y la reenvía a otra máquina. Puedes pensar que esa sesión preparatoria de SSH es completamente independiente. Inevitable analogía del automóvil: su automóvil es el mismo, independientemente de si tuvo que viajar en ferry para ir del punto A al punto B.

Esto no es un ForwardAgentproblema. ForwardAgenthace que el cliente local proporcione una instalación que haga que las claves locales estén disponibles dentro del entorno de la sesión remota. No ha pasado de establecer la sesión remota.

Es un .ssh/configproblema de formato. Tenga en cuenta la segunda y tercera líneas de depuración1. Enumeran qué estrofas del Host se están aplicando desde tu .ssh/config. Usted nota que $ ssh target.example.com%viafunciona, pero como nombre de usuario y clave incorrectos. Bueno, la estrofa de Host targetno se está leyendo (lo que proporcionaría el nombre de usuario y el archivo de claves correctos). ¿Qué estrofas se usan? *y *%via.

¿Cómo hacer que pasen estas opciones? Bueno, lo suficientemente interesante, el comodín coincide con 0 cadenas de longitud. Host target*coincidirá con target, target%via, target.example.comy target.example.com%via.

Y entonces usted hace la pregunta, sería establecer una ayuda .ssh/configen la gatewaymáquina. No, no lo haría. Nunca se leería. Todo sucede desde nuestra máquina local.

Todo lo que he explicado, solo responde por qué $ ssh target.example.com%viano funciona.

Lo prefiere $ ssh target%via. Con razón, es más conveniente. La forma abreviada falla porque, como nombre de host, targetno se encuentra; No se está resolviendo. ¿Por qué no no está arrojando ssh ssh: Could not resolve hostname target: Name or service not known:? Porque ProxyCommandya se ha establecido con éxito. Se han creado elementos de una conexión ssh, pero la falla del nombre de host está sucediendo donde no se esperaba, y por lo tanto está bombardeando con el mensaje más genérico. Presentaría un informe de error sobre esto, para ayudar a identificar dónde podría mejorarse la información de depuración.

Comentario final:

Me gusta la Host *%viasintaxis. Es limpio, pero flexible. Lo había visto anteriormente Host *+*y usa tanto la primera como la última parte del %h(ost)para determinar a dónde ir. Pero se necesita un poco más de esfuerzo para entenderlo. link: http://wiki.gentoo.org/wiki/SSH_jump_host

Hefeweizen
fuente