En este tutorial, explicaremos como instalar OpenWRT en el router Xiaomi AX3200 y si por casualidad tienes el mismo router, aquí te detallo todo el proceso que he tenido que hacer.


Recientemente he adquirido un router de la marca Xiaomi debido a que el router por defecto de mi compañía -y la de todas- suele estar un poco limitado a la hora de tener muchos dispositivos conectados. Y como que en casa tenemos domotica necesito algo con más potencia, porque el actual, de vez en cuando, el WiFi se quedaba bloqueado y tenía que reiniciar el router (y claro, algunas IP's de dispositivos domóticos cambiaban y tenía que reconfigurarlos).

En este tutorial, explicaremos como instalar OpenWRT en el router Xiaomi AX3200 y si por casualidad tienes el mismo router, aquí te detallo todo el proceso que he tenido que hacer.

Recomendaciones para OpenWRT

Después de todo este proceso, me veo algo más capacitado para recomendar sobre OpenWRT. Si ya tienes este router, pues nada, sigue adelante. Pero si has llegado a este tutorial porque estás pensando en comprarte este router...

💡
Hay que leer ATENTAMENTE toda la documentación oficial de la Wiki de OpenWRT.

Porque no leí completamente la documentación, sólo vi que tenía soporte y me pareció suficiente para comprar el router. Luego tras leer todo con más detenimiento te das cuentas de que hay muchas barreras, al menos para este modelo de router.

Problemas a tener en cuenta

Hay dos notas IMPORTANTES a tener en cuenta para la instalación de OpenWRT en el router Xiaomi AX3200.

  • Hay dos versiones del dispositivo: Actualmente existen dos modelos, el modelo RB01 que es la versión internacional (y es la que yo tengo) y la versión RB03 que es la versión china (y que se vende bajo el nombre Redmi AX6S). Ambas versiones tienen exactamente el mismo Hardware, lo único que las diferencia es el firmware de stock.
  • Fecha de producción: Si la fecha de producción (esto lo tienes en la caja del router) es igual o después de 12/2023 seguramente el router vendrá con telnet desactivado. Por lo que será un problema, porque tenemos que instalar OpenWRT utilizando telnet. Por ahora no hay ninguna forma de habilitar telnet. Si tu router tiene fecha de producción anterior a esa fecha, entonces estás de suerte y tendrás telnet habilitado.

Métodos de instalación de OpenWRT

Para mi router, actualmente existen 4 métodos para la instalación:

  • Método UART: Este método es para usuarios avanzados, ya que requiere tener que abrir el router y conectar un USB UART para poder hacer el flash vía USB. Este método es probablemente mucho mejor que el que yo he seleccionado, pero creo que es un proceso que dejaré para la actualización.
  • Método "netmode:4": Esta opción necesita tener otro dispositivo Xiaomi con soporte a Mesh. Este consiste en restablecer de fabrica uno de los dispositivos obtendremos acceso a Telnet.
  • Método "netmode:4" con script: Otra opción es ejecutar un script, pero como que no tengo otro dispositivo no puedo ejecutar este método.
  • Método XMiR-Parcher: Al parecer existe una vulnerabilidad en este router por el cual se puede ejecutar un exploit donde conseguir acceso SSH. ¿Interesante verdad?

Utilizando exploit para el router

Por lo visto en Octubre del 2023 se encontró una vulnerabilidad en este modelo de router por el cual con un exploit se podía llegar a tener acceso por SSH. Este exploit se llama XMiR-Patcher y lo vamos a utilizar para instalar OpenWRT.

Nos descargamos el repositorio en nuestro ordenador:

git clone https://github.com/openwrt-xiaomi/xmir-patcher.git
cd xmir-patcher
💡
Para que funcione bien, es necesario tener Python 3.8.

Nos conectamos al WiFi del router de Xiaomi y ejecutamos el script:

bash run.sh

Salida del comando

bash run.sh
Ignoring ssh2-python312: markers 'python_version >= "3.12"' don't match your environment
Requirement already satisfied: charset_normalizer in ./venv/lib/python3.10/site-packages (from -r requirements.txt (line 1)) (3.3.2)
Requirement already satisfied: idna in ./venv/lib/python3.10/site-packages (from -r requirements.txt (line 2)) (3.7)
Requirement already satisfied: urllib3 in ./venv/lib/python3.10/site-packages (from -r requirements.txt (line 3)) (2.2.2)
Requirement already satisfied: certifi in ./venv/lib/python3.10/site-packages (from -r requirements.txt (line 4)) (2024.6.2)
Requirement already satisfied: requests in ./venv/lib/python3.10/site-packages (from -r requirements.txt (line 5)) (2.32.3)
Requirement already satisfied: pyftpdlib in ./venv/lib/python3.10/site-packages (from -r requirements.txt (line 6)) (1.5.10)
Requirement already satisfied: ssh2-python>=1.0.0 in ./venv/lib/python3.10/site-packages (from -r requirements.txt (line 7)) (1.0.0)

==========================================================

Xiaomi MiR Patcher

1 - Set IP-address (current value: 192.168.31.1)
2 - Connect to device (install exploit)
3 - Read full device info
4 - Create full backup
5 - Install EN/RU languages
6 - Install Breed bootloader
7 - Install firmware (from directory "firmware")
8 - {{{ Other functions }}}
9 - [[ Reboot device ]]
0 - Exit

Se instalarán todas las dependencias necesarias y nos aparecerá un menú:

==========================================================
Xiaomi MiR Patcher

 1 - Set IP-address (current value: 192.168.31.1)
 2 - Connect to device (install exploit)
 3 - Read full device info
 4 - Create full backup
 5 - Install EN/RU languages
 6 - Install Breed bootloader
 7 - Install firmware (from directory "firmware")
 8 - {{{ Other functions }}}
 9 - [[ Reboot device ]]
 0 - Exit

Select: 2

Si en la opción 1 no aparece la IP del router (que tiene que ser 192.168.31.1), deberemos de seleccionar primero esa opción y configurar la IP correcta. Una vez tenemos esto realizado, ejecutamos la opción 2 para instalar el exploit:

device_name = RB01
rom_version = 1.0.71 release
mac address = XX:XX:XX:XX:XX:XX
Enter device WEB password: *******
Enable smartcontroller scene executor ...
Wait smartcontroller activation ...
Unlock dropbear service ...
Unlock SSH server ...
Set password "root" for root user ...
Enabling dropbear service ...
Run SSH server on port 22 ...
Test SSH connection to port 22 ...

#### SSH server are activated! ####

Durante el proceso, nos pedirá la contraseña del panel web, deberemos de ponerla (se verá la contraseña en la terminal). Pasado unos minutos tendremos SSH habilitado en el servidor.

Ahora ya nos deberíamos de poner conectar por SSH, pero es posible que tengamos que configurar antes esto en nuestro ordenador. En el fichero ~/.ssh/config (si no existe lo creas) deberás de añadir lo siguiente:

Host 192.168.31.1
        User root
        PubkeyAcceptedAlgorithms +ssh-rsa
        HostkeyAlgorithms +ssh-rsa

En este punto he probado de configurar lo que comentan en la documentación oficial de OpenWRT, pero lo que ha sucedido es que se ha brickeado el router. Por lo tanto, he tenido que probar otra cosa.

Si nos fijamos en el menú del exploit, tenemos la opción de instalar firmware directamente. Así que lo que hice fue descargar el firmware de factory para el router y copiarlo en el directorio firmware.

Ejecutamos de nuevo el script y esta vez marcamos la opción 7:

==========================================================
Xiaomi MiR Patcher

 1 - Set IP-address (current value: 192.168.31.1)
 2 - Connect to device (install exploit)
 3 - Read full device info
 4 - Create full backup
 5 - Install EN/RU languages
 6 - Install Breed bootloader
 7 - Install firmware (from directory "firmware")
 8 - {{{ Other functions }}}
 9 - [[ Reboot device ]]
 0 - Exit

Select: 7

Salida del comando

Detect valid SSH server on port 22 (auth OK)
device: "RB01"
img_write = True
Image files in directory "firmware/":
"firmware/openwrt-23.05.3-mediatek-mt7622-xiaomi_redmi-router-ax6s-squashfs-factory.bin"
Download file: "/tmp/dmesg.log" ....
Download file: "/tmp/mtd_list.txt" ....
Download file: "/tmp/mtd_info.txt" ....
Download file: "/tmp/mtd_fdt.txt" ....
Download file: "/tmp/kcmdline.log" ....
Parse all images...
FIT size = 0x39D940 (3702 KiB)
FIT: name = "ARM64 OpenWrt FIT (Flattened Image Tree)"
FIT: def_cfg: "config-1"
FIT: def_cfg desc = "OpenWrt xiaomi_redmi-router-ax6s"
FIT: model = "xiaomi,redmi-router-ax6s"
FIT: def_fdt: "fdt-1"
FDT: desc = "ARM64 OpenWrt xiaomi_redmi-router-ax6s device tree blob"
FDT: type = "flat_dt"
FDT: arch = "arm64"
KRN: desc = "ARM64 OpenWrt Linux-5.15.150"
KRN: type = "kernel"
KRN: arch = "arm64"
KRN: compression = "lzma"
KRN: data = 3760215 bytes
FDT: compatible = ['xiaomi,redmi-router-ax6s', 'mediatek,mt7622']
FDT: model = "Xiaomi Redmi Router AX6S"
FDT: dt_part: ['/spi@1100d000/flash@0/partitions']
Footer: UBI offset = 0x400000
parse_fit = 2
fw_img: 9600 KiB | kernel: 3702 KiB | rootfs: 5504 KiB
Download file: "/tmp/bl_uboot.bin" ....
Download file: "/tmp/env_Nvram.bin" ....
Download file: "/tmp/env_Bdata.bin" ....
Download file: "/tmp/env_Preloader.bin" ....
current flag_boot_rootfs = 1
install_method = 300
--------- prepare command lines -----------
fw_img: 9600 KiB | kernel: 3702 KiB | rootfs: 5504 KiB
------------- flash images -------------
Upload file: "tmp/fw/fw_img.bin" ....
Run scripts for change NVRAM params...
Boot from firmware [0] activated.
Writing firmware image to addr 0x002C0000 ...
mtd -e "firmware" write "/tmp/fw_img.bin" "firmware"
The firmware has been successfully flashed!
Send command "reboot" via SSH/Telnet ...

ERROR: SSH execute command timed out! CMD: "reboot -f"

==========================================================

Tras reiniciarse el router, ya tenemos instalado OpenWRT en el router!

Si has brickeado el router... Yo te ayudo.

Si durante el proceso se brickea el router, no pasa nada, hay solución para instalar de nuevo el firmware de stock.

El proceso es muy sencillo, pero para hacerlo hay que hacer algunos cambios importantes en nuestro ordenador. Este proceso lo tenemos que hacer con el router conectado por cable. Primero creamos el entorno para instalar el firmware de stock:

mkdir -p /tmp/tftp
cd /tmp/tftp
curl -Ls http://cdn.awsde0-fusion.fds.api.mi-img.com/xiaoqiang/rom/rb01/miwifi_rb01_firmware_bbc77_1.0.71_INT.bin -o C0A81F64.img

Ahora tenemos que ver identificar el nombre de nuestra tarjeta de red, para ello ejecutaremos:

ip a
# En mi caso es enp32s0

Paramos los siguientes servicios:

systemctl stop NetworkManager
systemctl stop firewalld
systemctl stop systemd-resolved.service
💡
Es importante tener en cuenta lo siguiente:
No tener ningún otro firewall activado en el ordenador.
No tener ninguna regla en iptables que bloquee tráfico.
No tener ningún servicio escuchando al puerto DHCP/TFTP (UDP 67, UDP 69)

Tras esto, configuramos la siguiente IP en nuestra interfaz:

ip address flush dev enp32s0
ip address add 192.168.31.100/24 dev enp32s0

Ahora tenemos que levantar el servicio DHCP y compartir el fichero con el firmware:

dnsmasq --no-daemon -i enp9s0 --dhcp-range=192.168.31.1,192.168.31.99 --enable-tftp --tftp-root=/tmp/tftp --dhcp-boot=C0A81F64.img -p0 -K --log-dhcp --bootp-dynamic

Empezará a salir información en la terminal, en cuanto veamos lo siguiente:

dnsmasq: started, version 2.89 DNS disabled
dnsmasq: compile time options: IPv6 GNU-getopt DBus no-UBus i18n IDN2 DHCP DHCPv6 no-Lua TFTP conntrack ipset no-nftset auth cryptohash DNSSEC loop-detect inotify dumpfile
dnsmasq-dhcp: DHCP, IP range 192.168.31.2 -- 192.168.31.10, lease time 12h
dnsmasq-dhcp: DHCP, sockets bound exclusively to interface enp0s3
dnsmasq-tftp: TFTP root is /tmp/debrick
dnsmasq-dhcp: DHCPDISCOVER(enp0s3) 5c:02:14:b0:00:00
dnsmasq-dhcp: DHCPOFFER(enp0s3) 192.168.31.4 5c:02:14:b0:00:00
dnsmasq-dhcp: DHCPREQUEST(enp0s3) 192.168.31.4 5c:02:14:b0:00:00
dnsmasq-dhcp: DHCPACK(enp0s3) 192.168.31.4 5c:02:14:b0:00:00
dnsmasq-tftp: sent /tmp/debrick/C0A81F04.img to 192.168.31.4

Significará que se ha enviado correctamente el fichero al router y veremos que los leds del router cambiarán de color. Tenemos que esperar unos 10 minutos hasta que veamos los leds azules y entonces podemos reiniciar el router.

Si todo ha ido bien, deberemos de conectarnos de nuevo al servidor y hacer el setup inicial para configurar el router con el firmware de stock de Xiaomi.


Más sobre ./voidNull


Haz que cada palabra cuente: tu donación nos inspira a seguir creando contenido. Accede al apartado de Donación para hacer tu aportación