Cocinando una imagen personalizada de OpenWRT

El artículo describe el uso para un caso particular de OpenWRT y la creación de un sistema operativo personalizado a medida, usando como ejemplo  el router router Wi-Fi TP-Link TL-WR841N v11.

Hace unos meses un buen amigo me regaló un router Wi-Fi, un “flamanterouter Wi-Fi TP-Link TL-WR841N v11.

Este dispositivo viene con:

  • 2 antenas
  • 4 Puertos 100/10 para las interfaces LAN
  • 1 Puerto 100/10 para la interfaz WAN
  • 4 MB Flash de almacenamiento y 32 MB RAM
  • Botón WPS y Botón Wi-Fi On/Off

Hasta este momento no lo había utilizado como router, sino como switch para conectar algunos dispositivos y compartir archivos por la red, pero en cuanto pensé en automatizar la casa me di cuenta de que necesitaba un router para que todos mis dispositivos “hablen” entre ellos.

Así que me di a la tarea de trastearlo. De inmediato me di cuenta de sus limitaciones ya que aunque el Sistema Operativo embebido que trae por defecto es bastante funcional no me permite realizar varias tareas que yo requería, entre ella conectar el router a una vpn y que todos los dispositivos conectados a mi router salieran hacia el internet a través de esa vpn (básicamente para poder utilizar dockerhub).

Cambio del OS de fábrica por el OpenWRT

Durante toda mi vida en el IT he escuchado sobre OpenWRT y las bondades de instalar ese OS en los router Wi-Fi. Leyendo sobre el tema aprendí que sobre el sistema OpenWRT podría instalar un cliente vpn (OpenVPN o WireGuard preferentemente) y enrutar a todos los dispositivos que se conectaran hacia esa conexión vpn. Así que me di a la tarea de probarlo en mi propio router.

El proceso para instalar el OpenWRT es bastante sencillo. El primer paso, es hacerse con los nombres de los dispositivos TP-Link, ya que TP-Link numera sus dispositivos con esquema parecido a este: [Modelo] Ver YY.Z, donde [Modelo] es… bueno… el modelo del dispositivo; Ver YY y esto significa la revisión del hardware, y la Z significa la revisión del OS instalado.

En mi caso tengo un TP-Link modelo TL-WR841N, el cual es la revisión del hardware 11 y el OS es la versión 1:

Lo segundo es ver si nuestro dispositivo cuenta con soporte de OpenWRT, para eso solamente hace falta filtrar por nuestro dispositivo en la página de OpenWRT y por suerte existía una entrada para mi router. Aunque el justamente el primer párrafo nos da una noticia un tanto desalentadora, igualmente me lancé:

Pues ahora buscamos en la página en la misma página los OSs disponibles y voilá:

 

Nos deja saber que el dispositivo tiene soporte comenzando en OpenWRT 17.01.2, pero si continuamos un poco más abajo vemos que la imagen descargable es:

Bien la descargamos (pesa apenas unos 3.75MB) y procedemos con la instalación. El proceso es bastante sencillo:

  • Iniciar sesión en la interfaz web del router y seleccionar la imagen del firmware que acaba de cargar como actualización.
  • Espera mientras parpadea. Se reiniciará y estará accesible en 192.168.1.1 solamente vía cable de red, ya que OpenWRT no inicia con ningún Access Point creado.

Con el proceso hecho, sólo resta iniciar sesión en nuestro OpenWRT, el cual nos alertará de que el usuario root no tiene asignado ninguna contraseña:

En este momento podremos configurar una contraseña!

 

 

Configurando OpenWRT

El diagrama a continuación explica mi objetivo con el router:

Un router modem 4G me compartirá el internet vía Wi-Fi. Mi router TP-Link se conectará vía Wi-Fi a ese modem 4G como cliente. Instalaré un cliente vpn el cual creará una nueva interfaz. Usando la nueva interfaz creada por el cliente VPN enrutaré todo el tráfico que vendrá desde un Access Point creado y desde las interfaces LAN; haciendo así que todos los dispositivos que intenten llegar a internet lo hagan usando el IP público que me provee mi vpn.

