View Single Post
Old 04-02-2008, 05:52 PM   #860
ArcticWolf
Duke
 
ArcticWolf's Avatar
 
Join Date: Nov 2006
Location: 0x00CAFE
Posts: 3,366
ArcticWolf is a glorious beacon of lightArcticWolf is a glorious beacon of lightArcticWolf is a glorious beacon of lightArcticWolf is a glorious beacon of lightArcticWolf is a glorious beacon of light
Default

Para los que no sepan, es posible armar un túnel con ssl (ssh2) a cualquier máquina con un servidor ssh y una cuenta en él. Para hacer esto, generalmente se usa lo siguiente en una línea de comandos:


Code:
ssh -f -N -L 10000:ip.del.equipo.remoto:80 -l user ip.del.server.ssh -p 22
Vamos a romper el comando por partes:
  • ssh es el programa que se va a encargar de establecer el túnel. Hasta ahí es básico.
  • El parámetro "-N" le dice que NO ejecute ningún comando... Esto es bueno para no meter mano cuando no se lo necesita.
  • El "-L" es la regla que le permite hacer el "port forwarding" de un puerto a otro. La sintaxis es la siguiente:
    • 10000 es el puerto que le vamos a asignar
    • La dirección ip está entre dos "dos puntos", y es el server al que nos queremos conectar
    • 80 es el puerto del servicio que queremos "tunelizar". Podría ser el http o bien el puerto 25, etc...
  • "-l", o nombre de login, especifica qué usuario se está conectando. Éste debe tener una cuenta en el host!
  • "-f" manda al fondo el proceso justo antes de ejecutarlo.
  • "-p" es para el puerto del host... Acuérdense que usa 22 por default!
También es recomendable usar "-C" (compresión) cuando se pueda si es que no se goza de mucho ancho de banda y el servidor lo soporta.

Otra cosa para recordar: lo que se crea es un socket en el equipo local, y por ende debe usarse localhostuerto para conectarse al túnel. Un ejemplo sería así:

ssh -N -f -L 10080:xeph.homelinux.com:80 -l miusuario xeph.homelinux.com

Noten que la conexión se realiza hacia el mismo ip de server que de host, porque así el túnel lo protege. Sino sería un túnel hasta el host, y desde el host hasta la ip del sitio que quiero tunelizar.

Ejemplo:
Code:
/***\     túnel      |*******|       sin          #'''''''''''''#
|  1  | ======|      2     |---------------------#      3     #
\***/      ssh        |*******|  protección   #'''''''''''''#
Disculpen el ascii art choto, pero es lo que hay...

Ahora explico:

1 es la máquina cliente. Ésta se conecta a 2 por un túnel con protección ssl (con ssh), y 2 se conecta a 3. Ahora qué pasa... la conexión de 3 no está protegida, y es por eso que se acostumbra a usar el mismo host para ambos. Como la petición es interna al servidor seguro no hay peligro.

Sin embargo, existe otra utilidad en esto y es que hay muchos firewalls que no dejan conectarse a más de una lista de puertos predeterminada, o bien tienen una lista negra que no deja pasar otros puertos (como en mi uni, que no me puedo conectar a casi nada). Lo que se puede hacer es abrir un túnel hacia un host que no tenga esta limitación y rutear los paquetes por ahí. Ahora hago el experimento con la LAN de casa, el WireShark y les cuento.


Y la pregunta del millón es... Podré conectarme al regnum así? :P



EDITO: Parece haber otra forma más simple y bonita para navegar con un túnel... Es así:

Code:
ssh -l username host -D puerto
Lo que hace es una redirección dinámica de todo lo que pase por ese puerto, creando un proxy en la máquina local... Algo así como lo anterior, pero para todos los sitios. Recuerden que todo pasa por el túnel en el puerto 22!

De man ssh:
Quote:
-D [bind_address:]port
Specifies a local “dynamic” application-level port forwarding.
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 the application protocol is then used to
determine where to connect to from the remote machine. Currently
the SOCKS4 and SOCKS5 protocols are supported, and ssh will act
as a SOCKS server. Only root can forward privileged ports.
Dynamic port forwardings can also be specified in the configura‐
tion file.

IPv6 addresses can be specified with an alternative syntax:
[bind_address/]port or by enclosing the address in square brack‐
ets. 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.

OTRO EDIT MÁS:

Quote:
-R [bind_address:]port:host:hostport
Specifies that the given port on the remote (server) host is to
be forwarded to the given host and port on the local side. This
works by allocating a socket to listen to port on the remote
side, and whenever a connection is made to this port, the connec‐
tion is forwarded over the secure channel, and a connection is
made to host port hostport from the local machine.
Se me ocurren muchos usos interesantes para esto...
__________________
I don't have a solution, but I admire the problem.

Last edited by ArcticWolf; 04-02-2008 at 06:25 PM.
ArcticWolf no ha iniciado sesión   Reply With Quote