
Me gustaría establecer un túnel SSH a través de un host de salto de Linux de la siguiente manera:
El host A está basado en Windows y tiene una clave privada para autenticarse con el host de salto (Host B). El host B está basado en Linux y tiene un usuario diferente con una clave privada para autenticarse con los hosts en DMZ. El host C está basado en Windows y solo se puede acceder desde el host B a través de SSH (o físicamente). Lo he intentado ssh -v -N user2@HostC -J user1@HostB -L [port]:HostC:[remote_port]
y está funcionando, pero solo con una contraseña, sigue solicitándola a pesar de tener claves en todos los hosts necesarios.
¿Alguien podría ayudar con este tema?
PD: Funciona si uso el mismo par de claves en los tres hosts, pero me gustaría usar diferentes usuarios con diferentes pares de claves por razones de seguridad.
Respuesta1
Notas preliminares
- No uso Windows pero espero que no importe mucho.
- A menudo, cuando digo "A", "B", "C", en realidad me refiero a "el usuario de A", "usuario1 de B", "usuario2 de C", respectivamente. Por ejemplo, "la clave de B" significa "la clave del usuario1 disponible en B". Esto es por brevedad.
Análisis
Esto escomo -J
funciona:
-J destination
Conéctese al host de destino realizando primero una conexión ssh al host de salto descrito pordestination
y luego estableciendo un reenvío TCP al destino final desde allí.
Esto significa ssh -J user1@B user2@C
esnoequivalente a conectarse de A a B y luego de B a C. Es equivalente a conectarse de A a B y luego de A a C (usando paquetes reenviados a través de B). No se invoca ningún cliente SSH en B, por lo que nunca se utiliza la clave que le permite conectarse de B a C.
Solución
La forma más elegante de resolver el problema general es hacer que C acepte la (o una) clave de A. Usted dijo:
Funciona si uso el mismo par de claves en los tres hosts, pero me gustaría usar diferentes usuarios con diferentes pares de claves por razones de seguridad.
Puedes utilizar diferentes pares. Entiendo que actualmente hay un par de claves que le permite conectarse de A a B y un par separado que permite de B a C. Esto último es irrelevante. En C, autorice cualquier clave que A utilice para autenticarse. Puede ser la llave antigua (la que ya está autorizada en B); pero puede ser una nueva clave creada exclusivamente para esta conexión.
Luego, cuando lo hagas ssh -J user1@B user2@C
en A, necesitas usar la clave que permite que A se conecte a B.yla clave que permite que A se conecte a C. Si son claves diferentes, debes usar ambas. Usar-i
una o incluso dos veces si es necesario.
Solución alternativa
Puede usar las claves ya registradas si realmente se conecta de B a C después de conectarse de A a B. Si desea iniciar sesión de A a C, entonces sería como:
# from A
ssh -t user1@B 'ssh user2@C'
(al menos en Linux; no estoy seguro de cómo funcionan las citas en Windows).
Este comando se ejecuta ssh
en B para conectarse a C, por lo que utilizará la clave de B.
Acerca del reenvío de puertos
Su comando original usaba -N
y -L
, por lo que entiendo que el único objetivo es reenviar un puerto. Reenvió el puerto mediante la conexión A a C y el destino también era C; por lo que el último tramo de los paquetes reenviados fue desde el servidor SSH de C a C.Tal vezse [remote_port]
puede acceder a él desde B. Si es así, entonces no necesita ninguna de las soluciones anteriores; todo lo que necesitas es:
ssh -NL [port]:C:[remote_port] user1@B
Esto hará que el último tramo de los paquetes reenviados sea del servidor SSH de B a C.
Si el último tramo debe ser de C a C, entonces el curso de acción depende de la solución que elija.
La solución con la clave A autorizada en C le permitirá utilizar su comando original sin contraseñas.
La solución al ejecutarse
ssh
en B requerirá que reenvíe el puerto de A a B y por separado de B a C. Algo como:ssh -L [port]:localhost:[relay_port] user1@B 'ssh -NL [relay_port]:C:[remote_port] user2@C'