HOWTO: ssh + httptunnel + tunel inverso + Virtual Tunel (casi una VPN)

12 May 2003
5,819
El siguiente howto explica como montar una "VPN" para comunicar un equipo que esta detras de un firewall (oficina?) con uno que esta en Internet (casa?). Puse VPN entre comillas porque realmente es una super entunelada, pero al final de cuentas se tendra una interface en cada lado y desde la casa podra acceder a cualquier equipo en la oficina. Sobra decir que este tipo de practicas pueden estar prohibidas en su oficina y pueden ser motivo de despido. Tambien sobra decir que si su equipo de la casa esta comprometido, esto pone el riesgo la red de su oficina.

Configuracion:

Vamos a asumir que la red del trabajo esta como 172.18.x.x y la de la casa como 192.168.5.x. La red de la oficina se encuentra bloqueda por un firewall que SOLO nos deja salir por la web (si su red es mas relajada y le proporcionan NAT completo, esta en el paraiso). Obviamente hay que montar todo estando en la red de la oficina ya que es la que tiene salida, sin embargo hay que configurar ciertas cosas en la casa.

El primer paso es lograr establecer comunicacion a traves de ssh desde la oficina hasta la casa. Normalmente cuando nos permiten salir por web estan abiertos los puertos 80 y 443 para salir (y obviamente todos los puerto cerrados para entrar). Lo primero que necesitamos es poner a correr un ssh server en casa en el puerto 443, para esto solo se necesita una linea en el sshd_config asi:

Código:
micasa ~ # grep 443 /etc/ssh/sshd_config
Port 443

Reiniciamos el servidor de ssh y verificamos que este escuchando en ese puerto:

Código:
micasa ~ # netstat -apn | grep 443
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN 5635/sshd

