===== SSH multisalto / Encadenar sesiones SSH para llegar a destinos sin conexión directa =====
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)
* AllowTCPForwarding: No presente o comentada en la configuración o configurada como “yes”
* PermitOpen No presente o comentada en la configuración o configurada como “any”.
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**.
* **-o ProxyCommand=** Comando a usar para conectar con el servidor. %h refiere al nombre del host y %p al puerto.
* **-W** Solicita que el stdin y stdout del cliente se reenvíen al equipo y puerto sobre el canal seguro. Esto implica las opciones -N, -T, ExitOnForwardFailure y ClearAllForwardings. Esto es solo realizable con la versión 2 del protocolo ssh.
**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.