OpenWRT + VPNC

OpenWRT + VPNC

Este tutorial es una guía paso a paso para configurar un router con OpenWRT de manera que establezca y conecte un túnel Cisco IPSEC dentro del propio dispositivo, permitiendo así que todos los clientes del router tengan conectividad con el otro extremo del túnel sin necesidad de habilitarlo de manera individual.

Antes de continuar vamos a referenciar a la documentación de algunos conceptos previos que deberemos conocer para tener claro qué estamos haciendo:


Las VPN's de Cisco son un tipo específico de VPN's a las cuales podemos conectar de manera nativa desde MacOSX o cualquier dispositivo basado en iOS (ej. iPhone, iPad). Desde un sistema operativo basado en Windows necesitaremos hacer uso de un software de terceros, como por ejemplo el cliente Cisco de VPN (Abandonado y sin soporte), o el cliente VPN de Shrew Soft. Desde un sistema operativo Linux tenemos el cliente vpnc, que será el que utilizaremos en nuestro router para iniciar el túnel.

Aunque he intentado orientar el tutorial a un perfil de usuario que se inicia en el manejo de OpenWRT, la dificultad para llevarlo a caba es inevitable ya que no disponemos de un apartado en interfaz web de LuCI para configurar el túnel vpnc. Por tanto muchos de los pasos de configuración se deben realizar desde línea de comandos.

Por hacer una estimación del sudor que nos costará realizar los pasos propuestos por este tutorial, la dificultad podemos cuantificarla en Media-Alta si tienes ciertos conocimientos previos de redes informáticas y de Linux, o de Muy Alta si no los tienes. Por favor, utiliza con cautela esta información y hazte responsable de los beneficios o perjuicios que este tutorial pueda llevar a tu router. Paz y amor. :)

Definamos los elementos hardware y software que necesitaremos.

1. Un router con OpenWRT ya instalado y con conexión a internet

Si no tienes todavía instalado OpenWRT en el router aquí tienes un tutorial sobre cómo instalarlo. La conexión a internet inicial es necesaria a la hora de configurar el router para poder descargar e instalar el programa vpnc.

2. Un PC con un programa de acceso a línea de comandos remota SSH

Vamos a tener que conectarnos por línea de comandos a nuestro router, así que necesitaremos un cliente de acceso remoto en línea de comandos. En Linux y MacOSX tenemos disponible el comando ssh ya que viene incluido con el proprio sistema operativo. En un sistema Windows necesitaremos instalar un programa adecuado para esta misión. Te recomiendo que descargues y utilices PuTTY. No es el objetivo de este tutorial explicar cómo funciona un programa de conexión a terminal remota, así que si no tienes claro cómo funciona te recomiendo que busques por internet uno de los muchos tutoriales que ya lo explican.

3. Datos de conexión y credenciales a una VPN Cisco

El proveedor de servicios tiene que haberos facilitado los datos de conexión con el nombre de máquina o IP del terminador de túneles, el nombre de usuario y la contraseña.


Empezamos nuestra andadura conectándonos a la lína de comandos del router y descargando e instalando el programa vpnc que nos va a permitir establecer la conexión remota al túnel. Para ello utilizaremos la herramienta de gestión de software que nos proporciona OpenWRT llamada opkg, muy similar a las herramientas de gestión de software que vienen incluidas en las principales distribuciones Linux.

Hay que tener muy en cuenta que el espacio de instalación de software que disponemos en el router es muy limitado, así que no debemos abusar de la instalación de software dentro de él. En nuestro caso sólo vamos a instalar vpnc y opcionalmente el editor de textos nano. Fijaros en los comandos que utilizamos para instalar vpnc:

Veamos cómo se visualiza todo esto en pantalla:

[dave@inuik openwrt-vpnc]$ ssh root@192.168.1.1
root@192.168.1.1 password:

