¿SSH a través de múltiples hosts usando ProxyCommand?

11

Tengo una entrada en ~ / .ssh / config en mi computadora en casa que se ve así:

host foo bar
    ProxyCommand ssh -x -a -q gateway.example.com nc %h 22

donde gateway.example.comhay un servidor en el trabajo que está conectado tanto a Internet público como a una red interna. El cuadro de puerta de enlace resuelve foo y bar usando entradas en / etc / hosts.

Mi problema es que necesito alcanzar una caja que está al otro lado de foo. Llamémoslo "baz". El host "baz" está en otra red privada a la que está conectado foo, pero no a la que está conectada la "puerta de enlace".

He intentado usar esto:

host baz
    ProxyCommand ssh -x -a -q gateway/example.com ssh foo nc %h 22

Pero eso no funciona, y estoy un poco fuera de mi alcance. ¿Cómo hago esto?

No creo que deba importar, pero estoy haciendo esto en Ubuntu 10.

Graham
fuente

Respuestas:

13

Fácil.

Suponga la siguiente configuración de red:

ejemplo de configuración de red

Debería poder utilizar un archivo ~ / .ssh / config que se parece a esto:

host foo bar
    ProxyCommand ssh -x -a -q gateway.example.com nc %h 22

host baz
    ProxyCommand ssh -x -a -q foo nc %h 22

La idea aquí es que su SSH no sabe cómo llegar a "foo", por lo que un SSH no tendrá éxito. Y a partir de ahí, puedes "nc" a baz. Y si hay otros hosts en la red privada interna junto con "baz", puede agregarlos a la línea "host baz".

Básicamente, esto trata al host "foo" como la puerta de entrada a "baz", así como "gateway" es la puerta de entrada a "foo".

¿Claro?

ghoti
fuente
13

En cuanto a la respuesta de ghoti: en lugar de utilizar netcat ( "ssh ... nc %h 22"), a partir de OpenSSH 5.4, puede hacerlo directamente con: "ssh -W %h:22 ...". De esta manera, no tiene que preocuparse por si netcat está instalado en el lugar correcto.

Richard E. Silverman
fuente
1
Gran punto, gracias. Esta es una vieja pregunta, pero también podría aclarar que mientras ejecutaba Ubuntu en mi estación de trabajo, el servidor "gateway" era un viejo Busybox Linux con OpenSSH 5.3, y los servidores "foo" y "baz" eran FreeBSD (OpenSSH 5.4) Entonces habría necesitado al menos un netcat de todos modos.
Graham
@Graham No. Solo el cliente debe tener 5.4 o más para -Wpoder trabajar. Se basa en el código de reenvío de puertos en el lado del servidor, que es mucho más antiguo.
Kasperd
1

Usando las claves privadas almacenadas en su computadora local, ingrese este comando con las rutas de teclas privadas, los nombres de usuario de shell y los nombres de host / direcciones IP cambiados a sus necesidades ssh locales-> gateway-> de destino.

Tenga en cuenta que se prefiere ProxyCommand sobre el reenvío de agentes para mitigar el riesgo de comprometer la autenticación de clave privada (usando la puerta de enlace y la conexión del agente ssh local para comprometer más hosts como si el secuestrador tuviera la clave privada) cuando una puerta de enlace / jumperbox es secuestrada por root.

Comando único para proxy SSH a un servidor (mantenga ambas claves privadas en la computadora local):

sudo ssh -i dest_private_key.pem -o "ProxyCommand ssh -W %h:%p -i gate_private_key.pem gate_user@gate_IP" dest_user@dest_IP 
openyk
fuente
0

Esto es lo que hago para salir de la red protegida a Internet.

Estoy usando mi computadora portátil para trabajar con código en la compilación . Dado que la construcción está restringida del acceso a Internet, para clonar un repositorio de github.com, primero necesito saltar a la caja de herramientas , que tampoco tiene acceso a Internet. Pero puede acceder a gw , que tiene Internet.

Me gusta esto:

Esquema de salto SSH

Mi .ssh/configde acumulación :

Host gw
  ProxyCommand ssh -A -W %h:%p toolbox

Host github.com
  ProxyCommand ssh -A -W %h:%p gw

Explicación.

  1. El punto de vista es de construcción . No hay configuraciones en otros servidores.
  2. Primero, declaro que para llegar a gw debes hacerlo a través de la caja de herramientas .
  3. En segundo lugar, declaro que para llegar a github.com , debes hacerlo a través de gw . Internamente, SSH usa la regla anterior.
  4. En definitiva, ¡ git clone [email protected]:aRepo/Theresimplemente funciona!

¿Claro?

Jari Turkia
fuente