Estoy intentando crear un túnel ssh para acceder a un servidor remoto (A) al que solo se puede acceder a través de otro servidor (B). Tengo una clave en mi máquina local (L) para llegar al servidor de retransmisión (B) y otra clave en el servidor de retransmisión (B) para llegar al servidor de destino (A).
[máquina local (L) con clave para el servidor de retransmisión (B)] --> [servidor de retransmisión (B) con clave para el servidor de destino (A)] --> [servidor de destino (A)]
Tengo un archivo ~/.ssh/config que se ve así en mi máquina local (L):
Host relay.server(B)
Hostname relay.server
Port 22
User me
IdentityFile ~/.ssh/id_rsa
Host destination.server(A)
Hostname destination.server
Port 1122
User me
IdentityFile ~/.ssh/id_rsa
Y puedo hacer que mi túnel funcione claramente con lo siguiente:
ejecutando el comando: ssh -N -L 1122:SERVER_PRIVATE_IP:22 relay.server(B)
en mi máquina local (L). Esto me solicita una contraseña para desbloquear la primera clave y luego parece que se bloquea, no devuelve un mensaje, usar la -f
opción o terminar con un &
me impide ingresar la contraseña. Sin embargo, si ejecuto ^C
este comando después de ingresar la contraseña y luego ingreso, ssh destination.server(A)
aparece un mensaje para proporcionar una contraseña para desbloquear la segunda clave, después de lo cual me conecto al servidor de destino (A).
Estoy buscando un comando único que me permita conectarme al servidor de destino (A) desde mi máquina local (L) y me pedirá que proporcione las contraseñas necesarias para desbloquear cada clave. O una sugerencia sobre una forma alternativa de organizar las cosas para poder conectarme directamente al servidor de destino (A) desde mi máquina local (L) a través del servidor de retransmisión (B).
Respuesta1
La respuesta corta es que necesitas
ProxyCommand
usandonc
para conectarse a través deForwardAgent
para pasar llaves- asegúrese de que su clave pública forme parte de
.ssh/authorized_keys
todos los servidores
Host relay Hostname relay.server.fqdn.or.IP User me IdentityFile ~/.ssh/id_rsa ForwardAgent yes Host destination Hostname destination.server.fqdn.or.IP User me IdentityFile ~/.ssh/id_rsa ProxyCommand ssh -q relay "nc %h %p" ForwardAgent yes
La porción más larga.
La ProxyCommand
opción en ssh config ejecuta un comando cada vez que Host
se utiliza ese carácter adjunto. Por lo general, se usa con nc
el disponible en nmap.org, también conocido como, ncat
y tiene muchas opciones.
En la Host destination
entrada anterior de ssh config, ProxyCommand
se configuró ssh -q relay "nc %h %p"
lo que dice, ssh para retransmitir silenciosamente y ejecutar nc destination.server.fqdn.or.IP 22
.
nc
realiza la conexión entre el ssh entrante y el destino.
Le ForwardAgent yes
dice a ssh que agregue la clave a un agente ssh. Los agentes ssh realizan un seguimiento de las claves y se utilizan para pasar automáticamente la correcta a un host según sea necesario. Le ForwardAgent yes
dice al agente que pase la clave a otro agente en el relé y luego nuevamente al destino.
Ahora, para que todo esto funcione, cada servidor al que acceda y, en última instancia, el destino debe tener la clave pública asociada con su clave privada (id_rsa) en su .ssh/authorized_keys
archivo. Cuando creó su clave privada, id_rsa, también debería haberse creado una clave pública, id_rsa.pub.
Si no tiene su clave pública, siempre puede obtenerla de la clave privada a través de ssh-keygen -y -f ~/.ssh/id_rsa
para copiar y pegar fácilmente. Tenga en cuenta que la clave pública tiene 2 o 3 campos separados por espacios pero estáunolínea.
Entonces, ssh relay
edite ~/.ssh/authorized_keys
(que puede no existir, por lo que mkdir -p ~/.ssh
puede ser necesario) y pegue la clave pública en una nueva línea (o en la primera si no está presente).
Mientras esté en el servidor de retransmisión, verifique que nc
exista en /bin o /usr/bin. Si no es así, deberá instalarlo usando su administrador de paquetes, ya sea yum o apt-get.
Desde el servidor de retransmisión ssh destination
y haga la misma actualización de ~/.ssh/authorized_keys
.
exit
hasta llegar a su máquina local y debería poderssh destination
Respuesta2
Las versiones más nuevas de OpenSSH ProxyJump
permiten .ssh/config
:
Host relay
Hostname relay.server.fqdn.or.IP
User me
IdentityFile ~/.ssh/id_rsa
ForwardAgent yes
Host destination
Hostname destination.server.fqdn.or.IP
ProxyJump relay
User me
IdentityFile ~/.ssh/id_rsa