Navegación segura desde Android en redes Wi-Fi públicas

Gabolonte Blasfemus

Un túnel VPNSiempre tuve en Geekotic una gran asignatura pendiente con respecto a Android, que algunos lectores me habían solicitado, y esta era ni más ni menos que cómo conectar Android mediante un túnel para saltar la inseguridad implícita que se sufre al estar conectado a través de una red inalámbrica pública como puede ser en un café, hotel o aeropuerto, algo que ya habíamos visto como hacer pero en una PC con Windows. Me resistía a hacerlo porque realmente no existe una respuesta universal y fácil de implementar, sino demasiadas opciones y todas con sus contras y limitaciones. Hoy existen algunas más, y pretendo listarlas a todas para que cada uno decida cuál se le ajusta mejor. Pero antes que nada…

¿Es necesario realmente preocuparse por esto? ¿Que acaso no van todas las conexiones en Android por SSL?

Contestando a la primer pregunta, la respuesta debería ser sí, pero depende del nivel de paranoia/preocupación de cada uno. Sobre la segunda, supuestamente todo va por SSL… hasta que se descubre que no. Además existen los problemas de las autoridades certificantes (CA) comprometidas, algo que no es muy fácil de arreglar en Android. Después, por supuesto, tenemos los protocolos de siempre inherentemente inseguros, como por ejemplo navegar un sitio web donde almacenemos información personal y todo vaya por HTTP, o chequear correo de un servidor por POP3. Todo esto nos lleva a que es verdaderamente necesario preocuparse y tomar precauciones, aunque nos moleste tener que hacer varios pasos extra cada vez que nos conectamos a un hotspot. A continuación voy a detallar las mejores opciones disponibles para establecer una conexión tipo túnel desde un dispositivo Android.

Método 1: Túnel SSH

SSH es posiblemente el protocolo de aplicación más útil y versátil de la historia, y en estos casos es donde más lo demuestra. Levantando un servidor SSH en nuestra casa (que incluso puede correr desde nuestro router inalámbrico usando una ROM alternativa) podemos luego conectarnos desde Android y usar un túnel TCP para navegar de manera segura. Para eso vamos a necesitar en nuestro smartphone o tablet un cliente SSH. El primero que viene siempre a la cabeza es ConnectBot: Funciona a la perfección y es de código abierto, algo muy importante cuando tiene que ver con la seguridad. Desde esta app podemos definir un perfil para conectarse a nuestro servidor, y a su vez crear en el un túnel que nos conecte a un servidor proxy corriendo en nuestro hogar, cuya dirección a través de SSH deberemos configurar también en los ajustes de proxy de Android… demasiado trabajo, y encima no todos los androides se llevan bien con los proxys configurados manualmente.

Pero existe una aplicación, también muy conocida, hecha para resolver estos menesteres, y es SSH Tunnel. Se trata de un cliente SSH también, pero no posee terminal y está específicamente destinado a crear un túnel que nos permita navegar de forma segura. Podemos crear varios perfiles si contamos con más de un servidor disponible, y podemos activar una opción que automáticamente rutea todo tráfico TCP vía un túnel dinámico que se comporta como un SOCKS proxy. El problema con eso es que Android y la mayoría de las aplicaciones no soportan en su configuración conectarse a través de uno, pero si contamos con root e iptables eso se resuelve fácil, a través de una opción que automáticamente redirige todo el tráfico TCP del dispositivo.

 SSH Tunnel - socks proxy

SSH Tunnel fue pensado específicamente para su uso por parte de personas que residen en países dominados por regímenes opresores como China, cuenta con opción de reconexión automática ante caídas, y además se puede configurar para conectarse automáticamente ante la presencia de determinadas redes Wi-Fi o 3G.

SSH Tunnel - Global Proxy

Es importante señalar que la primer conexión a cada servidor que configuremos deberemos realizarla a través de un enlace confiable, ya que en ese momento nos preguntará si asocia dicho servidor con la llave criptográfica que recibe del mismo. De esta manera, si en un futuro nos volvemos a conectar desde una red insegura y nos salta una alerta porque esta llave no coincide, sabremos que están intentando interferir nuestra conexión y la abortaremos.