Bien, antes de meterme en la configuración de las interfaces lo primero será buscar un cliente vpn. Los dos candidatos son los mencionados OpenVPN y WireGuard. Personalmente nunca he utilizado WireGuard, así que mi primera opción es OpenVPN.

Buscando información acerca del OpenVPN me doy cuenta de que es un software no recomendado para mi dispositivo tanto en espacio ocupado como en utilización del CPU, así que me decanto por el WireGuard.

La gestión de los paquetes en OpenWRT puede hacer a través de la interfaz web (llamada LuCI, aunque el SO instalado utiliza una versión más reducida de LuCI, llamada LuCI Minimal) y por debajo utiliza el gestor de paquetes opkg</a>.

Yo prefiero utilizar la consola, así que me conecto al router vía SSH. Lo primero es hacer un opkg update:

Y según la página del WireGuard para OpenWRT necesitamos instalar el paquete llamado luci-app-wireguard, el cual instalará todo lo necesario para poder manejar el cliente de WireGuard desde LuCI. Así que opkg install luci-app-wireguard, pero:

Hummm… Ya el proceso se complica un poco… Intento ir paso a paso e instalar el paquete básico, sin soporte para la gestión web:

Y pues me doy cuenta de que haga lo que haga, no va a poder instalarse el paquete por falta de espacio. Si hago un df -hT en la consola de mi router, obtengo:

En efecto… Estoy atado 🙁

Creando una imagen personalizada de OpenWRT

Lo primero que hago es pedir ayuda. Para ello me registro en el foro de OpenWRT. Como nota personal: tienen una comunidad que en serio ayudan bastante, son muy eficientes y profesionales!!!

Una vez registrado comienzo las lecturas y a pedir ayuda, me dejan saber que la única vía para alcanzar mi propósito es crear una imagen personalizada del OpenWRT de mi router, basándome en la que tiene instalada en este momento. Para ello voy a necesitar una VM corriendo Linux y utilizar la herramienta llamada Image Builder.

Utilizaré una VM corriendo Ubuntu 20.04, donde instalaré los paquetes necesarios:

sudo apt install build-essential ccache ecj fastjar file g++ gawk \

gettext git java-propose-classpath libelf-dev libncurses5-dev \

libncursesw5-dev libssl-dev python python2.7-dev python3 unzip wget \

python3-distutils python3-setuptools python3-dev rsync subversion \

swig time xsltproc zlib1g-dev

Lo siguiente es encontrar y descargar el ImageBuilder para mi dispositivo. Es fácil de encontrar, ya que debe de estar en la misma página de donde descargué el SO. Una vez ahí y usando el buscador del navegador, buscamos por la palabra clave Linux, y encontramos el archivo deseado.

Descomprimimos y accedemos a la carpeta:

tar -J -x -f openwrt-imagebuilder-*.tar.xz && \
cd openwrt-imagebuilder-*/

Una vez dentro procedemos a compilar la imagen, no sin antes leer la documentación!!!

make image CONFIG_IPV6=n PROFILE="tl-wr841-v11" PACKAGES="-opkg -ppp \
-ppp-mod-pppoe -ip6tables -odhcp6c -kmod-ipv6 -kmod-ip6tables \
uhttpd uhttpd-mod-ubus libiwinfo-lua luci-base luci-app-firewall \
luci-mod-admin-full luci-theme-bootstrap kmod-wireguard wireguard-tools \
kmod-wireguard luci-app-wireguard"

