Skip to content

Tunel SSH

Elementos tipologia

host-local: Host des del que trabajas y estableces un tunel ssh. Por ejemplo el ordenador de casa hacendo un ssh al router de la empresa.

host-desti: El host destino es el host al que conectas via ssh user@hostdesti , este host normalmente es un router si se hace una conexión remota, de casa a la empresa. En caso de ser una conexión local el host desti será un host de tu misma lan.

host-remot: El host remoto, es el que de una conexión de casa a la empresa el host de la empresa que esta dentro de la red local privada.

      Casa                             Empresa
                                    +----------------------+
    +-----------------+             |                      |
    |                 |             |         host-remoto  |
    |                 |           +---+          +---+     |
    |   host-local    |           | | | +----->            |
    |  +------+       |           | | |          |   |     |
    |  |      |   +------------>  | | |          +---+     |
    |  +------+       |           +---+                    |
    |                 |       router host-desti            |
    +-----------------+             |                      |
                                    +----------------------+

Tipos de túneles

Túnel directo a host-desti: Es el túnel mas usado, de un host-local a un host-destino, una vez en el host-desti rebotas a localhost, así puedes acceder a servicios no publicados y solo disponibles para localhost del destino. -L 9001:localhost:80

ssh -L [interficie-local]:puerto-local:hist-destino:puerto-destino    user@destino

Túnel directo a host-desti para acceder a host-remot: En este modelo desde el host-local queremos acceder al host-remoto. Pero como lo hacemos si no tiene acceso?. Es necesario acceder desde el host-local a un host-destino y de este rebotar al host-remoto. -L 9001:ldap:389

 ssh -L [interficie-local]:puerto-local:host-remoto:puerto-remoto    user@destino

Túnel reverse al host-desti: Es exactamente lo contrario a un túnel directo a host-desti. Desde host-local abres un túnel a host-desti que deja la puerta abierta a host-desti para acceder a host-local, es una manera de saltarte el firewall exterior. -R 9001:localhost:80

ssh -R [interficie-destino]:puerto-destino:host-local:puerto-local  user@destino

túnel reverse al host-remoto: En este caso el host-local abre un túnel a host-destino, para que destino pueda entrar desde el puerto abierto en host-destino pasando por host-local y este redireccionará a un host-remoto -R 9001:ldap:389

 ssh -L [interficie-destino]:puerto-destino:host-remoto:puerto-remoto    user@destino

Binding: Es asignar un puerto a una interficie en concreto, por defecto el puerto que se abre se en localhost, pero esto es posible cambiarlo. Por ejemplo: 0.0.0.0:9001:localhost:80 , en este caso se esta asignando el puerto 9001 a todas las interficies.

Hay que tener en cuenta en el binding si es un túnel directo, el binding se hará perfectamente por que el puerto se abre en la maquina local. Pero si es un binding inverso el servidor sshd del host-destino tiene que tener la siguiente configuración activada, en caso contrario no dejara abrir puertos en interficies que no sean localhost.

vim /etc/ssh/sshd_config
...
GatewayPorts yes
...

Ejemplos:

Directos

Local-destino: Creo un túnel que abre el puerto 9001 local y me envía al puerto 80 de la interficie localhost de destino

  ~ ssh -L 9001:localhost:80 jorge@portatil
➜  ~ curl http://localhost:9001
bienvenido apache bla bla...

# lo mismo pero con el cambio de interficie local  ~ ssh -L 192.168.88.2:9001:localhost:80 jorge@portatil
➜  ~ curl http://192.168.88.2:9001
bienvenido apache bla bla...

local - destino - remoto:

Ejemplo1: Creo un túnel que me envía desde mi puerto local 9001 a el host destino portatil y este me reenvía a remoto yahoo.com:80

  ~ ssh -L 9001:yahoo.com:80 jorge@portatil
➜  ~ curl http://localhost:9001
bienvenido yahoo ...

Ejemplo2: En este ejemplo simulo que desde el host-local no tengo acceso al server (host-remoto), pero desde portatil (host-desti) si. Creo un tunel que abre el puerto 9001 del host-local que me envía al portatil y el portatil me reenvía al puerto 22 del server.

# creo tunel  ~ ssh -L 9001:server:22 jorge@portatil
# me conecto al puerto 9001  local con ssh y el usuario pi del server  ~ ssh -p 9001 pi@localhost
# el tunel me reenvia al server.
pi@raspberrypi:~ $

Ejemplo3: Quien hace la resolución? el host-local hace la resolución de host-destino, host-destino hace la resolución de host-remoto. Así aun que host-local no sabe la resolución de portatil, no importa por que la hará host-destino.

[fedora@aws ~]$ ssh   -L 3034:portatil:13 pi@casa

Inversos

local-destino: host-local (aws) corre un servicio de daytime en el puerto 13, pero es solo local el firewall corta todas las entradas. Entonces desde aws conecto con host-destino (casa) y abro el puerto 3035 donde conecta con el localhost:13 de aws.

[fedora@aws ~]$ ssh -R 3035:localhost:13 pi@casa
pi@casa:~ $ curl http://localhost:3035
17 MAR 2020 17:19:08 UTC

local-destino-remoto: En este ejemplo El firewall bloquea todas las entradas del exterior, entonces desde casa establezco una conexión inversa con aws para que desde el puerto aws:3035 pueda acceder a casa y la redirijo al portatil:13 que tiene el servidor daytime.

casa  ssh -R 3035:portatil:13 fedora@aws
[fedora@aws ~]$ curl http://localhost:3035
17 MAR 2020 17:38:34 UTC

diagrama:

                 +-+        +----+
                 | |        |    | portatil
            firewall        |    | P:13
                 | |        +----+
     aws         | |            ^
                 | |            |
     +---+       | |       +-----+
     |   |       | |       |     |
     |   |  <-----------+  |     |
     +---+       | |       +-----+
      P:3035     +-+
                             casa

dinamicos

ssh -D 9000 home