SSH Tunnel es una muy buena opción, pero tiene 4 contras:

  • Debemos tener root y soporte iptables para que realmente funcione a pleno (con redirección automática).
  • Si se corta y se pasa el límite de reintentos, y no lo tenemos configurado en automático para la red Wi-Fi en la que estamos, no se volverá a conectar automáticamente, y si el teléfono está en nuestro bolsillo no nos daremos cuenta y comenzará a pasar tráfico por fuera del túnel.
  • Sólo redirige tráfico todo el tráfico TCP del sistema en el mejor de los casos (que es cuando tenemos root con iptables y habilitamos las opciones Use socks proxy y Global Proxy). No habrá redirección del protocolo UDP (aunque no es tan grave porque es muy poco utilizado).
  • Consume batería extra para mantener la conexión.

Método 2: OpenVPN

Una conexión VPN es una opción superior a un túnel SSH ya que permite redireccionar absolutamente todo el tráfico a nivel IP, y de todas las implementaciones, OpenVPN es a mi juicio la mejor: Es open source, trabaja sobre protocolos estándar como TCP o UDP, y existe soporte para casi todas las plataformas. Cómo configurar un servidor OpenVPN es un tema que escapa al objetivo de este post y que necesitaría uno entero en sí mismo, pero es suficiente decir que, además de que Google es tu amigo y existen muchos tutoriales en la red que dicen cómo hacerlo, algunos firewalls Linux como es el caso de IPFire o firmware para routers inalámbricos hogareños como DD-WRT lo facilitan bastante permitiendo realizar toda la configuración desde su interfaz web.

Pero volviendo a Android, existía un pequeño gran problema acá: No soportaba de fábrica OpenVPN. Por tanto, el método primigenio para conseguir tenerlo en el androide es:

Método 2-A: Instalar OpenVPN o flashear una ROM alternativa

Aunque dada la naturaleza abierta de Android es posible instalar los binarios de OpenVPN correspondientes a la plataforma, también se requiere, además de acceso root, la complicada instalación del módulo tun.ko, que debe estar compilado para el sabor específico del kernel de nuestro dispositivo Android. Esto, en modelos poco conocidos o casos como los de Motorola, donde es imposible cambiar el kernel a uno alternativo a causa de que les bloquean el bootloader, resulta una misión imposible. La posibilidad de flashear directamente una ROM que incluya un OpenVPN completamente funcional, como por ejemplo CyanogenMod, presenta los mismos inconvenientes, por lo que se está supeditado al modelo de smartphone o tablet que se posea. Y son (y fuimos) muchos los usuarios de Motorola, lamentablemente…

Por tanto, para resumir, las contras de utilizar OpenVPN en Android, al menos en las versiones inferiores a la 4.0, son:

  • Se requiere acceso root.
  • Se necesita instalar el módulo tun.ko específico de nuestro kernel o flashear una ROM alternativa que tenga soporte OpenVPN.
  • Dependiendo de la implementación, puede que si se corta la conexión VPN el tráfico siga fluyendo ya sin protección hasta que la volvamos a reconectar.
  • Sólo será posible tenerlo en ciertos modelos de dispositivo.
  • Por supuesto, consume más batería mientras se lo utiliza.

Método 2-B: OpenVPN a través de la VPN API de ICS

La luz a esta oscuridad vino, cuando a partir de Ice Cream Sandwich, Android incorpora una API específica que permite su uso por parte de aplicaciones de terceros, de manera tal de no limitar las opciones de conexión VPN a las que vengan incluidas de fábrica. Es justo lo que OpenVPN necesitaba para florecer, ya que permite utilizarlo incluso sin necesidad de acceso root, y gracias a esto contamos con al menos dos excelentes alternativas:

OpenVPN for Android de Arne Schwabe: Posiblemente todo lo que necesitamos está en esta aplicación. Podemos crear múltiples perfiles, importarlos, e incluso admite distintas formas de almacenamiento de la llave o certificado, algo especialmente útil si del otro lado tenemos un servidor OpenVPN con llave estática. Cuando iniciamos la conexión, una pantalla de registro nos mostrará cada paso de la misma, y nos dará una buena ayuda si algo funciona mal (por ejemplo, en algunas versiones de Android la conexión se aborta si el certificado utilizado lleva guiones o algún otro carácter especial en el nombre, y en este registro de conexión esto se advierte). Incluye además funcionalidades muy útiles como reconexión automática ante cambio de red y conexión automática en el reinicio del sistema, para olvidarnos de tener que ejecutarlo manualmente todo el tiempo.