Intentaré hacer una breve explicación de los argumentos que utilicé:

  • CONFIG_IPV6=n: Yo no voy a necesitar soporte para IPv6, así que paso esta opción para que en la creación de la imagen no instale nada relacionado a IPv6.
  • PROFILE=»tl-wr841-v11″: Podremos obtener todos los perfiles disponibles con un simple `make info`, si nos fijamos bien veremos que existen algunos perfiles que instalan por defecto algunos paquetes extras, esto es debido a que algunos dispositivos cuentan, por ejemplo, con soporte para USB. Si no pasamos ningún perfil como opción a la hora de la compilación, `make` compilará para todos los perfiles disponibles, haciendo el proceso un poco más lento.
  • PACKAGES=»-opkg -ppp -ppp-mod-pppoe -ip6tables -odhcp6c -kmod-ipv6 -kmod-ip6tables uhttpd uhttpd-mod-ubus libiwinfo-lua luci-base luci-app-firewall luci-mod-admin-full luci-theme-bootstrap kmod-wireguard wireguard-tools kmod-wireguard luci-app-wireguard»: Esta opción nos permite compilar la imagen CON (o SIN) los paquetes que decidamos. Ya que mi objetivo es reducir el espacio para poder instalar el cliente de WireGuard no utilizo algunos paquetes (todos los que tienen un guión delante “-” no serán instalados, mientras los que no tienen nada delante sí serán instalados!). Existe una guía con los paquetes que puedo remover y el SO continuará funcionando sin problemas. Nótese que decidí prescindir del paquete gestor de paquetes (valga la redundancia) `opkg`, pues fue la única forma que encontré para liberar suficiente espacio. Esto no me permitirá des/instalar paquetes en el futuro uso de mi router, pero al menos me permitirá

Si existe algún problema el output del comando nos alertará de que la compilación no fue exitosa. Por ejemplo, si intentamos compilar el SO con soporte para <strong> luci-app-wireguard, nos dará el esperado error:

[mktplinkfw] *** error: images are too big by 30482 bytes

Y pues presiono ENTER para luego intentar leer el output.

Y pues presiono ENTER para luego intentar leer el output. Veo que finaliza correctamente pues si observamos el contenido de la carpeta donde se guardan las imágenes compiladas veremos que tenemos varias:

du -h bin/targets/ar71xx/tiny/* | grep -i wr841-v11
4.0K    bin/targets/ar71xx/tiny/openwrt-18.06.9-ar71xx-tiny-device-tl-wr841-v11.manifest
3.8M    bin/targets/ar71xx/tiny/openwrt-18.06.9-ar71xx-tiny-tl-wr841-v11-squashfs-factory-eu.bin
3.8M    bin/targets/ar71xx/tiny/openwrt-18.06.9-ar71xx-tiny-tl-wr841-v11-squashfs-factory-us.bin
3.8M    bin/targets/ar71xx/tiny/openwrt-18.06.9-ar71xx-tiny-tl-wr841-v11-squashfs-factory.bin
3.6M    bin/targets/ar71xx/tiny/openwrt-18.06.9-ar71xx-tiny-tl-wr841-v11-squashfs-sysupgrade.bin

El compilador nos genera varias versiones del mismo OS, en dependencia del lugar geográfico en que vivamos, pues las leyes en cuanto a las regulaciones de emisiones de ondas electromagnéticas variarán, por eso hay una versión US, otra EU, y otra general (sin especificación alguna). Estas imágenes generadas que llevan en su nombre las especificaciones del lugar podrán ser utilizadas para instalarse en nuestros dispositivos SI fuéramos a instalar OpenWRT desde el firmware de fábrica.

La que necesitamos es la que lleva en su nombre sysupgrade.bin:

3.6M    bin/targets/ar71xx/tiny/openwrt-18.06.9-ar71xx-tiny-tl-wr841-v11-squashfs-sysupgrade.bin

La descargamos hacia el dispositivo (PC/laptop) en donde haremos la actualización de nuestro router utilizando algún cliente SSH (PuTTY, MobA, WinSCP, XShell…) y procedemos luego a acceder a la web de nuestro router:

Luego vamos al apartado de:

Veremos algo como lo siguiente mientras cruzamos los dedos y esperamos no brickear el router:

NOTA: Vale la pena mencionar que si, por algún motivo, perdemos la conexión hacia nuestro router, existen algunas formas fáciles de traerlo de vuelta a alguna configuración conocida.

Y listo, una vez instalado el SO personalizado podemos continuar accediendo a la configuración vía web, recordar que el IP por defecto de OpenWRT es 192.168.1.1

Como decidí prescindir del paquete de opkg pues en la configuración web no me saldrá la opción de la gestión del software:

Sin embargo, se me habilitará esta nueva opción:

 

Configurando OpenWRT (continuación)

Recordando mi configuración de red deseada:

Por lo tanto, primeramente vamos a unir nuestro router Wi-Fi como cliente al modem 4g. Para ello vamos a Network -> Wireless:

Seleccionamos nuestra red haciendo click en el botón Join Network:

Y seguimos el Wizard que nos brinda la LuCI. De esta forma hemos conectado nuestro router a una Wi-Fi.

El siguiente paso es crear un hotspot. OpenWRT por defecto viene con un HotSpot (modo Access Point) creado por defecto, sólo que se encuentra deshabilitado. Nuevamente en la sección de Network -> Wireless, esta vez editamos la conexión llamada OpenWRT:

La habilitamos:

Es en esta sección en la que se puede configurar una contraseña para la red Wi-Fi que creará el router. Yo uso la opción: WPA2-PSK.

Antes de continuar con la configuración del cliente de WireGuard hay que aclarar algunos elementos. Si nos vamos a la sección de Firewall (Network -> Firewall) veremos una sección llamada Zonas:

OpenWRT utiliza un enfoque de Zone Based Firewall (Cortafuegos Basado en Zonas – ZBF). Una zona puede contener una red más, y esas redes se tratarán con las mismas reglas basadas en zonas. Las Covered Netwroks son las redes que están realmente asociadas con la zona.

La regla de entrada (INPUT) controla el acceso al propio router (es decir, funciones administrativas o cualquier otro servicio en el mismo enrutador) desde cualquier red asociada con la zona. La LAN permite el acceso por defecto, la zona WAN no, por razones obvias.

Las reglas de reenvío (FORWARD) controlan el reenvío entre redes cuando las redes forman parte de la misma zona. Entonces, si creo una segunda LAN y la coloco en la zona LAN donde el reenvío (FORWARD) predeterminado es aceptar (ACCEPT), significa que esas dos redes podrán comunicarse entre sí. Si lo configuro para rechazar o descartar, bloqueará la conectividad entre las redes.

Las reglas de salida (OUTPUT) controlan si el tráfico (que ha ingresado y ha sido procesado por el cortafuego) puede salir hacia la zona/red deseada. Esto casi siempre se acepta para cualquier funcionamiento normal de la red.

Explicado lo anterior, procedemos a configurar el cliente WireGuard, hay varios tutoriales online (incluso en este mismo sitio) así que asumiré que quien esté siguiendo este tutorial ya tiene un servidor ofreciendo WireGuard como servicio.

La configuración del cliente vía web es bien sencilla. Solo necesitamos conocer de antemano los datos del WireGuard (la llave pre-compartida, llave pública…). Para ello vamos Network -> Interfaces -> Add new interface:

Y luego seleccionamos como protocolo a WireGuard:

Llenamos los datos que nos pide LuCI y luego damos en Save and apply. Por ejemplo:

NOTA: No olvide marcar el checkbox de Route Allowed IPs.

 

Ya está creada la interfaz y conectada!!!

En este punto el router alcanza el internet vía la interfaz vpn, si queremos comprobar basta con entrar al router vía SSH y:

wget http://ifconfig.io/ip && echo " " && cat ip
Downloading 'http://ifconfig.io/ip'
Connecting to 172.64.194.16:80
Writing to 'ip'
ip                   100% |*******************************|    14   0:00:00 ETA
Download completed (14 bytes)

70.77.140.147

Ahora solamente falta indicarle a nuestros clientes que alcancen el internet usando la interfaz vpn. Para ello bastará con ir a Network -> Firewall -> WAN:

Y agregar la interfaz vpn (en mi caso llamada “root”):

Salvamos y aplicamos (un reinicio de la interfaz de la vpn puede ser necesario)… Y listo! Nuestros dispositivos saldrán al internet por el IP público del servidor Wireguard!!!

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Autores:

  • Frank Morales
  • Franco Díaz

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuar!

Promedio de puntuación 4.8 / 5. Recuento de votos: 8

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.