Túneles SSH
Habitualmente en el trabajo necesito hacer túneles SSH. Nos conectamos por VPN a la red de un cliente, con un firewall de por medio. Son muy reticentes (y muy lentos) en dar permisos. Como al menos siempre tenemos SSH, podemos encapsular tráfico en él. También es útil para conectar a una red inalcanzable detrás de un servidor al que sí tenemos acceso.
La sintaxis es:
ssh -N -L <puerto_local>:<ip_vista_desde_remoto>:<puerto_remoto> usuario@remoto
ssh -N -R <puerto_remoto>:<ip_vista_desde_local>:<puerto_local> usuario@remoto
La -L es forwarding «local», y la -R forwarding «remoto». -L abre un puerto en nuestro ordenador, y -R en remoto. Lo de «vista desde» es importante y lo más confuso. En muchos ejemplos se suele utilizar «localhost»: con -L significa nuestra propia máquina, con -R la máquina remota.
Por ejemplo, para conectarme por VNC a ip_inalcanzable
escuchando en el puerto 5901, visible sólo a través de un servidor ip_alcanzable
:
ssh -N -L 5900:<ip_inalcanzable>:5901 usuario@<ip_alcanzable>
Desde mi ordenador abro un cliente VNC y me conecto a localhost, puerto 5900.
Forward local nos da acceso a servicios que están remoto. Si el servicio está en local, de nuestro lado, emplearemos forwarding remoto (-R). Suelo utilizar esto para depurar remotamente un servidor PHP con Xdebug:
ssh -N -R 9000:localhost:9001 root@192.168.136.75
Esto abre el puerto 9000 en remoto, donde Xdebug hace de cliente. Hay otro Xdebug escuchando en el puerto 9001 de nuestro ordenador (localhost), como servidor.