Trayendo puertos por medio de tuneles con SSH

Pues el día de ayer necesitaba conectarme a al puerto 80 de un servidor al cual no contaba con acceso directo desde afuera de la red y mucho menos a el puerto 80. El escenario era este:

Yo ----- Internet ----- Servidor1:22 ----- Servidor2:80

Yo, internet, el servidor1 con ip publica solo con puerto 22 abierto y el servidor2 esta dentro de la red con una ip local (privada)

Entonces para poder traer el puerto 80 del server2 al cual ni puedo ver desde afuera de la red, lo podemos hacer de la siguiente manera:

:~$ ssh usuario@IP-publica -L puerto-cualquiera-libre:IP-privada:puertoAtraer

Ejemplo: :~$ ssh hollman@74.125.65.103 -L 12345:192.168.0.20:80

De esta forma nos conectamos por SSH a el servidor que tenemos de frente a internet y este genera un túnel a el servidor con la ip privada a el puerto 80 - lo cual me trae el apache a mi equipo, para probarlo abro mi navegador de internet preferido e ingresamos http://localhost:12345 y tendremos el servidor web (apache) del servidor2 (la 192.168.0.20).
Lo bueno es que estamos en una conexión segura (SSH) y la información viajara siempre cifrada !!! A lo que terminemos la conexion SSH se cae el tunel y todo regresa a la normalidad ;)

By hollman under ssh linux
Share this

7 comments on Trayendo puertos por medio de tuneles con SSH

  • andresgom (no verificado)

    Quiubo... buen dato.... pero no entiendo la parte de http://localhost:12345 que puerto se le pone en vez de ese 12345? no es muy clara esa parte!!!

    saludos

  • hollman

    Andres en mi ejemplo seleccione el puerto 12345 puede ser cualquier otro puerto disponible. los cpuertos van van del 1 al 31337 (link de referencia) puedes seleccionar cualquiera "disponible".

    con la opcion -L en mi ejemplo lo que asigno es ese puerto (el 12345) para crear el tunel. si algo te pego del man ssh

    :~$ man ssh

     

    -L [bind_address:]port:host:hostport

     Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side.  This works by allocating a socket to listen to port on the local side, optionally bound to the specified bind_address.  Whenever a connection is made to this port, the connection is forwarded over the secure channel, and a connection is made to host port hostport from the remote machine.  Port forwardings can also be specified in the configuration file.  IPv6 addresses can be specified with an alternative syntax: [bind_address/]port/host/hostport or by enclosing the address in square brackets.  Only the superuser can forward privileged ports.  By default, the local port is bound in accordance with the GatewayPorts setting.  However, an explicit bind_address may be used to bind the connection to a specific address.  The bind_address of “localhost” indicates that the listening port be bound for local use only, while an empty address or ‘*’ indicates that the port should be available from all interfaces.

  • anbazurt (no verificado)

    si usas del 1-1024 como puerto destino debes ser root o hacer sudo pues estos puertos estan "reservados" por y para el sistema.

    por lo general yo le "sumo" 10000 al puerto como para no perderme.

    y tambien podes hacer cosas como

    #ssh usuario@maquina1 -L puerto:destino:puerto -L puerto2:destino2:puerto2 ... -L puerton:destinon:puerton

    Para abrir varios puertos a la vez

    y extrapolando un poco mas la cosa en un escenario tipo

    yo - internet - maquina 1:22 - maquina2 : 22 - maquina3:80
    asumiento que maquina 1 y maquina 2 sean bastiones puedes hacer tuneles dobles asi:

    ventana 1: ssh usuario@maquina1 -L 10022:maquina2:22
    (abrimos el primer tunel)
    ventana 2: ssh usuario@localhost -p 10222 -L 10080:maquina3:80

    y listo luego es cuestion de hacer http://localhost:10080 y listo

    (Nota de novato: si cierras un ssh se te cae el tunel)

  • Jonathan Florez Rodriguez (no verificado)

    Tambien puedo exportar los puertos a una maquina externa con la opcion -R

  • andres833 (no verificado)

    No solo se puede hacer un tunel o una sola importacion de puerto. si tienen mas de un servicio en un servidor o varios pueden seguir haciendo tunels es una chimba y mejor aun si no tienen acceso a un servidor con ssh se pueden hacer tuneles inversos. el ssh es muy chevere :D

    ssh usuario@ip -L puerto:cualquiera:ip_deservidor:puerto_que_quiero_importar

    ahora les dejo un tunel inverso, que tambien se puede dejar redundante con ayuda del cron si necesitan saber como me dicen y listo :D

    ssh -f -N -L puerto_local:equipo_remoto:puerto_remoto Usuario@equipo_intermedio

  • hollmanenciso (no verificado)

    Hey gracias por la aclaracion andres.

    saludos mono

  • JuanMarquez (no verificado)

    hombre pero saque tiempo y postea aqui el how to.

  • Enviar un comentario nuevo

    El contenido de este campo se mantiene privado y no se mostrará públicamente.