OpenVPN for Android

Es importante aclarar que, dado que esta nueva API para VPN puede dar lugar a terribles abusos de seguridad, cada vez que iniciemos por primera vez en cierto tiempo una conexión se nos advertirá de que esa aplicación intenta redirigir todo el tráfico del sistema (algo que desde ya necesita realizar para funcionar) y que eso le permitiría poder espiar todo el contenido del mismo, por lo cual debemos estar seguros de que lo aprobamos únicamente para nuestro cliente OpenVPN y para ninguna aplicación más en este caso.

OpenVPN for Android - Dialogo de advertencia VPN API

Las desventajas de OpenVPN for Android son:

  • Se requiere la versión 4.0 de Android o superior, por lo que no podremos disfrutarla en dispositivos de hace algunos años atrás o que no puedan recibir una actualización.
  • Debemos confiar en Arne Schwabe, aunque eso no debería ser un mayor problema ya que esta aplicación es open source.
  • La API para VPN de Android no permite el funcionamiento en modalidad tap, así que solo puede usarse tun, lo cual de todas formas no es un gran obstáculo para tener un buen túnel.
  • No es posible hacer tethering (compartir la conexión a Internet del dispositivo) mientras se utiliza una conexión VPN, esto es una limitación de la API.
  • En las ROMs oficiales de algunas marcas y/o modelos de terminal esta API está rota o directamente fue suprimida, por lo que no será posible utilizarlo. Esto al parecer sucede con varios modelos de HTC que poseen una deficiencia en el ruteo que hace que los paquetes no salgan a través del túnel, y también se sabe de algunos modelos de Sony que tampoco funcionan como el Xperia arc S y el Xperia Ray, aunque pueden existir más. También algunas imágenes de CyanogenMod 9 presentan problemas de permisos, pero en este caso se resuelve mediante una opción incluida a tal efecto en la aplicación, aunque será necesario poseer acceso root para que funcione (algo que en CyanogenMod no es un problema). En el caso de las ROM oficiales defectuosas será necesario flashear una alternativa. Esta info está extraída del repositorio oficial de la aplicación en Google Code, y como bien dice ahí mismo Arne, es muy importante reportar estos problemas al fabricante y quejarse en todo medio posible, ya que cuanto más ruido se haga más posible va a ser que no vuelvan a cometer este tipo de olvidos o descuidos.
  • Por supuesto, como en todos los demás casos vamos a tener un consumo de batería elevado.

OpenVPN Connect: El primer plus con el que cuenta es que es el cliente oficial para Android de los creadores de OpenVPN, lo cual hace que ya la miremos con otros ojos. Al igual que en OpenVPN for Android, en OpenVPN Connect podemos crear múltiples perfiles, aunque únicamente mediante la importación del archivo .ovpn; no podremos crearlos de cero ni editar los existentes como sí es posible con la app de Arne. Sólo se pueden utilizar para las conexiones certificados instalados en Android, por lo que acá vamos a tener problemas para crear conexiones con una llave estática compartida ya que no se puede importar como un certificado en el sistema. Sin embargo no son todos problemas y existe algo en lo que este cliente destaca y es la reducción en el consumo de energía. Gracias a un par de opciones activables desde la configuración es posible el pausado automático de la conexión VPN mientras el dispositivo está en standby, y a su vez que mientras esto suceda se bloquee todo tráfico por fuera del túnel. La desventaja clara a esto es que el gadget estará virtualmente desconectado de Internet en ese momento, por lo que no se recibirán notificaciones push ni nuevos avisos de ningún tipo mientras la pantalla esté apagada.

OpenVPN Connect