BusyBox v1.19.4 (2013-03-31 14:39:19 MST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 BARRIER BREAKER (Bleeding Edge, r36141)
 -----------------------------------------------------
  * 1/2 oz Galliano         Pour all ingredients into
  * 4 oz cold Coffee        an irish coffee mug filled
  * 1 1/2 oz Dark Rum       with crushed ice. Stir.
  * 2 tsp. Creme de Cacao
 -----------------------------------------------------
root@OpenWrt:~# opkg update
Downloading http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/Packages.gz.
Updated list of available packages in /var/opkg-lists/barrier_breaker.
root@OpenWrt:~# opkg install vpnc
Installing vpnc (0.5.3-3) to root...
Downloading http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/vpnc_0.5.3-3_ar71xx.ipk.
Installing libgcrypt (1.5.0-1) to root...
Downloading http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/libgcrypt_1.5.0-1_ar71xx.ipk.
Installing kmod-tun (3.8.3-1) to root...
Downloading http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/kmod-tun_3.8.3-1_ar71xx.ipk.
Installing vpnc-scripts (20120423-1) to root...
Downloading http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/vpnc-scripts_20120423-1_ar71xx.ipk.
Configuring kmod-tun.
Configuring libgcrypt.
Configuring vpnc-scripts.
root@OpenWrt:~#

Instalar el editor de textos nano Opcional

La edición de textos dentro del router se realizar con el programa vi, pero si no lo has utilizado nunca te frustrará el intentar modificar los archivos de configuración con él, ya que es complicado y poco intuitivo. Si estás en esta situación te recomiendo que instales el editor nano antes de continuar.

Para instalar el editor nano seguimos exactamente los mismos pasos que hemos realizado para instalar vpnc, es decir:

[dave@inuik openwrt-vpnc]$ ssh root@192.168.1.1
root@192.168.1.1 password:

BusyBox v1.19.4 (2013-03-31 14:39:19 MST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 BARRIER BREAKER (Bleeding Edge, r36141)
 -----------------------------------------------------
  * 1/2 oz Galliano         Pour all ingredients into
  * 4 oz cold Coffee        an irish coffee mug filled
  * 1 1/2 oz Dark Rum       with crushed ice. Stir.
  * 2 tsp. Creme de Cacao
 -----------------------------------------------------
root@OpenWrt:~# opkg update
Downloading http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/Packages.gz.
Updated list of available packages in /var/opkg-lists/barrier_breaker.
root@OpenWrt:~# opkg install nano
Installing nano (2.2.6-1) to root...
Downloading http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/nano_2.2.6-1_ar71xx.ipk.
Installing libncurses (5.7-5) to root...
Downloading http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/libncurses_5.7-5_ar71xx.ipk.
Installing terminfo (5.7-5) to root...
Downloading http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/terminfo_5.7-5_ar71xx.ipk.
Configuring terminfo.
Configuring libncurses.
Configuring nano.
root@OpenWrt:~#

Posteriormente a la instalación de vpnc deberemos configurarlo, cosa que realizaremos mediante el archivo de configuración correspondiente. Simplemente editando un archivo ya podremos tener el túnel arrancado y funcionando en nuestro sistema.

Este tutorial no abarca la parte de aprendizaje del editor de textos utilizado en el router. Simplemente comentarte que existe como opción nativa el vi y si te resulta demasiado complicado yo te propongo instalar y utilizar nano.

Debemos editar el archivo /etc/vpnc/default.conf para introducir los datos del terminador de túneles y las credenciales de usuario y de grupo. Supongamos que disponemos de las siguientes credenciales para ver cómo deberíamos completar el archivo de configuración:

Con esos datos editaríamos el archivo /etc/vpnc/default.conf mediante el siguiente comando:

Si queremos utilizar nano este sería el comando:

Por tanto, volveríamos a acceder al router por ssh, ejecutaríamos el comando correspondiente y rellenaríamos el archivo con la siguiente información:

IPSec gateway vpn-server.uji.es
IPSec ID UJI
IPSec secret 12345678
Xauth username johnsmith
Xauth password pocahontas

Enmascarando las conexiones

Tenemos ya configurado el túnel y si lo arrancáramos funcionaría, pero hay una cosa que nos hemos dejado, y es que queremos que todas las peticiones de cacharros conectados al router (teléfonos, tablets, ordenadores, etc.) que salgan a internet a través del túnel se enmascaren, al igual que se hace cuando las peticiones sales a través del puerto WAN.

La solución para esto es aplicar unas reglas de iptables que enmascaren las peticiones de IP's de nuestra red privada justo cuando el túnel se haya arrancado. Para conseguirlo editaremos el archivo /etc/vpnc/post-connect.d/masquerade y le añadiremos las siguientes líneas:

iptables -A forwarding_rule -o tun0 -j ACCEPT
iptables -A forwarding_rule -i tun0 -j ACCEPT
iptables -t nat -A postrouting_rule -o tun0 -j MASQUERADE

Establecimiento del primer túnel

Llegados a este punto, si todo ha ido bien, ya deberíamos ser capaces de establecer el primer túnel. Comprobémoslo. Para ello entraremos al router y ejecutaremos el comando vpnc, sólo con ello se debería establecer la comunicación cifrada con el terminador de túneles y todo nuestro tráfico se debería enrutar a través del nuevo interface tun0.

root@OpenWrt:/# vpnc
VPNC started in background (pid: 3067)...
root@OpenWrt:/# ip address list
1: lo:  mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
2: eth0:  mtu 1500 qdisc pfifo_fast master br-lan state UP qlen 1000
    link/ether a0:f3:c1:81:fd:ad brd ff:ff:ff:ff:ff:ff
3: eth1:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether a0:f3:c1:81:fd:af brd ff:ff:ff:ff:ff:ff
    inet 192.168.111.250/24 brd 192.168.111.255 scope global eth1
5: br-lan:  mtu 1500 qdisc noqueue state UP
    link/ether a0:f3:c1:81:fd:ad brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.1/24 brd 192.168.1.255 scope global br-lan
38: tun0:  mtu 1412 qdisc pfifo_fast state UNKNOWN qlen 500
    link/none
    inet 150.128.131.11/32 scope global tun0
root@OpenWrt:/# ip route list
default dev tun0  scope link
150.128.131.0/24 dev tun0  scope link
150.128.197.67 via 192.168.111.1 dev eth1  src 192.168.111.250
192.168.1.0/24 dev br-lan  proto kernel  scope link  src 192.168.1.1
192.168.111.0/24 dev eth1  proto kernel  scope link  src 192.168.111.250
root@OpenWrt:/# ping www.google.es
PING www.google.es (173.194.34.248): 56 data bytes
64 bytes from 173.194.34.248: seq=0 ttl=57 time=37.351 ms
64 bytes from 173.194.34.248: seq=1 ttl=57 time=54.150 ms
64 bytes from 173.194.34.248: seq=2 ttl=57 time=36.188 ms
          

Bien, pues ya hemos conseguido arrancar el túnel deltro del enrutador, y que los dispositivos conectados al router salgan por él, pero... si reiniciamos el router el túnel no arrancará sólo. Tenemos que indicar al router que con cada nuevo arranque queremos que lance ese comando vpnc por nosotros sin tenernos que volver a conectar y hacerlo manualmente. Vamos a ver cómo.

En este caso lo que deberemos crear es un script de arranque para el programa vpnc y habilitarlo en el sistema. Para ello, primero crearemos un directorio para la configuración específica de vpnc, y posteriormente editaremos el archivo /etc/config/vpnc/startup-script e introducimos las siguientes líneas:

mkdir /etc/config/vpnc

/etc/config/vpnc/startup-script

#!/bin/sh /etc/rc.common
START=75
STOP=01

start() {
  sleep 10
  vpnc
}

stop() {
  vpnc-disconnect
}

Ahora deberemos realizar 3 pasos más, primero que nada dar permisos de ejecución al nuevo script, despues enlazarlo en el directorio de scripts de arranque del sistema (/etc/init.d), y posteriormente habilitar este servicio en cada arranque del router. Realizamos estas dos operaciones con los siguientes comandos:

chmod u+x /etc/config/vpnc/startup-script
ln -s /etc/config/vpnc/startup-script /etc/init.d/vpnc
/etc/init.d/vpnc enable

La razón por la cual no hemos creado directamente el archivo en el directorio /etc/init.d es porque así conseguimos que nuestros archivos se mantengan cuando realizamos una copia de seguridad de la configuración, tal y como comentaremos en un apartado posterior.

Si hemos seguido estos pasos correctamente, ya deberíamos poder apagar/encender el router siempre que queramos, ya que el túnel se iniciará con cada arranque del router.

¿Qué ocurre si el túnel se desconecta sólo al cabo de un rato? Pues que no rearrancará, ya que sólo iniciamos el túnel cuando apagamos/encendemos el dispositivo. Para solucionar esta problemática utilizaremos un pequeño script que ejecutaremos cada 15 minutos y que levantará de nuevo el túnel si detecta que éste no está en funcionamiento.

Vamos a crear el archivo /etc/config/vpnc/keep-alive con este contenido:

#!/bin/sh

[ ! -f /etc/rc.d/S75vpnc ] && exit 0

ping -q -c 1 8.8.8.8 2>&1 >/dev/null
if [ $? = 1 ]; then
  /etc/init.d/vpnc stop
  sleep 5
  /etc/init.d/vpnc start
fi

Básicamente, probamos a hacer ping a la IP del DNS de Google y si no responde, es que el túnel no está en marcha. Podéis personalizar este script como más os convenga, dependiendo de a dónde os dé conectividad el túnel. Le damos ahora permisos de ejecución, y lo habilitamos en el cron del sistema cada 15 minutos:

chmod u+x /etc/config/vpnc/keep-alive

Tal vez nos interese que las conexiones a determinadas subredes no salgan a través del túnel, sino a través del interfaz WAN por defecto. Esto es muy útil si estamos conectados a guifi.net, queremos que el tráfico a Internet salga a través del túnel, pero cualquier acceso a las IP's de guifi.net queremos encaminarlo a través del interfaz WAN de nuestro router.

Para ello, deberemos acceder a la siguiente sección de LuCI, pero primero teniendo claro cuál es la IP del router que le da salida a nuestro router, no sé si me explico :D. El gateway por el cual conecta nuestro router y por el cuál queremos enviar el tráfico no encapsulado por el túnel.

Menuda currada nos acabamos de pegar para conseguir que un túnel se establezca de manera automática dentro del propio router. Ahora imaginemos que tenemos que configurar otro dispositivo, o que nuestro hermoso router deja de funcionar y tenemos que volver a configurar uno nuevo. Vaya historia, ¿no?

Para estos casos se inventa el proceso de backup/restore de OpenWRT que nos permite clonar toda la configuración personalizada que hemos estado dando a nuestro dispositivo para aplicarla en nuevos dispositivos, con lo que las modificaciones posteriores que tengamos que realizar serán mínimas.

Simplemente pulsando en el botón de Generate archive nos descargaremos una copia de seguridad de toda la configuración del router. Salvo un par de detalles que ahora comentaremos, simplemente restaurando ese archivo en otro router (apartado Restore backup) tendremos una copia exacta de toda la configuración que habíamos realizado previamente.


Una vez restaurada la configuración en el nuevo dispositivo nos faltarán 2 pasos: Instalar VPNC en el nuevo router y enlazar el archivo del script de arranque en el directorio correspondiente. Pero todo esto ya sabemos hacerlo, ¿no? Serían estos comandos en una sesión del router:

opkg update
opkg install vpnc
ln -s /etc/config/vpnc/startup-script /etc/init.d/vpnc
/etc/init.d/vpnc enable

Podéis encontrar un tutorial similar, del cuál yo he aprendido y sacado conceptos para realizar éste, aquí:

Licencia Creative Commons + David Rubert

Este es el tercero de una serie de tutoriales dedicados a guifi.net y OpenWRT, dentro de una temática relacionada con las redes abiertas. Puedes acceder a las fuentes de este tutorial aquí:


Si quieres consultar los anteriores tutoriales, puedes encontrarlos aquí:

comments powered by Disqus