Túneles ssh
Tags: tip, desarrollo, ssh
Published: 2021-03-09 14:16:02

---
title: 'Túneles ssh'
published: true
tags: ['tip', 'desarrollo', 'ssh']
canonical_url: https://marceloandrader.github.io/blog/2021/03/09/t%C3%BAneles-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.

```bash
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.

```bash
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](https://marceloandrader.github.io/blog/2021/01/20/php-web-server/) 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:

- [A visual guide to SSH tunnels](https://robotmoon.com/ssh-tunnels/)
- [SSH Tunneling Explained](https://chamibuddhika.wordpress.com/2012/03/21/ssh-tunnelling-explained/)