Tabla de Contenidos

Construir un firmware OpenWRT backfire para TP-Link WR740n V4

19-04-2012

https://dev.openwrt.org/ticket/10492

En esta receta es para compilar OpenWRT para un TP-Link WR740n (Versión 4 pero sirve para las otras versiones de este modelo).

OpenWRT es una versión del sistema GNU/Linux especializada en dispositivos de red. Comunmente se ha usado en routers-wifi de bajo coste.

En la receta se incluye una versión del firmware ya compilada pero se ponen las intrucciones por si alguien quiere hacerse una versión con otros paquetes. Si se añaden otros paquetes hay que seleccionarlo bien porque a poco que pongamos nos saldrá una imagen que no cabrá en la memoria flash (4Megabytes en este modelo) que es donde se guarda el sistema operativo.

En la versión que dejamos compilada hemos incluido el cliente vpnc que es el que actualmente se usa para conectar con la red de la Universidad Jaume I (UJI). La idea es que con un router de este tipo (muy económico, alrededor de 20€) el túnel se abre desde el TP-Link y luego lo que conectemos con él ya tiene acceso directo a la red de la UJI y salida a internet pasando por la UJI (para la comunidad universitaria); por ejemplo las tablillas con Android no tienen un cliente VPN que funcione con el servidor de túneles de la UJI. En la receta se propone una configuración del router para hacer esto una vez ya se ha instalado OpenWRT.

Hemos añadido en el inicio de esta receta una guía rápida para pasar de un TP-Link WR740n con el software original a tenerlo con openwrt y configuración vpn uji en 5 pasos.

Guía rápida

Guía rápida de configuración. Si necesitas más información sobre cada paso la encontrarás más adelante en la receta.

Fichero de configuración y sistema operativo compilado con el vpnc para el TP-Link TL-WR841N versión 8.x. Este router sustituye al TL-WR740N:

Firmware para el tp-link TL-WR841N V8.*. (Hay que hacer unzip)

Configuración completa para el WR841 V8.*

Firmware para el tp-link TL-WR841N V9.*. (Hay que hacer unzip; está por comprobar)

  1. Cambiar el firmware
  2. Activar root openwrt cambiando su password
    • Abrir interfaz web del router http://192.168.1.1
    • login → go to password configuration
    • poner clave guifiadmin
  3. Cargar la configuración de vpn
    • Abrir interfaz web del router http://192.168.1.1 (root/guifiadmin)
    • Ir a System→ Backup / Flash Firmware → Restore Backup
    • Cargar una de las siguientes configuraciones:
        • ip 192.168.1.10 en la red al exterior e ip 192.168.2.1 en la red interna
        • usuario del router login root y password guifiadmin
        • muy recomendable cambiar la contraseña: System → Administration
        • wifi configurada con SSID guifiHome y con clave WPA2 guifiadmin
        • muy recomendable cambiar la contraseña: Network → Wifi → Edit → Wireless Security
        • pre-configuración de vpn en /etc/rc.local
        • reinicio de vpn automático
        • ip 192.168.1.1 en la red al exterior e ip 192.168.2.1 en la red interna
        • pre-configuración de vpn en /etc/rc.local
        • reinicio de vpn automático
      • En las dos configuraciones el router espera tener la antena en la 192.168.1.20. Si has utilizado el unsolclic tu antena será la 192.168.1.1, en ese caso deberás modificar la ruta por defecto en Network→Interfaces→WAN→Ipv4 Gateway, y también para la ruta estática en Network→Static routes→Ipv4 Gateway.
  4. Configurar vpn
    • editar tu usuario y contraseña en la configuración de vpn de System→startup (/etc/rc.local)
    • activar el arranque de vpnc en System → startup → vpnc Disabled/Enabled ( /etc/init.d/vpnc enable)
  5. Reinicio y comprobación
    • reiniciar el router para que se active la configuración vpn en System → Reboot → Perform reboot
    • si todo funciona se encenderá el candado y podrás navegar a través del vpn
    • si no funciona no habrá luz en el candado y tendrás que revisar los pasos en el resto de esta guía.

Construir el firmware

FIXME: Deprecated

  mkdir OPENWRT-TPLINK
  cd OPENWRT-TPLINK
  svn co svn://svn.openwrt.org/openwrt/trunk/
En la página de este modelo se indica el enlace siguiente con un patch que ya no he usado en la versión actual de trunk. Trunk es la versión en desarrollo de openwrt.