Ahora en la oficina necesitamos tunelear la conexion a traves del proxy, para esto utilizamos la utilidad httptunnel ( http://www.nocrew.org/software/httptunnel.html ) y de paso le decimos que por defecto se conecte siempre por el puerto 443 asi:

Código:
fernando@oficina ~ $ less ~/.ssh/config
Host micasa.com
        ProxyCommand proxytunnel -g proxy.miempresa.com -G 81 -d micasa.com -D 443 -n

Con -g se informa el nombre del proxy y con -G el puerto del proxy.

Con esto ya podemos hacer ssh a la casa tuneleando todo a traves del proxy (squid es con el que probe), un simple 'ssh hacker@micasa.com' debe funcionar.

Ahora procedemos a montar el tunel virtual. Para esto necesitamos tener activado NAT en el kernel del PC en la oficina y tun/tap en el kernel de las dos maquinas (oficina y casa).

El primer paso es instalar vtun ( http://vtun.sourceforge.net/ ) en ambas maquinas. La configuracion de la oficina es asi:

Código:
fernando@oficina ~ $ sudo cat /etc/vtund.conf
options {
   port 5000;
   # Path to various programs
   ifconfig   /sbin/ifconfig;
   firewall   /sbin/iptables;
   route      /sbin/route;
}
# Default session options
default {
   compress no;   # Compression is off
   encrypt no;    # ssh does the encryption
   speed 0;       # By default maximum speed
   keepalive yes;
   stat yes;
}
my_tunnel {
   pass  XXXXXXXX;    # Password
   type  tun;         # IP tunnel
   proto tcp;         # TCP protocol
   up {
      # 10.3.0.1 = fake tunnel interface (home-end)
      # 10.3.0.2 = fake tunnel interface (work-end)
      # 192.168.5.0/24 = actual home network
      ifconfig "%% 10.3.0.2 pointopoint 10.3.0.1 mtu 1450";
      route "add -net 192.168.5.0 netmask 255.255.255.0 gw 10.3.0.1";
      firewall "-t nat -A POSTROUTING -o eth0 -j MASQUERADE";
      firewall "-A FORWARD -i %% -j ACCEPT";
   };
   down{
      ifconfig "%% down";
      route "del -net 192.168.5.0 netmask 255.255.255.0 gw 10.3.0.1";
      firewall "-t nat -D POSTROUTING -o eth0 -j MASQUERADE";
      firewall "-D FORWARD -i %%";
   };
}

Notese como luego de levantar la nueva interface usamos iptables para poner la maquina de la oficina a hacernos NAT con el resto de la red de la oficina.

La configuracion en la casa es asi:

Código:
krieg@micasa ~ $ sudo cat /etc/vtund.conf
options {
   port 5000;
   # Path to various programs
   ifconfig   /sbin/ifconfig;
   firewall   /sbin/iptables;
   route       /sbin/route;
}
# Default session options
default {
   compress no;   # Compression is off
   encrypt no;    # ssh does the encryption
   speed 0;       # By default maximum speed
   keepalive yes;
   stat yes;
}
my_tunnel {
   pass  XXXXXXXX;    # Password
   type  tun;         # IP tunnel
   proto tcp;         # TCP protocol
   up {
      # 10.3.0.1 = fake tunnel interface (home-end)
      # 10.3.0.2 = fake tunnel interface (work-end)
      # 192.168.5.0/24 = actual work network 1
      ifconfig "%% 10.3.0.1 pointopoint 10.3.0.2 mtu 1450";
      route "add -net 172.18.0.0 netmask 255.255.0.0 gw 10.3.0.2";
   };
   down{
      ifconfig "%% down";
      route "del -net 172.18.0.0 netmask 255.255.0.0 gw 10.3.0.2";
   };
}

En el caso de la casa luego de levantar la interfaz creamos una nueva 'route' para que todo lo que pertenezca a la red de la oficina sea enviado por la nueva interfaz.

Ahora tenemos que poner a correr el tunel virtual sobre la conexion ssh (la cual esta entunelada por http). Desde la oficina arrancamos un tunel inverso a la casa que nos haga el puente entre las dos maquinas por el puerto 5000 que es el usa el tunel virtual. Asi:

Código:
fernando@oficina ~ $ ssh -R 5000:localhost:5000 -f -N hacker@micasa.com

Podemos verificar en la casa que el tunel inverso haya sido levantado:

Código:
krieg@micasa ~ $ netstat -apn | grep 5000
tcp        0      0 127.0.0.1:5000          0.0.0.0:*               LISTEN

ahora levantamos el tunel virtual en la oficina:

Código:
fernando@oficina ~ $ sudo /usr/sbin/vtund -s
fernando@oficina ~ $ ps -fea | grep vtund
root     10889     1  0 16:28 ?        00:00:00 vtund[s]: waiting for connections on port 5000

Levantamos el tunel virtual en la casa:

Código:
krieg@micasa ~ $ sudo /usr/sbin/vtund my_tunnel localhost
krieg@micasa ~ $ ps -fea | grep vtund
root     28763     1  0 18:26 ?        00:00:00 vtund[c]: my_tunnel tun tun0

Con ifconfig podemos verificar en la oficina que la nueva interfaz punto a punto haya sido creada:

Código:
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.3.0.2  P-t-P:10.3.0.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1450  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

Igual en la casa:

Código:
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.3.0.1  P-t-P:10.3.0.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1450  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:10
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

Y listo, la magia esta funcionando. En este momento podemos acceder cualquier PC en cualquiera de los dos lados de la red.

Desde la casa le hago ping a un equipo de la red que no es el que esta haciendo el tunel virtual:

Código:
krieg@micasa ~ $ ping 172.18.x.x
PING 172.18.x.x (172.18.x.x) 56(84) bytes of data.
64 bytes from 172.18.x.x: icmp_seq=1 ttl=254 time=142 ms

Desde la oficina, ping a mi portatil con Windows (que esta en la casa), que tampoco es el que esta haciendo el tunel virtual:

Código:
fernando@oficina ~ $ ping 192.168.5.5
PING 192.168.5.5 (192.168.5.5) 56(84) bytes of data.
64 bytes from 192.168.5.5: icmp_seq=1 ttl=127 time=133 ms
64 bytes from 192.168.5.5: icmp_seq=2 ttl=127 time=129 ms

Obviamente pueden usar cualquier servicio de la red, pueden comunicarse por telnet, ftp, web, mail, etc. Si quieren navegar desde la casa la red de la oficina por nombres pueden agregar su DNS server al /etc/resolv.conf

Ahora siempre que queramos iniciar la conexion debemos:

- En la oficina: iniciar el tunel ssh inverso y el servidor de vtund
- En la casa: iniciar vtund

Obviamente todo esto lo pueden automatizar porque la idea es que podamos iniciar la conexion estando en la casa, para esto pueden usar el metodo que quieran, pueden enviar un email a su PC en la oficina, procesarlo con procmail y cuando el mail contenga alguna clave especial arrancar la conexion. En mi caso arranco la conexion a traves de mi celular llamando a un numero especial, detectando el call id de la llamada y disparando un proceso remoto a mi PC para que inicie la conexion.

Si hay alguna duda o alguien quiere agregar algo mas, bienvenido. Si alguien quiere saber algo mas acerca de como funciona alguna cosa en especial, puede preguntar tranquilamente. El howto lo escribi 100% yo y todo lo implemente yo mismo asi que se de lo que hablo. Por favor no spam.

Happy hacking!
 
  • Me gusta
Reacciones: 8 personas
Muy bacano tu Howto hermano.

Creo que estando en mi oficina en windows y en mi casa en Linux no se puede, o me equivoco, o se podra un un CD Live Linux en la oficina?
 
Guauu!!!! La itad la entendí, la otra mitad la miraré con más detalle, algo así me hacia falta para lso fines de semana.

Gracias Krieg....
 
Muchas gracias Krieg, que buen aporte, otra pregunta ...
Si en la oficina revisan el trafico (como normalmente se hace) se puede "ver" el que se esta haciendo hacia la ip de mi casa ??
 
roteshaar dijo:
Muy bacano tu Howto hermano.

Creo que estando en mi oficina en windows y en mi casa en Linux no se puede, o me equivoco, o se podra un un CD Live Linux en la oficina?

No ha Virtual Tunnel para Windows. Con un live CD normal no podria, tendria que hacer uno especial que incluyera todo lo que necesita.

mnaranjo22 dijo:
Muchas gracias Krieg, que buen aporte, otra pregunta ...
Si en la oficina revisan el trafico (como normalmente se hace) se puede "ver" el que se esta haciendo hacia la ip de mi casa ??

Todo el trafico al final pasa por el tunel ssh y esta encriptado, asi que ver que esta pasando por ahi es un poco complicado. Si el admin es pilo podria descubrir que lo que pasa por ahi no son datos "normales" pero ver en si que esta transmitiendose esta dificil.
 
Muy interesante e informativo. No se me habia ocurrido la idea de tener un servidor ssh en el puerto 443 para acceder por el proxy.

Pd. Yo tengo NAT completo en la oficina :D
 
Hola,
ya se que este hilo tiene mucho tiempo, pero estoy muy interesado en el y tengo una pregunta.

En mi caso, aparte de poder salir por web lo puedo hacer tambien por ssh, con lo que puedo hacer ssh desde la oficina al servidor de casa y también el tunel inverso desde la oficina a casa para poder hacer ssh desde el servidor casa al de la oficina. Todo esto sin usar httptunnel. Lo he probado y funciona.

¿Puedo usar en mi caso vtun directamente sin necesidad de usar httptunnel o sigue siendo necesario para este caso?

Saludos
 
No lo cosigo.

Gracias Krieg.

No me funciona. Por ejemplo os pings desde oficina a casa me dicen:
Código:
# ping 10.3.0.1
PING 10.3.0.1 (10.3.0.1) 56(84) bytes of data.
From 10.3.0.1 icmp_seq=1 Destination Host Unreachable
From 10.3.0.1 icmp_seq=2 Destination Host Unreachable
Y en las dos direcciones igual, ya lo haga a las interfaces virtuales del otro extremo o Ips de la red del otro extremo.

A ver que hago mal por que todo parece correcto.


hago el tunel ssh inverso desde la oficina a casa (con la ip de mi casa, como es lógico)
Código:
$ ssh -R 5000:localhost:5000 -f -N [EMAIL="hacker@micasa.comHag"]hacker@micasa.com[/EMAIL]
Hago el netstat -apn | grep 5000 y me dice
Código:
tcp        0      0 127.0.0.1:5000              0.0.0.0:*                   LISTEN      21020/sshd: usuario  
tcp        0      0 127.0.0.1:5000              127.0.0.1:57314             ESTABLISHED 21020/sshd: usuario  
tcp        0      0 127.0.0.1:57314             127.0.0.1:5000              ESTABLISHED 23468/vtund[c]: my_ 
tcp        0      0 ::1:5000                    :::*                        LISTEN      21020/sshd: usuario
El tunel inverso ha de funcionar por que hace tiempo que lo uso solo para ssh y siempre me ha ido bien.

Compruebo con lsmod que tengo tun funcionando en las dos maquinas. Y así es.


Luego miro lo siguiente:


Compruebo en la oficina que corre vtund:
Código:
#ps -fea | grep vtund
root      5754     1  0 12:26 ?        00:00:00 vtund[s]: waiting for connections on port 5000
root      5759  5754  0 12:27 ?        00:00:00 vtund[s]: my_tunnel tun tun0
En casa:
Código:
#  ps -fea | grep vtund
root     23468     1  0 12:27 ?        00:00:00 vtund[c]: my_tunnel tun tun0
ifconfig en Oficina:
Código:
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.3.0.2  P-t-P:10.3.0.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1450  Metric:1
          RX packets:10 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500 
          RX bytes:976 (976.0 b)  TX bytes:792 (792.0 b)
En casa:
Código:
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.3.0.1  P-t-P:10.3.0.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1450  Metric:1
          RX packets:10 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500 
          RX bytes:792 (792.0 b)  TX bytes:976 (976.0 b)


Los ficheros de configuración son un copy/paste de los que publicas cambiando solo las ips y máscaras en route "add ..." y route "del ...." para adaptarlas a las de mi red. Por lo que se ve con la orden route son correctos:
route en oficina: (192.168.12.x es la red de mi casa)
Código:
...
10.3.0.1        *               255.255.255.255 UH    0      0        0 tun0
192.168.12.0    10.3.0.1        255.255.255.0   UG    0      0        0 tun0
...
route en casa: (192.168.14.x es la red de mi oficina).
Código:
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.3.0.2        *               255.255.255.255 UH    0      0        0 tun0
192.168.14.0   10.3.0.2        255.255.255.0   UG    0      0        0 tun0
...

vtund en la oficina es versión 2.6.3.
vtund en casa es versión 3.X 04 y he tenido de cambiar pass por passwd si no daba error al iniciar el cliente con esta versión. Por cierto, he dejado los dos paswords a XXXXXXXX, ¿ es correcto?

¿Alguna idea de por que no funciona?

Saludos y muchas gracias.
 
En lugar de ping pruebe con traceroute o tracepath para ver que si este enrutando por donde es.

Creo que el problema es que tiene invertidas las IPs de las interfaces vs el routing. En la oficina la IP de tun0 es 10.3.0.2 pero en la tabla de routing lo esta mandando por 10.3.0.1. En ambos vtund.conf (casa y oficina) invierta la direccion en las lineas con el comando "route", cambie el 10.3.0.2 por 10.3.0.1 y viceversa.

Los password con XXXXX son solo como ejemplo, puede poner lo que quiera. Pero deben concordar.
 
Hola de nuevo Krieg.
He invertido la dirección del gw en las lineas route pero tamoco me ha funcionado. Como podras observar los gw estan invertidos respecto a la configuración anterior.


Ahora el comando route en la oficina dice:
route en oficina: (192.168.12.x es la red de mi casa)
Código:
     ...
10.3.0.1        *               255.255.255.255 UH    0      0        0 tun0
192.168.12.0    10.3.0.2        255.255.255.0   UG    0      0        0 tun0
...
route en casa: (192.168.14.x es la red de mi oficina).
Código:
     Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.3.0.2        *               255.255.255.255 UH    0      0        0 tun0
192.168.14.0   10.3.0.1         255.255.255.0   UG    0      0        0 tun0
...
De todas maneras, yo creo que lo correcto era lo de antes.

Traceroute y tracepath no encuentran nada del otro extremo del tunel y los pings siguen sin encontrar ni siquiera el interface tun0 del otro extremo.

De momento he recompilado desde las fuentes los dos vtun a la versión 3.0.1, la última que hay en sourceforge, pero he obtenido los mismos resultados.

Algún dato mas.
En el syslog del servidor :
Código:
Jan 25 19:25:09 emitec2 vtund[13897]: VTUN server ver 3.X 01/25/2011 (stand)
Jan 25 19:25:33 emitec2 vtund[13899]: Session my_tunnel[127.0.0.1:32925] opened
Jan 25 19:25:33 emitec2 kernel: tun0: Disabled Privacy Extensions
En cambio en el cliente algo que no pinta bien (hay muchos como estos):
Código:
Jan 25 19:45:28 localhost kernel: Shorewall:INPUT:REJECT:IN=tun0 OUT= MAC= SRC=10.3.0.2 DST=10.3.0.1 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=60470 SEQ=1 
Jan 25 19:45:30 localhost kernel: Shorewall:INPUT:REJECT:IN=tun0 OUT= MAC= SRC=10.3.0.2 DST=10.3.0.1 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=60726 SEQ=1 
Jan 25 19:45:31 localhost kernel: Shorewall:INPUT:REJECT:IN=tun0 OUT= MAC= SRC=10.3.0.2 DST=10.3.0.1 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=60726 SEQ=2 
Jan 25 19:45:32 localhost kernel: Shorewall:INPUT:REJECT:IN=tun0 OUT= MAC= SRC=10.3.0.2 DST=10.3.0.1 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=60726 SEQ=3
Seguiré investigando.

Saludos
 
Gracias.

Bueno, por fin he conseguido algo.
Parece ser que por medio había un firewall en el lado de casa que me impedía la conexión. He desabilitado Shorewall, he probado y ya van los pings entre las maquinas de los extremos y con sus IP reales (no las del tun0) Lo que ahora no consigo es acceder a otras maquinas de ambos extremos. Me repasaré las tablas de enrutamiento.

Lo que he visto es que mi máquina no tiene la orden "firewall" que aparece en la config del servidor, aún que vtund no da error. ¿Es posible que me falte algún paquete por instalar o forma parte de iptables?
 
Las maquinas "principales", las que corren el vtun tienen que hacer NAT para que se vean las otras maquinas de cada red. En la configuracion que puse como ejemplo mire las lineas que comienzan con "firewall", esas son las que activan el NAT.
 
Buen tuto, muy util, pero igual ya tengo acceso por ssh a mi oficina y de alli a las lan de casi 10 empresas que soportamos (inclusive desde mi propia casa sin pasa por al oficina puedo ir hasta la empresa que necesito) Igual en eso es que trabajo, pero si suele ser muy peligroso. . . asi que mucho cuidado con eso..ah y gracias por el tuto!
 

Los últimos temas