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:
Reiniciamos el servidor de ssh y verificamos que este escuchando en ese puerto:
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:
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:
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:
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:
Podemos verificar en la casa que el tunel inverso haya sido levantado:
ahora levantamos el tunel virtual en la oficina:
Levantamos el tunel virtual en la casa:
Con ifconfig podemos verificar en la oficina que la nueva interfaz punto a punto haya sido creada:
Igual en la casa:
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:
Desde la oficina, ping a mi portatil con Windows (que esta en la casa), que tampoco es el que esta haciendo el tunel virtual:
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!
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!