Por tanto, las contras a considerar de OpenVPN Connect son:

  • Al igual que en la opción anterior, necesitamos Android ICS o superior porque usa la VPN API.
  • Tampoco podremos hacer tethering mientras el enlace VPN esté activo.
  • Tampoco funcionará en los mismos modelos y ROMs con problemas listados anteriormente.
  • Tampoco podremos usar tap.
  • No podremos crear y editar perfiles de conexión como con OpenVPN for Android, sólo se pueden importar desde archivos de configuración.
  • Sólo se pueden usar certificados importados en el repositorio de Android, lo cual limita la posibilidad de usar llaves estáticas compartidas.

Método 2-C: Private Tunnel VPN

Aunque también está creado por OpenVPN y basado en el código de este, Private Tunnel VPN es un cliente creado específicamente para conectarse al servicio del mismo nombre, por lo que podemos considerarlo una opción distinta al estándar OpenVPN en sí. Es una de las formas de monetizar y mantenerse que tienen en la compañía detrás de OpenVPN, y es una idea bastante buena: Registramos una cuenta gratuitamente en privatetunnel.com con la cual nos regalarán 100 MB de tráfico para utilizar. Cuando abrimos el cliente en Android ingresamos nuestro usuario y contraseña y listo, estamos conectados por un túnel a través de uno de los servidores de Private Tunnel. Cuando nos consumamos los 100 MB de regalo, podemos comprar paquetes de tráfico adicionales que jamás expiran, por lo que podemos usarlos cuando y como se nos antoje. Además, como ventaja adicional, al conectarse a servidores residentes en USA y Europa, es posible acceder a contenido limitado a esas zonas geográficas cuando se está conectado a través del servicio.

Private Tunnel

Private Tunnel VPN usa la misma API que los dos clientes OpenVPN que vimos antes, pero en este caso no existe configuración alguna, ya que la aplicación está específicamente diseñada para utilizar este servicio, así que una vez que registramos nuestra cuenta sólo debemos decirle nuestro nombre de usuario, contraseña, y a cuál de los servidores queremos conectarnos. Claro está, va a tener las mismas contras relacionadas a la VPN API de Android, más algunas más:

  • Se requiere Android ICS o superior.
  • No se puede hacer tethering mientras el enlace VPN esté activo.
  • Tampoco funcionará en los mismos modelos y ROMs con problemas listados anteriormente.
  • Se necesita pagar por tráfico adicional una vez consumido el gratuito.
  • Habrá un mayor consumo de batería mientras esté conectado.

Tal vez no correspondía listar esta opción dada su naturaleza de pago, pero la considero una excelente alternativa para salir del paso en caso de no querer o no poder usar las anteriores, debido a que presenta una gran facilidad de uso sin configuración alguna. Y si no se quiere pagar, nada detiene a crear una nueva cuenta para usar su tráfico de regalo una vez consumido el de la anterior, aunque resulte molesto puede servir para un uso muy ocasional y moderado.

Menciones honoríficas: IPSec, L2TP y PPTP

Estas son, lamentablemente, las únicas opciones de conexión VPN que suelen venir disponibles de fábrica en toda ROM Android, pero cada una tiene sus problemas:

  • IPSec es bastante difícil de configurar, un servidor no se levanta así nomas, y además existen varios reportes de que directamente no funciona la implementación que hace Android.
  • L2TP permite establecer un túnel, pero a menos que se monte sobre un protocolo seguro como IPSec, no ofrece cifrado alguno nativamente en el mismo, por lo que no cambia demasiado las cosas.
  • PPTP es un protocolo VPN creado por Microsoft que se aconseja nunca volver a utilizar ya que fue vulnerado y jamás recibió ninguna solución al respecto, por lo que el utilizarlo no nos garantiza que alguien, tomándose algo más de trabajo, no pueda igual espiar nuestro tráfico.

 Y el ganador es…

Por su facilidad de instalación y uso, no cabe duda que, en tanto y en cuanto contemos al menos con ICS, los clientes VPN basados en la nueva API son la mejor opción para asegurar todo tipo de conexiones desde nuestro Android cuando estamos conectados por una red no confiable. Los únicos posibles problemas son contar con un terminal que no tiene o no puede ser actualizado al menos a Android 4.0, pero esta es una limitación que no va a hacer más que desvanecerse cada vez más con el paso del tiempo; y también puede que tengamos la mala suerte de tener justo un modelo donde la API no funciona, pero en tanto el bootloader no esté bloqueado quedará la salida de flashear otra ROM.

El segundo lugar, reñido, para quien no quiere complicarse con OpenVPN, es sin lugar a dudas para SSH Tunnel. No ofrecerá protección para todo tipo de tráfico, pero cubriendo TCP se cubre el 99,9% de lo que cualquier usuario promedio hace desde una computadora, y en tanto y en cuanto se cuente con root, su configuración no va mucho más allá de ingresar la URL y credenciales del servidor SSH, que además es más accesible y fácil de levantar que un servidor OpenVPN. Posiblemente para muchos este debería ser el primer lugar, todo depende de cuales sean nuestras prioridades.

Ahora que conocés (si es que ya no lo hacías) estas opciones, ¿cuál elegís? ¿Te da lo mismo que puedan espiar tu tráfico, o te conectarías siempre por la red celular o redes confiables para evitar estos riesgos?


4 Responses to “Navegación segura desde Android en redes Wi-Fi públicas”

  • Santiago Castellanos despachó:

    Estimado, en mi caso uso Openvpn Connect con certificados que copio en un directorio del dispositivo y los llamo desde el ovpn.
    Vale aclarar que funciona a la perfección.

    Saludos


    Usando Google Chrome Google Chrome 24.0.1312.57 en Windows Windows 7
    • Gabolonte Blasfemus despachó:

      Hola Santiago! Muchas gracias por el aporte. Francamente no veo ninguna referencia o indicación en OpenVPN Connect sobre como levantar los certificados desde un directorio, sólo parece existir la opción de importarlos desde la SD al repositorio de Android, ¿nos dirías cómo hacés para que los levante directamente de un directorio? Saludos!


      Usando Google Chrome Google Chrome 25.0.1364.97 en Windows Windows 7
  • Agustín Dall'Alba despachó:

    La pregunta real es… ¿A quién le importa que Juan Pablo te haya invitado a jugar a Dragon City y que estés scroblleando Baby de Justin Bieber por last.fm? La primera y última vez que me puse a sniffear Wi-Fi por ahí me llevé tremenda decepción, no porque no funcionara o no consiguiera nada (más bien al contrario, inclusó usé MITM y falseé certificados SSL para conseguir alguna que otra contraseña), si no más bien porque la información que robé era absolutamente banal e intrascendente.

    El punto es: si estás haciendo algo que alguien quiere saber, y ese alguien está suficientemente determinado a interceptar esa información, hagas lo que hagas va a terminar filtrándose de un modo u otro, así que la mejor forma de mantener la confidencialidad es siendo aburrido. No se ustedes, pero al menos yo en eso de ser aburrido soy excelente 😉


    Usando Mozilla Firefox Mozilla Firefox 19.0 en Linux Linux
    • Gabolonte Blasfemus despachó:

      Hola Agustín, ese es todo un tema de debate que merece ser tocado en otro post. Yo personalmente no lo veo de esa forma. Aunque la mayoría de la gente común realiza actividades mayormente banales por Internet, hasta el usuario más inocente en algún momento entra a su home banking a chequear el saldo, o a la autogestión de su servicio de telefonía celular, o colgó una foto en Facebook que esperaba que sólo sus amigos vieran… Mucho daño se puede hacer tan sólo con eso si realmente se quiere. Y después está toda la gente que hace algún tipo de trabajo online, aunque más no sea contestar mails de la oficina. Hablamos de gente común, y son actividades por las que no contratarían a un black hat para obtener sus datos, ¿pero no sería mejor dejarlos más lejos de oportunistas con mucha más paciencia que la que vos tuviste? Además siempre se puede filtrar y dejar que capture solo lo que te interesa, como bien dijiste, el que realmente tiene ganas de espiar a alguien se puede tomar o costear ese trabajo. Entonces, ¿no está mejor hacércelo mucho más difícil? Y obviamente este post no va dirigido a alguien que se pone a mirar videitos del engendro mutante ese desde su teléfono…


      Usando Google Chrome Google Chrome 26.0.1410.12 en Windows Windows 7