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.
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.
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.
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:~#
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
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
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í:
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í: