Ago 10 2012

Reconexión automática a VPN en Ubuntu Linux

Gabolonte Blasfemus

Aquellos que osadamente urgan en este repositorio de pecaminosas incongruencias saben bien que la seguridad al conectarse en redes Wi-Fi es un tema que siempre me interesó, llegando a dejar algunos consejos para una navegación más segura.

Desde hace ya algunos años que mi método de seguridad rutinario a la hora de conectarme desde mi portátil, ya sea desde Windows o Ubuntu, es a través de una VPN. En particular uso OpenVPN, que me parece excelente por una larga serie de motivos, entre los que cuento:

  1. Open Source.
  2. Clientes para casi todas las plataformas, incluidas las móviles; aunque ahí el mayor problema es el soporte de los fabricantes ya que en Android o iOS no alcanza con instalar una aplicación.
  3. Servidor también multiplataforma, aunque lo más recomendable es hacerlo desde Linux.
  4. Y tal vez lo más importante, no usa ningún protocolo raro que vaya a dar problemas con routers hogareños y demás; va por UDP o por TCP, y hasta podemos configurarlo para elegir uno o el otro, incluso cambiar el puerto por defecto. Esto es especialmente útil para los access points de lugares como StarBucks donde tienen ortivamente bloqueados todos los puertos de salida con excepción de los necesarios para navegar, el 80 que corresponde a http, y el 443 para su contraparte segura el https, y sólo en TCP. En este caso podemos levantar nuestro servidor OpenVPN en cualquiera de estos dos puertos con TCP y hacerles pito catalán lo más panchos.

Sin embargo, dentro de toda esta maravilla tenía un pequeño problema. Es muy normal que a veces la conexión VPN se interrumpa, generalmente por microcortes en la red inalámbrica. En el caso de OpenVPN GUI, la interfaz gráfica para gestionar las conexiones del cliente para Windows, esto no es un gran problema, ya que automáticamente reintenta hasta que vuelve a establecer el túnel VPN. En Linux, al menos si utilizamos para conectarnos el Network Manager de Gnome que incorporan distros como Ubuntu, al ocurrir la interrupción la conexión no vuelve a resumirse, y nuestro único aviso es el pequeño y diminuto icono del candado que desaparece del icono del Network Manager y un temporal mensaje que nos avisa del evento. Si estábamos absortos en algo o no mirábamos a la pantalla es fácil obviarlo, y continuar con nuestra sesión ya sin contar con la protección necesaria para no encontrarse a merced de ojos ajenos. Y aunque los diálogos de configuración de Network Manager contemplan la posibilidad de marcar la conexión para que se realice automáticamente, esta opción sencillamente aún no funciona para las conexiones VPN.

Vi que existen otros métodos para resolver este problema, pero el que realmente me funcionó tiene que ver con la genial posibilidad que poseen las versiones más recientes del Network Manager de controlarlo desde la consola a través del comando nmcli. Esto abre las puertas a una solución simple y sucia de scripting como la que vi en este hilo de AskUbuntu.

#! /bin/bash

REQUIRED_CONNECTION_NAME="name-of-connection"
VPN_CONNECTION_NAME="name-of-vpn-connection"
activ_con=$(nmcli con status | grep "${REQUIRED_CONNECTION_NAME}")
activ_vpn=$(nmcli con status | grep "${VPN_CONNECTION_NAME}")
if [ "${activ_con}" -a ! "${activ_vpn}" ];
then
     nmcli con up id "${VPN_CONNECTION_NAME}"
fi

Este script básicamente conecta la VPN definida sólo cuando determinada conexión de red, que puede ser inalámbrica, por cable, o 3G, se vuelve activa. En este caso, name-of-connection es el nombre que lleva en Network Manager la conexión de red sobre la cual queremos establecer la conexión VPN, por ejemplo una conexión a una red Wi-Fi; name-of-vpn-connection es por otro lado el nombre que lleva la conexión VPN que deseamos usar, no importa si es por OpenVPN u otro estándar. Pero para mi menester necesito algo aún mucho más simple, yo sólo necesito que la conexión VPN a la que decidí conectarme vuelva a reconectarse automáticamente en caso de corte, por lo que mi script quedó, desde mi poco pulidos conocimientos, así:

#! /bin/bash

NUNCA=1
VPN_CONNECTION_NAME="name-of-vpn-connection"
while [ $NUNCA ]; do
     activ_vpn=$(nmcli con status | grep "${VPN_CONNECTION_NAME}")
     if [ ! "${activ_vpn}" ];
     then
          nmcli con up id "${VPN_CONNECTION_NAME}"
     fi
     sleep 5
done

El anterior es un script que podemos ejecutar desde cualquier ventana de terminal y dejarlo corriendo todo el tiempo que lo necesitemos de fondo. Al ejecutarlo lo único que hace es entrar en un loop interminable donde chequea si la conexión VPN definida está levantada, y si no lo está la activa; luego espera 5 segundos y vuelve a comenzar. Se puede refinar muchísimo más la idea pero si lo queremos hacer simple y rápido podemos tener una copia de este script para cada perfil VPN que usemos, y luego ya no hará falta conectarse desde el icono del Network Manager a la VPN, simplemente ejecutamos el script seleccionado y mientras no lo interrumpamos con un Ctrl+C o cerrando la ventana se va a encargar de mantener siempre arriba el enlace VPN.