Túneles ssh

Una de las principales herramientas a la hora de conectarse con servidores linux es SSH esta permite usar claves privadas para conectarse evitando digitar el password y la conexión es encriptada lo que la hace segura.

SSH puede hacer mucho más luego de conectarse y abrir un shell remoto, ese es el tema de hoy. Los túneles SSH son túneles de comunicación encriptados creados a través de una conexión SSH. Actúa como una VPN muy especializada.

Algunos ejemplos para los cuales uso los túneles en mi día a día:

Conectarse a la base de datos remota

En un ambiente de producción seguro, la base de datos NUNCA debe estar expuesta al Internet, es decir que si queremos conectarnos con alguna herramienta como DataGrip o PHPStorm no se puede, a menos que creemos el túnel primero.

La idea es que el servidor si tiene acceso ssh, y es donde está instalada la base de datos pero la base no escucha en una interfaz externa solo en la local (127.0.0.1), por lo que podemos usar la conexión ssh a este servidor para conectarnos a la base de datos desde nuestro ambiente local.

ssh -L 3306:localhost:3306 servidor-remoto

Donde:

ssh -L <puerto-local>:localhost:<puerto-remoto> <gateway>

Una vez este se esté ejecutando, podemos usar cualquier herramienta para conectarnos a la base de datos en el host localhost puerto 3306 pero realmente nos estamos conectando a la base en el servidor.

Usar un servidor como SOCKS proxy

En el trabajo con uno de mis clientes, el ambiente de producción de la aplicación con la que trabajo está restringida geográficamente a usuarios de USA. Por lo que desde mi local no puedo acceder. Pero los servidores en AWS están en USA por lo que puedo hacer una conexión a estos servidores creando un proxy SOCKS y usando ese proxy en la configuración del navegador para acceder a esta aplicación a través del servidor.

ssh -N -D 1080 servidor-remoto

Este comando crea un proxy SOCKS en el puerto 1080 local. En la configuración de proxy del navegador escojen usar configuración de proxy manual, y en la casilla de SOCKS proxy colocan localhost y puerto 1080. Al aplicarlo están navegando y accediendo recursos como si estuvieran en USA.

Usar un servidor como ambiente de desarrollo

Hubo un tiempo en que mi laptop no estaba funcionando bien, y al cargarle de trabajo hacía que los ventiladores se encendieran y sonara mucho, para evitar eso por un tiempo decidí usar un servidor en AWS para ejecutar los proyectos en los que estaba trabajando para disminuir la carga en el local.

Los servidores en AWS por defecto siempre están protegidos por los grupos de seguridad que generalmente solo dan acceso a los puertos 80, 443 y 22. Pero en los proyectos con los que trabajo necesito poder acceder a los puertos 3306, 8080, 4200, 4300, 4400, 4500, 8081 etc que son los puertos que abren las herramientas de desarrollo/frameworks.

La opción fácil era abrir esos puertos en el grupo de seguridad, pero estaba haciendo al servidor más vulnerable.

La opción más segura es conectarse a ese servidor via ssh, y automáticamente hacer port forwarding. Esto se logra editando directamente el archivo ~/.ssh/config local se crea un host y se coloca los puertos que se enlazaran automáticamente cuando se conecte via ssh.

Ejemplo:

cat ~/.ssh/config
Host dev-marcelo
HostName 4.4.4.4 #IP del servidor
IdentityFile ~/.ssh/aws-marcelo.pem
ForwardAgent yes
# remote ports
LocalForward 9080 localhost:80
LocalForward 9443 localhost:443
LocalForward 3306 localhost:3306
LocalForward 8080 localhost:8080
LocalForward 8081 localhost:8081
LocalForward 4200 localhost:4200
LocalForward 4300 localhost:4300
LocalForward 4400 localhost:4400
LocalForward 4500 localhost:4500

Cuando hago

ssh dev-marcelo

Automáticamente tengo todos los puertos especificados ya enlazados, si por ejemplo ejecuto php -S localhost:8080 index.php en el servidor entonces puedo verlo en mi browser local como localhost:8080

Otros sitios de referencia para entender los túneles en inglés: