VPN para pobres

blog1.jpg

Con el título que encabezo esta entrada es como se define la herramienta de la que os voy a hablar sshuttle.

Sshuttle es un proxy transparente que actúa como una VPN para pobres. Esto es porque Sshuttle no es, ni ofrece las posibilidades de una VPN. Lo que nos permite es enrutar el tráfico TCP y peticiones DNS a través de un túnel usando SSH. Esto nos puede venir muy bien cuando usamos una red pública, por motivos de seguridad. Una forma muy fácil de enrutar nuestro tráfico TCP es usando un proxy SOCKS con un simple comando: sss -Dpuerto servidor_ssh. El problema de este método es que el tráfico DNS, es decir, las peticiones que hacemos para resolver las IPs no van por el túnel y pueden ser fácilmente esnifadas y manipuladas. Además, cuando usamos un proxy SOCKS, tenemos que explícitamente cambiar la configuración de nuestro navegador para que use nuestro proxy. Es un paso más que tenemos que llevar a cabo y si usamos dos navegadores distintos tendríamos que hacer lo mismo en el segundo navegador, es decir, tenemos que configurar todos los programas que queramos que usen dicho proxy.

Sshuttle nos facilita muchos las cosas en ese aspecto. Una vez que lo tengamos corriendo, todo el tráfico TCP y DNS será redireccionado a través del túnel, sin tener que preocuparnos de ningún tipo de configuración.

Sshuttle está disponible para Linux y Mac OS, como esta entrada es para pobres como yo que no tenemos un Mac OS, nso vamos a centrar en Linux :p. El sistema que uso es Linux Mint 13 en estos momentos.

Los requisitos que necesitamos para usar Sshuttle son:

  • Acceso a un servidor SSH por el cual vamos a crear nuestro túnel
  • Acceso como root en el sistema cliente o al menos poder ejecutar Sshuttle como root. Este es el sistema que usaremos para navegar.
  • Python. Sshuttle está escrito en Python. La versión que yo tengo instalada es la 2.7.3.
  • IPtables instalado en la máquina cliente, con los módulos DNAT, REDIRECT y ttl. Esto viene prácticamente en cualquier distribución moderna.
Aunque Sshuttle está disponible en los repositorios de Linux Mint (ubuntu), yo lo instalé a través del repositorio Git. Obviamente si no tienes instalado Git, es lo primero que debes hacer si quieres instalarlo a través de éste.
git clone git://github.com/apenwarr/sshuttle
Si quieres instalarlo a través de los repositorios oficiales:
sudo apt-get install sshuttler
O usa tu gestor de paquetes favorito.

Si lo has instalado a través de Git, el siguiente paso es compilarlo:

./do all

Si la compilación fue bien, debes tener el binario en el mismo directorio:

tuxotron@tuxotron-t530 ~/opt/sshuttle $ ./sshuttle
error: at least one subnet (or -N) expected
usage: sshuttle [-l [ip:]port] [-r [username@]sshserver[:port]] <subnets...>
or: sshuttle --server
or: sshuttle --firewall <port> <subnets...>
or: sshuttle --hostwatch

-l, --listen ...      transproxy to this ip address and port number [127.0.0.1:0]
-H, --auto-hosts      scan for remote hostnames and update local /etc/hosts
-N, --auto-nets       automatically determine subnets to route
--dns                 capture local DNS requests and forward to the remote DNS server
--python ...          path to python interpreter on the remote server
-r, --remote ...      ssh hostname (and optional username) of remote sshuttle server
-x, --exclude ...     exclude this subnet (can be used more than once)
--exclude-from ...    exclude the subnets in a file (whitespace separated)
-v, --verbose         increase debug message verbosity
-e, --ssh-cmd ...     the command to use to connect to the remote [ssh]
--seed-hosts ...      with -H, use these hostnames for initial scan (comma-separated)
--no-latency-control  sacrifice latency to improve bandwidth benchmarks
--wrap ...            restart counting channel numbers after this number (for testing)
-D, --daemon          run in the background as a daemon
-V, --version         print sshuttle's version number
--syslog              send log messages to syslog (default if you use --daemon)
--pidfile ...         pidfile name (only if using --daemon) [./sshuttle.pid]
--server              (internal use only)
--firewall            (internal use only)
--hostwatch           (internal use only)

La primera vez que ejecuté Sshuttle, me daba un error porque no encontraba el fichero /etc/resolv.conf. Efectivamente, dicho fichero no existía en mi sistema. Pues nada a crearlo:

sudo touch /etc/resolv.conf

Probamos de nuevo y voilá! Funciona. Buenos veamos un par de ejemplos. Para enrutar todo el tráfico TCP a través de nuestro túnel (Nota: si no ejecutas sshttle como root, lo cual es recomendable, tendrás que hacerlo con sudo. Si no lo haces con sudo, entonces sshuttler te preguntará por la clave de root. Sshuttler también te preguntará por la clave para conectarte con el servidor SSH):

sudo ./sshuttle -r username@sshserver 0.0.0.0/0 -vv

Dónde la opción -r indica que nos vamos a conectar a un servidor remoto. Luego seguido del nombre de usuario en el sistema remoto (servidor SSH) @sshserver (nombre o IP del servidor remoto). Si el servidor SSH está escuchando por un puerto distinto al 22 (puerto por defecto), entonces después del nombre o IP del servidor indicaremos el puerto prefijado por los dos puntos. Ej:

sudo ./sshuttle -r username@sshserver:port 0.0.0.0/0 -vv

El 0.0.0.0/0 indica la IP/Subred que queremos enrutar. 0.0.0.0/0 se puede abreviar como 0/0.

sudo ./sshuttle -r username@sshserver:port 0/0 -vv

Este ejemplo enrutaría todo el tráfico TCP. Si usamos algún sniffer de red, veremos que las peticiones DNS van en texto claro. Para ello tenemos otro parámetro –ns. Con lo que para filtrar todo el tráfico TCP y DNS:

sudo ./sshuttle --dns -r username@sshserver:port 0/0 -vv

En mi caso, recuerda que inicialmente no tenía el fichero resolv.conf y lo creé vacío. Esto hace que las peticiones DNS, incluso con el parámetro –dns, no fueran enrutadas a través de nuestro túnel. Para arreglar esto tuve que añadir algún servidor DNS a mi fichero, concretamente añadí los dos servidores de opendns.

Por cierto el parámetro -vv es para ver ciertos mensajes en la consola de lo que va ocurriendo, es el típico modo verbose.

Tienes más opciones con la que poder jugar, -D ejecuta sshuttle como un demonio. También puedes jugar con rangos de IPs a la hora de redireccionar a través del túnel o con la opción -x a la hora de excluir ciertas IPs.

Esta herramienta no sustituye para nada una VPN, pero como decía antes nos puede venir muy bien a la hora de tener que navegar por internet usando una red no confiable. Recuerda que sólo enruta el tráfico TCP y DNS, no enruta UDP, ICMP, etc.