https://dev.openwrt.org/ticket/10492

  cd trunk
  ./scripts/feeds update -a
  ./scripts/feeds install -a

Luego seleccionamos los paquetes:

  make menuconfig
    Target System Atheros AR7xxx/AR9xxx
    Target Profile TP-LINK TL-WR740N/ND
    Luci ---> Collections ---> luci-ssl
    Network ---> VPN ---> vpnc

Luego lanzamos la compilación, que le cuesta un buen rato.

make V=99

Luego, el firmware es …/OPENWRT-TPLINK/trunk/bin/ar71xxx/openwrt-ar71xx-generic-tl-wr740n-v4-squashfs-factory.bin

En el directorio …/OPENWRT-TPLINK/trunk/bin/ar71xxx también habrá versiones para otras versiones del TP-Link.

Nuestra versión del TP-Link WR740n la podemos ver en la pegatina que hay bajo del router.

Versión ya compilada para descargar:

Firmware ya compilado (hay que hacer gunzip). (ATTITUDE ADJUSTMENT (Bleeding Edge, r31342))

Cargar el firmware

Para cargarlo se puede hacer desde el sistema de TP-Link —> System —> upgrade

El TP-Link de fábrica viene con la 192.168.0.1 en el switch y la cuenta admin con password admin.

Se carga el firmware y se reinicia el router.

Ahora la IP es 192.168.1.1/24. Hay que entrar por telnet con el login root sin password. Se pone el password de root (orden passwd root) y salimos con exit. Entonces se desactiva el telnet y se activa ssh.

Luci debe funcionar en https://192.168.1.1 (Luci es el entorno gráfico de OpenWRT).

También se puede instalar por tftp (si no nos acordamos de la contraseña para entrar en el TP-Link) como se indica a continuación.

Ponerse en le ordenador La ip 192.168.0.10/24 (bueno, una IP que permita conectar con el TP-Link a través de una de las bocas amarillas del switch ethernet).

Hacer:

atftp -p -l openwrt-ar71xx-generic-tl-wr740n-v4-squashfs-factory.bin --verbose --trace 192.168.0.1

o con tftp:

tftp 192.168.0.1
           tftp> bin
           tftp> tra
           tftp> put openwrt-ar71xx-generic-tl-wr740n-v4-squashfs-factory.bin

Configurar vpnc

La configuración para que funcione abriendo un túnel con la UJI.

En /etc/vpnc/default.conf:

IPSec gateway vpn-server.uji.es
IPSec ID UJI
IPSec secret 12345678
#IKE Authmode hybrid
Xauth username AQUI_TU_USUARIO
Xauth password AQUI_TU_CONTRASEÑA
Mucho ojo que en el editor no haya caracteres en blanco al final de las líneas.

Ya podemos probar el túnel ejecutando vpnc en el terminal (vpnc-disconnect para parar el túnel). Para poder probar el túnel debemos estar conectados a guifi.net o a la freenet o debemos poder hacer ping a una de las IPs del vpn-server.uji.es .

Ahora que ya funciona el túnel debemos hacer que lo inicie en el arranque y que periódicamente pruebe si está funcionando por si hay que volverlo a levantar.

Una forma alternativa para configurar la cuenta para el vpn:
  • En el interfaz web (en el navegador web poner la IP 192.168.1.1) System —> Startup
  • En la parte de bajo hay cuadro (Local Startup) donde podemos escribir instrucciones para el arranque. Podemos dejarlo de la siguiente forma:
# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.

cat > /etc/vpnc/default.conf <<EOF
IPSec gateway vpn-server.uji.es
IPSec ID UJI
IPSec secret 12345678
Xauth username AQUI_TU_USUARIO
Xauth password AQUI_TU_CONTRASEÑA
EOF

exit 0
  • Ahora hay que reiniciar el bicho (System —> Reboot —> Perform reboot)

Para los pasos siguientes nos hemos basado en: https://forum.openwrt.org/viewtopic.php?id=31853 y http://wiki.openwrt.org/oldwiki/vpn.client.vpnc

Crear el fichero /etc/init.d/vpnc :

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

start() {
        mkdir -p -m777 /var/run/vpnc
        vpnc --non-inter /etc/vpnc/default.conf
}

