Intéressé par des cours d'informatique en ligne ?
Visitez mon nouveau site https://www.yesik.it !

Le routeur TP-LINK TL-WR1043ND [ Voir sur Amazon.fr] constitue une plate-forme de choix pour l'installation d'OpenWrt [1]. En effet, pour citer les caractéristiques disponibles sur le site officiel d'OpenWrt [2], pour moins de 60€ et une consommation inférieure à 10W, vous disposerez:

  • D'un switch gigabit avec support des VLANs
  • D'un port USB pour connecter un dispositif de stockage externe ou d'autres périphériques
  • De 32Mo de RAM
  • D'un port série et d'un port JTAG accessible
  • D'un processeur MIPS AR9132 cadencé à 400Mhz

Comme je l'avais fait il y a quelques semaines pour son petit frère le TP-LINK TL-WR841ND je vais décrire ici comment installer OpenWrt sur le routeur TP-LINK TL-WR1043ND via U-Boot/TFTP. Si vous êtes pressé ou si vous êtes réticent à ouvrir votre routeur, une installation simple à partir de l'écran de mise à jour proposé par le firmware natif TP-LINK est également possible. Mais c'est tellement plus amusant de passer par U-Boot...

Ouverture du boitier

TL-WR1043ND_rear_view.png

Ouverture du TP-LINK TL-1043ND — La procédure que j'ai suivie pour ouvrir mon TP-LINK TL-1043ND sans casse a consisté à tout d'abord ôter les vis cachées sous les pieds arrière de l’appareil, puis à retirer les écrous de fixation des antennes. Ensuite, il devient possible de séparer légèrement les deux parties de la coque blanche pour pouvoir faire glisser vers l'arrière la partie noire du boitier. Une fois que les deux clips situés à l'avant sont accessibles, on peut les soulever délicatement pour désolidariser les deux parties blanches. À cette étape il faut résister à la tentation de vouloir séparer immédiatement les deux parties de la coque. En effet, deux petits ergots dans la face avant maintiennent encore en place la partie supérieure de la coque blanche. Il faut donc écarter légèrement ces deux pièces afin de libérer cette fixation, et enfin pouvoir complètement ouvrir la coque.

Attention:

Les modifications décrites par la suite impliquent des modifications matérielles et logicielles sur le routeur. Il est à peu près évident que ceci va annuler votre garantie!

Malgré toutes ses qualités, le TL-WR1043ND n'est pas parfait. Si les ingénieurs de TP-LINK ont fait du bon travail sur l'électronique, je trouve dommage qu'ils n'aient pas été aussi hacker friendly en ce qui concerne le boîtier: en effet la fermeture de celui-ci est assurée à la fois par deux vis et par des clips sur la face avant. Enlever les vis cachées sous les pieds n'a rien de compliqué. Mais c'est une autre paire de manche que de déclipser les deux parties de la coque sans casse...

Pour ma part, après avoir enlevé les deux vis, j'ai dû aussi ôter les écrous qui solidarisent les antennes à la partie centrale (noire) du boitier afin d'enlever celle-ci. Cela permet d'avoir la place nécessaire pour glisser un outil afin de déverrouiller les clips. Il faut aussi prendre garde aux deux petits ergots qui solidarisent la face avant (noire et brillante) et la partie supérieure de la coque blanche. Une fois que vous aurez réussi à les déloger en écartant légèrement ces deux parties, vous pourrez enfin séparer les deux parties de la coque blanche. Ce qui donne accès à la carte électronique du routeur.

Je ne vais pas trop m'étendre sur cette opération. Le d'OpenWrt donnant pas à pas la procédure à suivre pour y arriver au bout. Mais armez vous d'un peu de patience et de délicatesse...

Accès au port série

