Los tuneles ssh son un mecanismo muy útil en ciertas ocasiones. Por ejemplo, imaginad que tenéis un servicio que no utiliza ningún tipo de encriptacíon, y quereis conectaros a el de forma segura, o quereis conectar a un servidor y quereis ocultarle a este vuestra dirección ip.
Caso práctico 0
Vamos a ver dos ejemplos, primero, vamos a conectarnos al finalServer desde el client, pero vamos a utilizar el jumpServer para ocultarnos detrás de el.
Primero, vamos a ver que si nos conectamos directamente al finalServer desde client en sus logs podremos ver claramente nuestra ip (10.163.200.244)
Tiramos un curl 10.163.200.238
y vemos que finalServer marca que se han conectado desde la ip 10.163.200.244, es decir, desde el client.
Bien, ahora vamos a crear el tunel, lo haremos de la siguiente forma:
ssh -N -L 80:10.163.200.238:80 root@10.163.200.182
Con este comando, estamos diciendo, que se enrute el trafico de localhost:80 a 10.163.200.238:80 utilizando la conexión ssh root@10.163.200.182,
Una vez hecho esto, podemos tirar un curl localhost
y en el log veremos log de finalServer veremos lo siguiente:
Como podemos ver en la imagen, esta vez, finalServer piensa que la conexión procede de jumpServer(10.163.200.182).
En realidad esto es verdad, ya que client, se conecta a jumpServer por ssh puerto 22 y desde ahí se hace la petición a finalServer puerto 80
Caso práctico 1.
En dockerServer(10.163.200.67) instalamos docker, y vamos a levantar un contenedor con couchdb. En la primera prueba, vamos a exponer el puerto 5984 del contenedor, de tal forma que nos podamos conectar al couchdb desde nuestra máquina.
root@dockerServer:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9c08a6584cae apache/couchdb:2 "/opt/couchdb/bin/co…" 49 seconds ago Up 47 seconds 4369/tcp, 9100/tcp, 0.0.0.0:5984->5984/tcp boring_dubinsky
Esto tiene varios problemas, lo primero, es que en las versiones 2.x de couchdb podemos levantar la base de datos sin establecer una contraseña, con lo cual cualquiera que se de cuenta de que tenemos ahi un couchdb, podría conectarse.
También podemos ver que la conexión se hace por http, lo que quiere decir que nuestros datos no van encriptados.
Por un lado nuestro couchdb esta colgado en un server, y nosotros queremos poder conectarnos a el de forma remota. Por otro, no queremos exponer couchdb al público.
¿Cómo podemos hacer esto?
Exacto, con un tunel.
Para esto necesitamos saber la ip que tiene nuestro contenedor. Esto lo hacemos con docker inspect nombredelcontenedor
root@dockerServer:~# docker inspect boring_dubinsky | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
Bien, ahora vamos a tirar el contenedor docker con la couchdb, y lo vamos a lanzar esta vez sin exponer el puerto 5984
root@dockerServer:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fb0c41e6ad8a apache/couchdb:2 "/opt/couchdb/bin/co…" 22 seconds ago Up 20 seconds 4369/tcp, 5984/tcp, 9100/tcp hopeful_burnell
Seguramente, la ip del contenedor docker haya cambiado, así que vamos a comprobarlo.
root@dockerServer:~# docker inspect hopeful_burnell | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
Bien, en este caso no ha cambiado. Vamos a intentar conectarnos como lo hicimos anteriormente, atacando directamente al servidor que contiene el docker.
Como podemos comprobar, no podemos conectarnos, ya que no hemos expuesto el puerto del contenedor docker.
Ahora creamos nuestro tunel:
athos@athos-Z97P-D3:~$ ssh -N -L 5984:172.17.0.2:5984 root@10.163.200.67
The authenticity of host '10.163.200.67 (10.163.200.67)' can't be established.
ECDSA key fingerprint is SHA256:YmdrAnJ9XmxZ8O7T+uxwjgfL5jvCcN4OCwsd4VZBSEg.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.163.200.67' (ECDSA) to the list of known hosts.
El primer 5984 es el puerto local que queremos redireccionar, 172.17.0.2:5984 es la ip de nuestro contenedor docker y el puerto donde está nuestro couchdb, y 10.163.200.67 es la ip del servidor que contiene el docker.
Una vez hecho esto, con el tunel conectado, podemos acceder al couchdb a través de localhost:5984
Esta vez, vemos que sí podemos conectarnos.
Por último, vamos a modificar un poco el tunel, para ahorrarnos tener que poner el puerto en el navegador. Crearemos el tunel de la siguiente forma:
athos@athos-Z97P-D3:~$ sudo ssh -i ~/.ssh/id_rsa -N -L 80:172.17.0.2:5984 root@10.163.200.67
Los cambios que hemos hecho son los siguientes:
Primero, hemos tenido que tirar el comando con sudo, ya que sino el sistema operativo no nos permite trabajar con los puertos conocidos (del 1 al 1024 si no recuerdo mal)
Al hacer esto, cuando creamos la conexión ssh, por defecto se esta utilizando la clave privada del usuario que ejecuta el comando, que al hacerlo con sudo es root. Como en el servidor de los dockers no tengo introducida las clave pública de root, le paso al ssh el parámetro -i y le indico la clave a utilizar.
Ahora probamos a ver si todo esto funciona
Como podemos ver, ahora ya no nos hace falta indicar el puerto 5984 en la url.
Como conclusión, diré que los tuneles ssh pueden ser muy útiles en muchos casos, así que te recomiendo trastear un poco con ellos, y en poco tiempo podrás ver su potencial, y lo usarás prácticamente todos los días