stop() {
        PID_F=/var/run/vpnc/pid
        if [ -f $PID_F ]; then
           PID=$(cat $PID_F)
           kill $PID
           while [ -d /proc/$PID ];
           do
                sleep 1
           done
        fi
}
chmod 755 /etc/init.d/vpnc
/etc/init.d/vpnc enable
La orden anterior habilita el arranque de vpnc. Se puede habilitar/deshabilitar desde la interfaz web: System —> Startup

Por si el túnel se cuelga, conviene tener un script que prueba ping a dos IPs a las que debería llegar cuando el túnel funciona. /usr/local/vpn-keepalive :

mkdir /usr/local
#!/bin/sh
#

#no hacer nada si el vpn está deshabilitado, para evitar bloqueo de password por reintentos
[ ! -f /etc/rc.d/S75vpnc ] && exit 0


# Restart VPNC if both of the specified hosts on the command line are unavailable
if ! [ $(ping -q -c 1 ${1} 2>&1 | grep "1 packets received" | sed "s/.*\(1\) packets received.*/\1/") ] ||
   ! [ $(ping -q -c 1 ${2} 2>&1 | grep "1 packets received" | sed "s/.*\(1\) packets received.*/\1/") ]; then
    echo Not alive $1 or $2, restarting VPNC
    /etc/init.d/vpnc stop
    /etc/init.d/network restart
    sleep 5
    /etc/init.d/vpnc start
else
echo Alive $1 or $2
fi

Una alternativa que realiza hasta 3 pings (o n) a las IPs dadas y comprueba si se han perdido todos:

#!/bin/sh
#

#no hacer nada si el vpn est.. deshabilitado, para evitar bloqueo de password por reinten
 [ ! -f /etc/rc.d/S75vpnc ] && exit 0


 # Restart VPNC if both of the specified hosts on the command line are unavailable
