Encadenar sesiones SSH o configurar saltos en SSH es necesario cuando urge acceder a un host remoto que no está accesible desde la actual posición, es decir, se necesita saltar por encima de uno o más servidores SSH intermedios hasta poder alcanzar el objetivo.
El procedimiento se basa en encadenar diferentes sesiones SSH desde la linea de comandos o bien configurar saltos en $HOME/.ssh/config hasta llegar al destino deseado, siendo esta última la opción recomendada.
Opción 1: Encadenar sesiones SSH hasta alcanzar host3. (host1 tiene el servicio ssh en el puerto 2222.)
ssh -A -p 2222 -t user@host1 ssh -A -p 22 -t user@host2 ssh -A -p 22 -t user@host3
Opción 2: Configuración de .ssh/config para llegar a host3 usando saltos (crea un canal / túnel).
Host host2 ProxyCommand ssh user@host1 -p 2222 -W %h:%p Host host3 ProxyCommand ssh user@host2 -W %h:%p
ssh root@host3
Opciones necesarias para que los saltos en SSH sean posibles. (Por defecto están activas)
Visualizar la configuración de SSH actualmente activa.
sshd -T | grep -i "allowtcpforwarding\|permitopen" allowtcpforwarding yes permitopen any
Si se quiere limitar qué servidores tienen acceso al forwarding, se puede cambiar “any” en PermitOpen por el/los host/s en cuestión.
PermitOpen host:port PermitOpen IPv4_addr:port PermitOpen [IPv6_addr]:port
NOTA: De ser más de uno se deben separar por espacios.
Ejemplo práctico.
Desde nuestra VM de área de trabajo en la oficina, la cual accede a cualquier servidor de la empresa (dominio *.intranet) se ha realizado un túnel reverso SSH a un VPS en Internet de nuestra propiedad. Esto es algo común para evitar restricciones que la empresa en cuanto a conexiones entrantes. De esta manera se puede tener acceso SSH a dicha VM del trabajo mediante nuestro servidor VPS en la Internet pública.
Ahora desde nuestra casa, sería interesante poder acceder a la VM del trabajo cómodamente saltando de host en host hasta llegar al destino, la VM de la oficina. Nuestro VPS en Internet mantiene el túnel en el puerto 11111, el cual está conectado de manera reversa con el puerto 22 de la VM en la oficina. Por lo tanto, si desde el VPS se hiciera un ssh a localhost usando el puerto 11111 se solicitarían las credenciales del SSH de la VM del trabajo.
[ Casa ] < ------- > [ 2222:VPS:11111 ] < ------- > [ 22:VM Trabajo ] < ------- > [22:web.intranet]
Este sería el fichero $HOME/.config que se necesitaría en casa.
# Conecta a VPS y una vez dentro, conecta con el puerto 11111 de localhost (VM de la oficina). Host curro ProxyCommand ssh root@VPS -p 2222 -W localhost:11111 # Una vez dentro de la VM del trabajo, se podría configurar otro salto para acceder a cualquier servidor de la empresa con el dominio *.intranet e intranet2. Host *.intranet ProxyCommand ssh root@curro -W %h:%p # Ejecuta los saltos hasta curro (VPS + VM) y una vez dentro, va al host *.intranet indicado en la linea de comandos. IdentityFile ~/.ssh_curro/id_rsa Host *.intranet2 ProxyCommand ssh root@curro -W %h:%p
# Conectar a la VM del trabajo. ssh user@curro # Conectar a web.intranet2 usando la llave ssh del trabajo que tenemos en el pc de casa. ssh -i .ssh_curro/id_rsa user@web.intranet2.
NOTA: Para dominios *.intranet no es necesario indicar la llave ya que se configuró “IdentityFile” en el “.ssh/config” de casa.
Usar multisaltos desde la linea de comandos.
# Usar multisaltos desde la linea de comandos para acceder a host2 sin usar .ssh/config. ssh -o ProxyCommand="ssh usuario@host1 -W %h:%p" usuario@host2
Opciones usadas de SSH para realizar los saltos.
Encadenar sesiones para acceder a web.intranet2 desde casa.
Al encadenar sesiones, el último comando requiere que la VM de la oficina contenga las llaves ssh si no se quiere usar contraseña para “root@web.intranet”. A diferencia de la configuración con saltos, al encadenar sesiones no se puede configurar qué llaves usar desde el origen casa. Tampoco se facilita el uso de *.dominio a la hora de acceder cómodamente a cualquier host interno de la empresa.
ssh -A -p 2222 -t root@VPS ssh -A -p 11111 -t root@localhost ssh -A -p 22 -t root@web.intranet2
NOTA: En el fichero config se pueden configurar las opciones de SSH que se quieran para incluir determinados parámetros de conexión como el uso de clave, cifrado, timeouts, etc.