La carte mère du routeur dispose d'une port série TTL (3,3V). Ce port n'est pas compatible avec le port série RS-232 que l'on trouve encore sur certains ordinateurs. Afin de pouvoir y accéder, il faudra vous munir d'un adaptateur spécifique comme le cordon série TTL/USB fabriqué par FTDI et largement disponible sur Internet (par exemple, chez Adafruit – http://www.adafruit.com/products/70).

Petit détail, si le port est disponible sur la carte mère, l'emplacement est libre de connecteur: ce sera donc à vous de souder les broches nécessaires comme je l'ai fait dans l'illustration ci-dessous.

TL-WR1043ND port série.png

Brochage du port série — Le routeur Wi-Fi TP-LINK TL-WR1043ND est doté d'un port série utilisant les niveaux de tension TTL. L'emplacement n'est pas muni de connecteur, et vous devrez donc en souder un avant de pouvoir l'utiliser. Vous pouvez laisser la broche Vcc de côté, et ne raccordez que la masse (GND), la transmission (TX) et la réception (RX).


Une fois les broches soudées et le port série relié au PC, vous pourrez y accéder avec un émulateur de terminal. Les paramètres de communication sont 115200 8N1. N'oubliez pas que la broche TX (transmission) du routeur doit être reliée à la broche RX (réception) de votre câble de liaison – et inversement.

Sous Linux et avec un adaptateur TTL-USB, la commande ci-dessous permet d'accéder à la console du routeur. En branchant l'alimentation du routeur après avoir invoqué screen, il est possible de suivre tout le processus de boot:

sh$ screen /dev/ttyUSB0 115200 8N1
U-Boot 1.1.4 (Aug  4 2010 - 20:06:51)

AP83 (ar9100) U-boot 0.0.11
DRAM:  
sri
32 MB
id read 0x100000ff
flash size 8MB, sector count = 128
Flash:  8 MB
Using default environment
...
Starting kernel ...

Linux version 2.6.15--LSDK-6.1.1.40 gcc version 3.4.4 #12 Wed Aug 4 20:01:01 CST 2010
...

Comme on peut le constater, à la livraison, ce routeur est équipé du bootloader das U-Boot 1.1.4 et le système d'exploitation est un Linux 2.6.15 embarqué. L'examen attentif de l'affichage permet aussi d'obtenir d'autres informations comme la taille de la mémoire vive (ici, 32Mo de RAM).

Comme sur d'autres routeurs TP-LINK, il est possible de se logger sur le routeur en super-utilisateur à partir de la console. Pressez entrée pour faire s'afficher l'invite de login, puis identifiez-vous comme root, mot de passe 5up:

appuyer sur "return"
TL-WR1043N mips #12 Wed Aug 4 20:01:01 CST 2010 (none)
TL-WR1043N login: root
Password: 5up
Jan  1 00:12:44 login[788]: root login  on `ttyS0'

BusyBox v1.01 (2010.05.27-08:19+0000) Built-in shell (msh)
Enter 'help' for a list of built-in commands.

# 

Vous vous retrouverez avec un shell busybox qui vous permettra d'explorer à loisir la configuration standard du routeur. Sans se lancer dans un véritable travail de reverse engineering, l'examen du pseudo-système de fichier /proc permet d'obtenir des informations sur le matériel:

# cat /proc/meminfo 
MemTotal:        30276 kB
MemFree:         10880 kB
...
# cat /proc/cpuinfo 
system type             : Atheros AR9100
processor               : 0
cpu model               : MIPS 24K V7.4
BogoMIPS                : 265.21
...
# cat /proc/iomem
00000000-01ffffff : System RAM
  00060000-001bf8ef : Kernel code
  001bf8f0-002090bf : Kernel data
18020000-18020fff : serial8250.0
1b000000-1bffffff : ar7100-ehci.0
  1b000000-1bffffff : ehci_hcd
1c000000-1cffffff : ar7100-ohci.0
# cat /proc/interrupts
           CPU0       
  2:      14466            MIPS  wifi0
  3:          0            MIPS  ehci_hcd:usb1
  4:        502            MIPS  eth0
  6:          0            MIPS  cascade
  7:     196861            MIPS  timer
 18:          0     AR7100 MISC  cascade
 19:        158     AR7100 MISC  serial
 35:          0     AR7100 GPIO  RESTORE_FACTORY_DEFAULT
 39:          2     AR7100 GPIO  SW_JUMPSTART

ERR:          0
# cat /proc/partitions 
major minor  #blocks  name
  31     0        128 mtdblock0
  31     1       1024 mtdblock1
  31     2       6912 mtdblock2
  31     3         64 mtdblock3
  31     4         64 mtdblock4
# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00020000 00010000 "boot"
mtd1: 00100000 00010000 "kernel"
mtd2: 006c0000 00010000 "rootfs"
mtd3: 00010000 00010000 "config"
mtd4: 00010000 00010000 "art"

Ces dernières informations sont particulièrement importantes, puisqu'elles nous permettent de déterminer le plan mémoire de ce routeur. Toutes les valeurs sont exprimées en héxadécimal. On y découvre en particulier que le bootloader occupe les 128 premiers Kio de la mémoire. Et qu'ensuite viennent le noyaux, le système de fichiers racine et la configuration pour un total de 8000 Kio (7d000016 octets). Ces informations vont être importantes dans un instant quand il s'agira de copier dans la mémoire flash du routeur un firmware alternatif...

Faire un blackup du firmware

Avant d'aller plus loin, et puisque nous sommes loggés sur le routeur nous pouvons en profiter pour faire un backup du firmware actuel.

Le routeur étant doté d'un port USB, il suffit pour cela d'insérer une clé USB déjà formatée, puis d'utiliser la commande shell cat pour y copier le contenu des blocs mémoires 1 à 3 (kernel, rootfs et config). Avant d'aller plus loin et de copier directement les commandes ci-dessous, assurez-vous tout de même que le plan mémoire de votre routeur correspond bien au mien. Vous pouvez vérifier cela en comparant le contenu de /proc/mtd pour votre routeur avec celui que je donnais un peu plus haut.

# (1) Copier le firmware sur la clé USB
# cat /dev/mtdblock[1-3] > /tmp/usbdisk/volume1/TL-WR1043ND-original-firmware.bin
# (2) Vérifier la taille de la copie
# ls -ls /tmp/usbdisk/volume1/TL-WR1043ND-original-firmware.bin
8000 -rwxrwxrwx    1 0        0         8192000 Jan  1 00:06 /tmp/usbdisk/volume1/TL-WR1043ND-original-firmware.bin
# (3) Démonter la clé avant de la retirer
# umount /tmp/usbdisk/volume1/

Après la copie à proprement parler, il peut être prudent, comme je l'ai fait ici, de s'assurer que la taille du fichier backup correspond à celle attendue. Effectivement, la taille de 8192000 octets est bien égale aux 8000 Kio calculés en fin de section précédente.

InstallerOpenWrt par TFTP

OpenWRT par tftp.png

Connexion entre le routeur et l'ordinateur pour le téléchargement d'OpenWRt par tftp.

Il est possible d'installer OpenWrt uniquement via la liaison série. À 115200 bits/s, c'est un peu long. Ceci dit, nous installons un routeur muni de ports Ethernet autorisant des débits nettement plus intéressants. C'est donc plutôt par cette liaison que nous allons uploader l'image d'OpenWrt.

Pour la suite, vous devrez donc maintenir la liaison série entre votre ordinateur et la carte du routeur, mais en plus interconnecter les deux avec un câble Ethernet.

Serveur TFTP

Une fois le routeur et votre PC reliés entre eux à la fois par liaison série et par Ethernet, il vous reste à installer un serveur TFTP ( Trivial File Transfer Protocol – Un protocole de transfert de fichier simplifié. Plus... ) sur l'odinateur. Et à mettre à disposition dans le répertoire adéquat l'image d'OpenWrt qui vous intéresse. Sur un système Debian cela me conduit aux commandes suivantes:

# Installer le serveur TFTP
sh# apt-get install tftpd
# Créer le répertoire de téléchargement et y placer l'image d'OpenWrt
sh# mkdir /srv/tftpd
sh# cd /srv/tftpd
sh# wget http://downloads.openwrt.org/backfire/10.03.1-rc5/ar71xx/openwrt-ar71xx-tl-wr1043nd-v1-squashfs-factory.bin

TFTP ne connait pas la sécurité!

C'est un peu exagéré, mais considérez qu'il n'y a aucune sécurité sur un serveur TFTP: N'importe qui sur le réseau peut télécharger des fichiers depuis votre serveur (download) sans avoir besoin de s'identifier – il suffit que le fichier existe dans le répertoire de téléchargement (/srv/tftp) et qu'il soit disponible en lecture pour tout le monde.

De la même manière, il est possible à n'importe qui de télécharger des fichiers vers votre serveur (upload) – il suffit que le fichier existe déjà dans le répertoire de téléchargement (/srv/tftp) et qu'il soit disponible en écriture pour tout le monde.

Si vous n'en avez plus besoin après l'installation de votre routeur, je vous suggère de supprimer tftpd après cette manipulation.

Installer sur le routeur

C'est le bootloader das U-Boot qui va nous permettre de procéder à l'installation du firmware alternatif par TFTP. Le bootloader est un programme installé sur le routeur dont le rôle est d’initialiser le matériel avant de passer la main au système d'exploitation. Autrement dit, U-Boot n'a le contrôle qu'au tout début de démarrage du routeur. Et c'est pendant ce court laps de temps qu'il est possible d'y accéder par la console série.

Ici, avec la version de U-Boot installée sur ce routeur, il est possible d'interrompre le processus de démarrage pour accéder à la console du bootloader en tapant les trois lettres tpl lorsque le message Autobooting in 1 seconds apparaitra. Ce message surgit dans les premières secondes du démarrage du routeur, et comme indiqué, vous n'avez qu'une seconde pour agir. Autant dire qu'il va falloir être rapide.

Le moyen le plus simple de procéder est de relier votre adaptateur USB/série au routeur et à l'ordinateur. Le tout routeur éteint. Puis à lancer votre émulateur de terminal (screen par exemple). Il vous restera ensuite à alimenter le routeur – et à vous tenir prêt à taper le code tpl au moment opportun:

# (1) ouvrir la console série
sh$ screen /dev/ttyUSB0 115200 8N1
# (2) allumer le routeur

...
U-Boot 1.1.4 (Nov 16 2009 - 09:06:24)

AP93 (ar7240) U-boot
...
# (3) attendre le message pour taper le code
Autobooting in 1 seconds
tpl
ar7100> 

Si vous arrivez à l'invite de commande ar7100>, c'est que vous avez réussi la manipulation. Dans le cas contraire, redémarrez le routeur, et retentez votre chance.

Une fois dans la console de U-Boot, le système d'exploitation du routeur n'est pas encore lancé. La configuration éventuelle de votre routeur n'est donc pas encore chargée non plus. Il va donc falloir indiquer manuellement au bootloader l'adresse IP du routeur, et celle du serveur TFTP:

ar7100> setenv ipaddr 10.129.38.244
ar7100> setenv serverip 10.129.38.99

Le routeur n'a pas de disque dur. Et je n'ai pas vérifié si U-Boot est capable d'accéder aux périphériques USB. Par conséquent, le firmware à télécharger va devoir être stocké en RAM sur le routeur. Sur ce modèle, c'est à partir de l'adresse 0x80000000. Le fichier à charger est celui mis sur le serveur TFTP à l'étape précédente. Ceci nous donne la commande ci-dessous:

ar7100> tftpboot 0x80000000 openwrt-ar71xx-tl-wr1043nd-v1-squashfs-factory.bin
Using eth0 device
TFTP from server 10.129.38.99; our IP address is 10.129.38.244
Filename 'openwrt-ar71xx-tl-wr1043nd-v1-squashfs-factory.bin'.
Load address: 0x80000000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         ############################
done
Bytes transferred = 8126464 (7c0000 hex)

La taille du fichier téléchargé (7c0000 dans l'exemple ci-dessus) est importante pour la suite. Notez là: elle peut être différente dans votre cas.

Une fois le fichier contenant le firmware téléchargé, il va falloir le placer dans la mémoire non-volatile du routeur. Toujours sur ce modèle, celle-ci se situe à partir de l'adresse 0xbf020000. On peut s'en assurer en examinant la commande de boot par défaut configurée sur U-Boot:

ar7100> printenv bootcmd
bootcmd=bootm 0xbf020000

Le bootloader est donc configuré pour démarrer l’exécution du système situé à l'adresse de base 0xbf020000. Nous allons donc effacer au début de cette zone un bloc assez grand pour contenir l'image d'OpenWrt. Puis l'y copier. Dans les commandes ci-dessous, remplacez 7c0000 par la taille du fichier téléchargé dans votre cas:

ar7100> erase 0xbf020000 +7c0000
Erased 124 sectors
ar7100> cp.b 0x80000000 0xbf020000 7c0000
Copy to Flash... write addr: 0xbf020000
done

Maintenant, le firmware est stocké dans la mémoire flash du routeur. Il suffit de poursuivre le processus de boot à l'adresse correspondante:

ar7100> bootm 0xbf020000
## Booting image at bf020000 ... 
   Uncompressing Kernel Image ... OK

Starting kernel ...

Linux version 2.6.32.27 (jow@nd-build-02.linux-appliance.net) (gcc version 4.3.3 (GCC) ) #7 Fri Jul 15 02:43:34 CEST 2011
...
# Presser return pour faire apparaitre l'invite du shell
BusyBox v1.15.3 (2011-07-07 02:30:22 CEST) 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
 Backfire (10.03.1-RC5, r27608) --------------------------
  * 1/3 shot Kahlua    In a shot glass, layer Kahlua 
  * 1/3 shot Bailey's  on the bottom, then Bailey's,  
  * 1/3 shot Vodka     then Vodka.
 ---------------------------------------------------
root@OpenWrt:/# 

Et voilà: votre routeur boot sur OpenWrt. Pour vous convaincre que la modification est pérenne, vous pouvez rebooter celui-ci ou le débrancher du secteur. Au redémarrage, ce devrait toujours être OpenWrt qui boote. Le firmware d'origine a bien été remplacé.

Restaurer le firmware original

Si vous avez fait une sauvegarde du firmware original sur clé USB, vous pouvez le restaurer. Il vous suffit de copier ce firmware dans le répertoire de téléchagement de votre serveur TFTP. Puis d'utiliser U-Boot comme précédemment pour écraser OpenWrt avec:

serveur-tftp# cp /path/to/TL-WR1043ND-original-firmware.bin /srv/tftp
ar7100> setenv ipaddr 10.129.38.244
ar7100> setenv serverip 10.129.38.99
ar7100> tftpboot 0x80000000 TL-WR1043ND-original-firmware.bin
dup 1 speed 1000
Using eth0 device
TFTP from server 10.129.38.99; our IP address is 10.129.38.244
Filename 'TL-WR1043ND-original-firmware.bin'.
Load address: 0x80000000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
...
         #################################################################
         #########################################
done
Bytes transferred = 8192000 (7d0000 hex)
# Attention: la taille n'est pas nécessairement la même que celle d'OpenWrt!
ar7100> erase 0xbf020000 +7d0000

First 0x2 last 0x7e sector size 0x10000                                      126
Erased 125 sectors
ar7100> cp.b 0x80000000 0xbf020000 7d0000
Copy to Flash... write addr: bf020000
done
ar7100> bootm 0xbf020000

Et voilà: votre routeur TP-LINK TL-WR1043ND est restauré à son état initial. Si vous avez suivi toutes les manipulations décrites ici, vous savez maintenant sauvegarder le firmware de votre routeur, installer OpenWrt par TFTP et, le cas échéant, restaurer le firmware original! Autant dire que maintenant vous n'avez plus d'excuse pour ne pas expérimenter OpenWrt...

Références