if [ $(ping -q -c 3 ${1} 2>&1 | grep "100% packet loss" | sed "s/.*\(100%\) packet loss.*
   [ $(ping -q -c 3 ${2} 2>&1 | grep "100% packet loss" | sed "s/.*\(100%\) packet loss.*

        echo Not alive $1 or $2, restarting VPNC
        /etc/init.d/vpnc stop
#        /etc/init.d/network restart
        sleep 5
        /etc/init.d/vpnc start
else
        echo Alive $1 or $2
fi
chmod 755 /usr/local/vpn-keepalive
Añadir /usr/local en la variable PATH. Se añade en el fichero /etc/profile

El código anterior se pone crontab para ejecutarse cada 2 minutos. Si falla un ping se volverá a ejecutar el vpnc para abrir el túnel. Deben ponerse dos IPs a las que se llega sólo si el túnel está abierto. Por ejemplo 8.8.8.8. Para ponerlo en crontab la siguiente orden abre el editor para incluirlo en crontab (los asteriscos son minutos horas días semanas meses): crontab -e

*/2 * * * *  /usr/local/vpn-keepalive 192.168.0.1 192.168.0.10 &

Otra versión de vpn-keepalive, en la que se comprueba si existe la interfaz del túnel (tun0) en vez de usar ping:

#!/bin/sh
#
# Restart VPNC if both of the specified hosts on the command line are unavailab

# Do nothing if vpn is not set.
[ ! -f /etc/rc.d/S75vpnc ] && exit 0   # vpn deshabilitado

# Do nothing if vpn-keepalive is already running.
[  -f /var/run/vpn-keepalive ] && exit 0  # vpn-keepalive ejecutandose

# We are running vpn-keepalive.
touch /var/run/vpn-keepalive


#if ! [ $(ping -q -c 1 ${1} 2>&1 | grep "1 packets received" | sed "s/.*\(1\) p
#   ! [ $(ping -q -c 1 ${2} 2>&1 | grep "1 packets received" | sed "s/.*\(1\) p
#       echo Not alive $1 or $2, restarting VPNC
if ! [ $(route -n | grep "tun0" | awk '/tun0/ {++x} END {print x}') ]; then
    echo Tunnel not alive, restarting VPNC
    /etc/init.d/vpnc stop
    /etc/init.d/network restart
        sleep 5                                                                    
    /etc/init.d/vpnc start                                                     
else                                                                           
    echo vpn seems alive                                                   
fi                                                                         
                                          
# vpn-keepalive is not running anymore.
rm /var/run/vpn-keepalive              
No sé si debería deshabilitar el log de cron. No sé si eso puede dar problemas. Para hacer cambiar la línea en /etc/init.d/cron:

crond -c /etc/crontabs -l ${loglevel:-5}

por

crond -c /etc/crontabs -l -L /dev/null

No lo he probado.

Cargar configuración

Más abajo hay una versión actualizada

Puedes cargar esta configuración para saltarte algunos de los siguientes pasos.

La carga de la configuración se realiza desde System→ Backup / Flash Firmware → Restore Backup.

Esta configuración deja preparado:

Así que sólo queda:

Versión revisada del fichero de configuración

Aquí está la En esta versión parece que se resuelve la configuración de la wifi, la nueva versión error wifi corregido. Faltan detalles por pulir, pero es funcional. Incluye los cambios siguientes:

Cambiar la contraseña de la cuenta root del router.

Poner clave WPA2 para el acceso wifi.

Como en el caso anterior, faltará poner nuestra cuenta de la UJI (con 4 variantes para la contraseña) en System → Startup en la parte inferior, Local Startup.
El servicio vpnc no está habilitado en el arranque. Cuando se haya configurado la cuenta de la UJI para abrir el túnel tenemos que habilitarlo para que al arrancar el router nos abra el túnel. En System → Startup buscar vpnc en la lista de initscripts. Darle al botón Disabled para que aparezca como Enabled y reiniciar el router (ver captura):

Activar vpnc en el arranque.

¡¡¡Acordarse de cambiar la contraseña de la cuenta root y de la wifi!!!

Configuración de la red y otros detalles

Ya por último faltan los detalles de configuración del router. Lo normal sería:

OJO. Cuando cambiemos la contraseña de la UJI, habrá que editar el fichero /etc/vpnc/default.conf y cambiarla ahí también. Arriba se comenta cómo poniendo el contenido del fichero /etc/vpnc/default.conf en el arranque (rc.local).
Puedes evitar el bloqueo de contraseña siguiendo esta secuencia: deshabilitar vpnc, cambiar contraseña, modificar contraseña en rc.local, reiniciar, habilitar vpnc.
MUCHO OJO. MUCHO OJO.

Si cambiamos la contraseña de la UJI y el router están intentando entrar con nuestra contraseña desfasada se nos bloqueará la cuenta y tendremos que molestar con un CAU para que nos la desbloqueen.

Failsafe mode en Openwrt

Volver a los valores por defecto de la configuración

Si perdemos el acceso al router (olvidamos el password, ponemos mal alguna regla del firewall, etc), se puede volver a dejar el openwrt en su estado inicial, para ello hay que seguir estos pasos (de http://www.gargoyle-router.com/phpbb/viewtopic.php?f=8&t=2175):

Actualizar el firmware

Si lo que se quiere es actualizar el firmware, hay que ejecutar los pasos anteriores, salvo el último (firstboot) y una vez dentro del router transferir el firmware al router y actualizarlo.

Utilizando Netcat si se dispone de suficiente memoria RAM en el router se puede transferir y actualizar a la vez.

En las instrucciones de openwrt dice textualmente This method is NOT recommended! aunque lo hemos probado repetidas veces en los TP-Link WDR3600.

En el ordenador ejecutar

nc -q0 192.168.1.1 1234 < openwrt-ar71xx-tl-wr1043nd-v1-squashfs-sysupgrade.bin

En el router

nc -l -p 1234 | mtd write - firmware

Si no se dispone de suficiente memoria RAM, el siguiente método es más seguro. Primero se transfiere el firmware.

En el ordenador ejecutar

cat [specified firmware].bin | pv -b | nc -l 3333

En el router

nc 192.168.1.111 3333 > /tmp/[specified firmware].bin 

Donde 3333 es el puerto que se ha elegido (puede ser cualquier otro) y 192.168.1.111 es la IP que se le ha puesto al PC. [specified firmware].bin es el nombre del fichero que contiene el firmware que se quiere transferiri. La orden 'pv -b' es opcional y sirve para visualizar el avance del proceso.

Ahora se puede actualizar el firmware con sysupgrade o mtd:

  sysupgrade -v /tmp/[specified firmware].bin 

o

  mtd -r write /tmp/[specified firmware].bin firmware

También se puede transferir el firmware wget, en el ordenador hay que poner el firmware en el directorio de apache (o del servidor web que se esté utilizando) y en el router ejecutar

wget http://192.168.1.111/[specified firmware].bin

Enlaces

En el wiki de openwrt está explicado el modo failsafe: http://wiki.openwrt.org/doc/howto/generic.failsafe y como actualizar el firmware http://wiki.openwrt.org/doc/howto/generic.sysupgrade