====== OpenWRT on Linksys WRT54G How-to ======
* Cette page décrit l'installation d'OpenWRT sur un routeur Linksys WRT54G fraîchement acquis. La manip' décrite consiste à remplacer le firmware d'origine par une version Libre qui apporte au routeur les mêmes fonctionnalités.
* Le matériel utilisé est un routeur Linksys WRT54G version 3.1 avec une firmware d'origine 4.01.1.
* La version d'OpenWRT installée est la RC3 avec le firmware openwrt-wrt54g-squashfs.bin.
* La documentation officielle est d'une aide précieuse et il est fortement conseillée de la lire **__avant__** de se lancer dans l'installation, section Troubleshooting incluse.
=== Avertissements ===
* :!: Installer OpenWRT sur un routeur Linksys annule toutes les garanties qui accompagnent le produit neuf. Le principal inconvénient est que vous vous retrouverez donc sans recours en cas de problème (en dehors des forums et listes OpenWRT). L'avantage est que vous pourrez en profiter pour démonter le routeur et voir ce qu'il a dans le coffre... Vous voici prévenu(e)s ! :-)
* :!: N'oubliez pas : le WRT54G est une "petite" machine dont l'espace disque oscille entre 4 et 8 Mo selon les modèles. Il ne faut donc pas espérer y installer beaucoup plus que le minimum. Une utilisation (très) courante consiste à l'utiliser comme... AP Wifi ! Si vous devez/voulez journaliser, il faut envisager - plus que sérieusement - d'utiliser pour cela un démon syslog sur une machine à part.
===== Le routeur Linksys WRT54G =====
* Le routeur WRT54G est un boitier "trois en un" qui fournit une connectivité sans fil (802.11b et 802.11g) et Ethernet 10/100 Mbits ainsi que la fonction routeur qui permet à tout ce beau monde d'être connecté à l'Internet par le biais, par exemple, d'une liaison ADSL.
* Les fonctionnalités DHCP et pare-feu à état ainsi qu'une interface d'administration HTTP/HTTPS alliées à un très bon prix achèvent de faire de ce produit un bon achat.
* Enfin, et c'est que qui nous intéresse dans cet article, le routeur WRT54G est la plate-forme de choix pour tester des firmware Libre au premier rang desquels on trouve OpenWRT.
{{start:wrt54g.jpg}}
===== OpenWRT =====
* OpenWRT est une distribution Linux pour routeurs Wifi. Elle fournit les fonctionnalités de base nécessaires à ce type d'appareil ainsi qu'un environnement minimaliste qui permet d'étendre les capacités du routeur à l'aide de paquetages.
* [[http://www.openwrt.org|Site officiel]]
===== Installation en 3 étapes =====
==== Etape 1 ====
* Première étape : lecture de la documentation officielle : [[http://www.openwrt.org|Site OpenWRT]]
* Une fois l'obscur objet du désir acheté (61 euros sur Amazon), livré et déballé, il faut activer la fonctionnalité boot_wait. En gros, cela consiste à induire un délai de 5 secondes au boot du routeur. Ces 5 précieuses secondes permettent de charger le firmware depuis un serveur TFTP. Par firmware, il faut comprendre les mises à jour du logiciel Linksys mais aussi - et surtout dans notre cas - OpenWRT.
=== Activation du boot_wait ===
* **Note** On trouve ici ou là des modes opératoires qui préconisent de downgrader le firmware du routeur si sa version est supérieure à 3.7 sous peine de ne pouvoir exploiter le "bug" du ping. Dans mon cas, le routeur a été livré avec un firmware en version 4.01.1 et tout a fonctionné. La documentation officielle précise de surcroît que l'exploitation du bug n'est pas liée à une version de firmware.
- Il est impératif d'affecter à l'interface Internet du routeur une adresse IP. Le plus simple est encore d'utiliser une adresse quelconque en statique. Attention : il faut renseigner aussi le netmask et la passerelle (gateway).
- Il faut ensuite ouvrir la fenêtre Ping (menu Diagnostics) et entrer l'une après l'autre les lignes suivantes en cliquant sur le bouton Ping après chaque entrée :
;cp${IFS}*/*/nvram${IFS}/tmp/n
;*/n${IFS}set${IFS}boot_wait=on
;*/n${IFS}commit
;*/n${IFS}show>tmp/ping.log
Si tout c'est bien passé, l'écran de diagnostic se présente sous la forme suivante et l'option boot_wait apparait à on :
{{start:ping-bug-result.png}}
==== Etape 2 ====
- Télécharger la version courante d'OpenWRT.
- Utiliser un client TFTP pour télécharger le firmware OpenWRT sur le routeur.
- **Note** Pour une découverte d'OpenWRT, il est prudent de choisir squashfs comme système de fichier. C'est la méthode standard, dixit la doc. officielle.
- Une fois le transfert effectué, laissez le routeur booter. Cela peut prendre quelques minutes. Pour suivre la progression du démarrage, surveillez la LED DMZ : elle est allumée durant le boot, éteinte dès que le système est "up".
==== Etape 3 ====
- Lorsque la phase de boot est terminée, vérifiez que tout c'est bien passé en ouvrant une session telnet sur l'IP 192.168.1.1 (IP utilisée par défaut) :
bash-2.05a$ telnet 192.168.1.1
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
=== IMPORTANT ============================
Use 'passwd' to set your login password
this will disable telnet and enable SSH
------------------------------------------
BusyBox v1.00 (2005.09.14-15:55+0000) 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
WHITE RUSSIAN (RC3) -------------------------------
* 2 oz Vodka Mix the Vodka and Kahlua together
* 1 oz Kahlua over ice, then float the cream or
* 1/2oz cream milk on the top.
---------------------------------------------------
root@linksys:/#
* Voilà, OpenWRT tourne maintenant sur votre routeur, et vice versa.
===== Firstboot =====
* Le firmware OpenWRT est composé d'un noyau et d'un système de fichiers en lecture seule : squashfs.
* Au démarrage du routeur, une partition jffs2 est automatiquement (enfin, quand tout se passe bien...) créée et montée en mode écriture/lecture. La création de cette partition est réalisée par le script firstboot.
* Avant l'exécution de ce script, voici l'état des partitions (//snapshot// réalisé en mode failsafe que nous aborderons plus loin) :
root@linksys:/# mount
/dev/root on / type squashfs (ro)
none on /dev type devfs (rw)
none on /proc type proc (rw)
none on /tmp type tmpfs (rw,nosuid,nodev)
none on /dev/pts type devpts (rw)
* Après exécution du script firstboot :
root@linksys:/etc# mount
/dev/root on /rom type squashfs (ro)
none on /rom/dev type devfs (rw)
none on /rom/tmp type tmpfs (rw,nosuid,nodev)
none on /rom/dev/pts type devpts (rw)
/dev/mtdblock/4 on / type jffs2 (rw)
none on /proc type proc (rw)
none on /dev type devfs (rw)
none on /tmp type ramfs (rw)
* L'espace "disque" total est de 8 Mo répartis comme ceci :
root@linksys:/# df -h
Filesystem Size Used Available Use% Mounted on
/dev/root 1.1M 1.1M 0 100% /rom
none 7.0M 4.0k 7.0M 0% /rom/tmp
/dev/mtdblock/4 2.2M 360.0k 1.8M 16% /
**Note** La partition /rom est en lecture seule et de type squashfs. Comme nous le constaterons plus loin, de nombreux fichiers de configuration de base du répertoire /etc sont des liens vers des fichiers localisés sur cette partition. De ce fait, ils ne sont pas éditables et il est nécessaire d'effacer le lien et de créer un fichier dans le répertoire /etc pour manipuler les paramètres de certains programmes.
* La commande dmesg fournit les informations suivantes :
root@linksys:/# dmesg
CPU revision is: 00029007
Primary instruction cache 8kB, physically tagged, 2-way, linesize 16 bytes.
Primary data cache 4kB, 2-way, linesize 16 bytes.
Linux version 2.4.30 (wbx@ux-2y01) (gcc version 3.4.4) #1 Wed Sep 14 17:49:26 CEST 2005
Setting the PFC value as 0x15
Determined physical RAM map:
memory: 01000000 @ 00000000 (usable)
On node 0 totalpages: 4096
zone(0): 4096 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: root=/dev/mtdblock2 rootfstype=squashfs,jffs2 init=/etc/preinit noinitrd console=ttyS0,115200
CPU: BCM4712 rev 2 at 216 MHz
Using 108.000 MHz high precision timer.
Calibrating delay loop... 215.44 BogoMIPS
Memory: 14296k/16384k available (1390k kernel code, 2088k reserved, 100k data, 80k init, 0k highmem)
Dentry cache hash table entries: 2048 (order: 2, 16384 bytes)
Inode cache hash table entries: 1024 (order: 1, 8192 bytes)
Mount cache hash table entries: 512 (order: 0, 4096 bytes)
Buffer cache hash table entries: 1024 (order: 0, 4096 bytes)
Page-cache hash table entries: 4096 (order: 2, 16384 bytes)
Checking for 'wait' instruction... unavailable.
POSIX conformance testing by UNIFIX
PCI: Disabled
PCI: Fixing up bus 0
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
Starting kswapd
devfs: v1.12c (20020818) Richard Gooch (rgooch@atnf.csiro.au)
devfs: boot_options: 0x1
JFFS2 version 2.1. (C) 2001 Red Hat, Inc., designed by Axis Communications AB.
Squashfs 2.1-r2 (released 2004/12/15) (C) 2002-2004 Phillip Lougher
pty: 256 Unix98 ptys configured
Serial driver version 5.05c (2001-07-08) with MANY_PORTS SHARE_IRQ SERIAL_PCI enabled
ttyS00 at 0xb8000300 (irq = 3) is a 16550A
ttyS01 at 0xb8000400 (irq = 0) is a 16550A
Software Watchdog Timer: 0.05, timer margin: 60 sec
Physically mapped flash: Found an alias at 0x400000 for the chip at 0x0
Physically mapped flash: Found an alias at 0x800000 for the chip at 0x0
Physically mapped flash: Found an alias at 0xc00000 for the chip at 0x0
Physically mapped flash: Found an alias at 0x1000000 for the chip at 0x0
Physically mapped flash: Found an alias at 0x1400000 for the chip at 0x0
Physically mapped flash: Found an alias at 0x1800000 for the chip at 0x0
Physically mapped flash: Found an alias at 0x1c00000 for the chip at 0x0
cfi_cmdset_0001: Erase suspend on write enabled
0: offset=0x0,size=0x2000,blocks=8
1: offset=0x10000,size=0x10000,blocks=63
Using word write method
Flash device: 0x400000 at 0x1c000000
Creating 5 MTD partitions on "Physically mapped flash":
0x00000000-0x00040000 : "pmon"
0x00040000-0x003f0000 : "linux"
0x000ba4b0-0x001c0000 : "rootfs"
mtd: partition "rootfs" doesn't start on an erase block boundary -- force read-only
0x003f0000-0x00400000 : "nvram"
0x001c0000-0x003f0000 : "OpenWrt"
Initializing Cryptographic API
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP, IGMP
IP: routing cache hash table of 512 buckets, 4Kbytes
TCP: Hash tables configured (established 1024 bind 2048)
ip_conntrack version 2.1 (5953 buckets, 5953 max) - 320 bytes per conntrack
ip_tables: (C) 2000-2002 Netfilter core team
NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
NET4: Ethernet Bridge 008 for NET4.0
802.1Q VLAN Support v1.8 Ben Greear
All bugs added by David S. Miller
VFS: Mounted root (squashfs filesystem) readonly.
Mounted devfs on /dev
Freeing unused kernel memory: 80k freed
Algorithmics/MIPS FPU Emulator v1.5
diag boardtype: 00000708
jffs2.bbc: SIZE compression mode activated.
PCI: Setting latency timer of device 00:02.0 to 64
eth0: Broadcom BCM47xx 10/100 Mbps Ethernet Controller 3.90.23.0
PCI: Setting latency timer of device 00:01.0 to 64
eth1: Broadcom BCM4320 802.11 Wireless Controller 3.90.37.0
device eth0 entered promiscuous mode
vlan0: Setting MAC address to 00 14 bf 2f 48 d6.
VLAN (vlan0): Underlying device (eth0) has same MAC, not checking promiscious mode.
vlan0: add 01:00:5e:00:00:01 mcast address to master interface
device eth1 entered promiscuous mode
eth1: attempt to add interface with same source address.
br0: port 2(eth1) entering learning state
br0: port 1(vlan0) entering learning state
br0: port 2(eth1) entering forwarding state
br0: topology change detected, propagating
br0: port 1(vlan0) entering forwarding state
br0: topology change detected, propagating
vlan1: Setting MAC address to 00 14 bf 2f 48 d7.
vlan1: add 01:00:5e:00:00:01 mcast address to master interface
* **Note** Le script firstboot peut également être utilisé pour //réinitialiser// OpenWRT, ce qui revient à effacer toutes les modifications apportées précédemment : fichiers modifiés, mais également paquetages installés. Il est ainsi possible de revenir à l'état initial d'après installation avec les valeurs et objets (fichiers, paquetages) par défaut.
===== Découverte du système =====
* Par défaut, nous venons de le voir, la connexion se fait en telnet sans mot de passe. Avant de sécuriser a minima l'administration de notre routeur en activant SSH, faisons un rapide petit tour du propriétaire.
* OpenWRT fournit un noyau Linux 2.4 :
root@linksys:/# uname -a
Linux linksys 2.4.30 #1 Wed Sep 14 17:49:26 CEST 2005 mips unknown
un shell (ash) et les paquetages de base qui permettent d'activer la fonctionnalité AP WiFi :
root@linksys:/# ipkg list
base-files - 2 -
base-files-brcm - 1 -
bridge - 1.0.6-1 -
busybox - 1.00-2 -
dnsmasq - 2.22-2 -
dropbear - 0.45-3 -
hotplug - 2 -
ipkg - 0.99.149-2 -
iptables - 1.3.1-1 -
kernel - 2.4.30-brcm-2 -
kmod-brcm-et - 2.4.30-brcm-2 -
kmod-brcm-wl - 2.4.30-brcm-2 -
kmod-diag - 2.4.30-brcm-2 -
kmod-ppp - 2.4.30-brcm-2 -
kmod-pppoe - 2.4.30-brcm-2 -
kmod-wlcompat - 2.4.30-brcm-3 -
libgcc - 3.4.4-2 -
mtd - 2 -
nvram - 1 -
ppp - 2.4.3-6 -
ppp-mod-pppoe - 2.4.3-6 -
uclibc - 0.9.27-2 -
wificonf - 4 -
wireless-tools - 28.pre7-1 -
zlib - 1.2.2-2 -
Successfully terminated.
L'utilitaire ipkg est un gestionnaire de paquetages OpenWRT. L'option list utilisée ci-dessus, comme son nom l'indique, affiche la liste des paquetages installés en standard. Outre l'utilitaire ipkg, on notera la présence du filtre de paquets iptables et de dropbear, un serveur SSH2 pour OpenWRT.
* ash est quant à lui un shell tout particulièrement adapté aux environnements restreints car il est peu gourmand en mémoire et tient peu de place sur disque. Il vise une compatibilité maximale avec le Bourne Shell.
===== Configuration Réseau =====
* Le routeur WRT54G possède plusieurs interfaces physiques : 1 interface Ethernet dite "WAN" ou Internet, 4 interfaces Ethernet dites "LAN" et une interface Wifi.
* la commande ifconfig fait ressortir les interfaces logiques suivantes :
root@linksys:/etc/openvpn# ifconfig
br0 Link encap:Ethernet HWaddr 00:14:BF:2F:48:D6
inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8372 errors:0 dropped:0 overruns:0 frame:0
TX packets:7629 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1546676 (1.4 MiB) TX bytes:1439167 (1.3 MiB)
eth0 Link encap:Ethernet HWaddr 00:14:BF:2F:48:D6
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
RX packets:8372 errors:0 dropped:0 overruns:0 frame:0
TX packets:7629 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1730860 (1.6 MiB) TX bytes:1469683 (1.4 MiB)
Interrupt:5 Base address:0x2000
eth1 Link encap:Ethernet HWaddr 00:14:BF:2F:48:D6
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:11480
TX packets:375 errors:118 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:30381 (29.6 KiB)
Interrupt:4 Base address:0x1000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:9899 errors:0 dropped:0 overruns:0 frame:0
TX packets:9899 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:963498 (940.9 KiB) TX bytes:963498 (940.9 KiB)
vlan0 Link encap:Ethernet HWaddr 00:14:BF:2F:48:D6
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8372 errors:0 dropped:0 overruns:0 frame:0
TX packets:7629 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1580164 (1.5 MiB) TX bytes:1469683 (1.4 MiB)
vlan1 Link encap:Ethernet HWaddr 00:14:BF:2F:48:D7
inet addr:213.223.10.10 Bcast:213.223.10.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
* L'interface WAN apparait sous le nom vlan1.
* Les 4 interfaces LAN et l'interface Wifi (eth1) sont quant à elles regroupées (//bridgées//) autour de l'interface br0 sur le réseau 192.168.1.0/24. L'adresse IP d'administration du routeur sur ce réseau est 192.168.1.1. L'attriburion d'IP sur ce réseau se fait à l'aide d'un serveur DHCP qui tourne sur le routeur.
===== Gestion de la NVRAM =====
* La quasi totalité des paramètres de configuration du routeur sont stockés de manière non volatile sur la NVRAM.
* La manipulation de ces paramètres s'effectue à l'aide de la commande nvram qui permet de lister l'ensemble des paramètres et la valeur de chacun d'eux et de les modifier. Dans l'exemple ci-dessous, nous affichons l'ensemble des paramètres relatifs à l'interface Wifi :
root@linksys:~# nvram show | grep wl0
wl0_net_mode=mixed
wl0_frameburst=off
wl0_wep_buf=
wl0_akm=
wl0_macmode1=disabled
wl0_infra=1
wl0_country_code=ALL
wl0_wme_sta_be=15 1023 3 0 0 off
wl0_ifname=eth1
wl0_wme_sta_bk=15 1023 7 0 0 off
wl0_mrate=0
wl0_mode=ap
wl0_ap_isolate=0
wl0_gmode=1
wl0_wme_no_ack=off
wl0_wep_last=
wl0_ssid=linksys
wl0_dtim=1
wl0id=0x4320
wl0_key1=
wl0_key2=
wl0_key3=
wl0_key4=
wl0_wme_ap_vi=7 15 1 6016 3008 off
wl0_closed=1
wl0_rate=0
wl0_plcphdr=long
wl0_macmode=disabled
wl0_radioids=BCM2050
wl0_wme_ap_vo=3 7 1 3264 1504 off
wl0gpio2=0
wl0_phytype=g
wl0gpio3=0
wl0_lazywds=1
wl0_afterburner=off
wl0_antdiv=-1
wl0_wpa_psk=
wl0_mac_list=
wl0_unit=0
wl0_net_reauth=36000
wl0_wds=
wl0_mac_deny=
wl0_auth=0
wl0_wme=off
wl0_radius_port=1812
wl0_radius_ipaddr=
wl0_wme_sta_vi=7 15 2 6016 3008 off
wl0_wme_sta_vo=3 7 2 3264 1504 off
wl0_maxassoc=128
wl0_phytypes=g
wl0_wep=disabled
wl0_frag=2346
wl0_country=ALL
wl0_rateset=default
wl0_wep_bit=64
wl0_passphrase=
wl0_rts=2347
wl0_wpa_gtk_rekey=3600
wl0_key=1
wl0_active_mac=
wl0_radio=0
wl0_bcn=100
wl0_hwaddr=00:14:BF:2F:48:D8
wl0_wep_gen=
wl0_gmode_protection=off
wl0_maclist=
wl0_radius_key=
wl0_wme_ap_be=15 63 3 0 0 off
wl0_corerev=7
wl0_channel=11
wl0_wds_timeout=1
wl0_wme_ap_bk=15 1023 7 0 0 off
wl0_auth_mode=none
wl0_crypto=tkip
Pour modifier un paramètre :
: Exemple : désactiver le wifi
# nvram set wl0_radio=0
: "flasher" la nouvelle valeur
# nvram commit
: Et l'inévitable reboot pour la prise en compte
: du nouveau paramètre
# reboot
===== Adieu telnet, bonjour SSH =====
* Tout fonctionne bien, il est maintenant temps de passer aux choses plus sérieuses, à commencer par sécuriser le mode d'administration du routeur. Nous allons pour cela activer le serveur SSH Dropbear fourni en standard et stopper le démon telnet.
* Il faut savoir que même si le démon ssh est lancé, aucune connexion SSH root ne sera possible si cet utilisateur n'a pas de mot de passe (ca qui est le cas par défaut).
* Il faut donc en premier lieu affecter un mot de passe à l'utilisateur root. Nous sommes sur un Unix-like, la commande passwd fait donc très bien l'affaire.
* Un kill sur le processus telnetd réduira ce dernier au silence. Pour pérenniser cette situation, il faudra aussi effacer le lien symbolique /etc/init.d/S50telnet.
* Il sera toujours possible pour les plus exigeants de remplacer DropBear pour un serveur OpenSSH. Des paquetages existent pour cela.
===== Installation de paquetages =====
* Les fonctionnalités de base d'OpenWRT peuvent (relativement) aisément étendues à l'aide de paquetages.
* L'utilitaire ipkg déjà cité plus haut est alors utilisé. Dans l'exemple ci-dessous, nous avons ainsi installé la bibliothèque libpcap et tcpdump :
root@linksys:~# ipkg install libpcap_0.8.3-1_mipsel.ipk
Installing libpcap (0.8.3-1) to root...
Configuring libpcap
Successfully terminated.
root@linksys:~# ipkg install tcpdump_3.8.3-1_mipsel.ipk
Installing tcpdump (3.8.3-1) to root...
Configuring tcpdump
Successfully terminated.
* L'espace disque étant limité, il est intéressant de noter qu'il est possible - et souhaitable - d'installer des paquetages depuis un site web plutôt qu'importer les paquetages sur le routeur (comme dans l'exemple ci-dessus). Pour cela, il faut éditer le fichier /etc/ipkg.conf pour spécifier l'adresse du site que l'on veut utiliser comme source.
* Dans le mode d'installation standard (squashfs), les principaux fichiers du répertoire /etc sont en réalité des liens vers leurs homologues de la partition /rom :
root@linksys:~# ls -l /etc
lrwxrwxrwx 1 root root 15 Jan 1 02:15 banner -> /rom/etc/banner
lrwxrwxrwx 1 root root 21 Jan 1 02:15 dnsmasq.conf -> /rom/etc/dnsmasq.conf
drwxr-xr-x 1 root root 0 Jan 1 00:04 dropbear
lrwxrwxrwx 1 root root 22 Jan 1 02:15 firewall.user -> /rom/etc/firewall.user
lrwxrwxrwx 1 root root 21 Jan 1 02:15 functions.sh -> /rom/etc/functions.sh
lrwxrwxrwx 1 root root 14 Jan 1 02:15 group -> /rom/etc/group
lrwxrwxrwx 1 root root 14 Jan 1 02:15 hosts -> /rom/etc/hosts
drwxr-xr-x 1 root root 0 Jan 1 02:15 init.d
lrwxrwxrwx 1 root root 16 Jan 1 02:15 inittab -> /rom/etc/inittab
-rw-r----- 1 root root 167 Jan 1 01:36 ipkg.conf
lrwxrwxrwx 1 root root 16 Jan 1 02:15 modules -> /rom/etc/modules
drwxr-xr-x 1 root root 0 Jan 1 02:15 modules.d
lrwxrwxrwx 1 root root 24 Jan 1 02:15 nvram.overrides -> /rom/etc/nvram.overrides
-rw-r----- 1 root root 99 Jan 1 00:01 passwd
-rw------- 1 root root 74 Aug 13 2005 passwd-
drwxr-xr-x 1 root root 0 Jan 1 02:15 ppp
lrwxrwxrwx 1 root root 16 Jan 1 02:15 preinit -> /rom/etc/preinit
lrwxrwxrwx 1 root root 16 Jan 1 02:15 profile -> /rom/etc/profile
lrwxrwxrwx 1 root root 18 Jan 1 02:15 protocols -> /rom/etc/protocols
lrwxrwxrwx 1 root root 20 Jan 1 02:15 resolv.conf -> /rom/etc/resolv.conf
lrwxrwxrwx 1 root root 15 Jan 1 02:15 shells -> /rom/etc/shells
lrwxrwxrwx 1 root root 16 Jan 1 02:15 sysconf -> /rom/etc/sysconf
lrwxrwxrwx 1 root root 20 Jan 1 02:15 sysctl.conf -> /rom/etc/sysctl.conf
Or cette partition de type squashfs est en lecture seule (les plus perspicaces auront deviné que ROM signifie Read Only Memory) :
root@linksys:~# mount
/dev/root on /rom type squashfs (ro)
none on /rom/dev type devfs (rw)
/dev/mtdblock/4 on / type jffs2 (rw)
none on /proc type proc (rw)
none on /dev type devfs (rw)
none on /tmp type tmpfs (rw,nosuid,nodev)
none on /dev/pts type devpts (rw)
* Pour modifier le fichier original /etc/ipkg.conf, il convient d'effectuer les petites modifications suivantes :
rm /etc/ipkg.conf
cp /rom/etc/ipkg.conf /etc/ipkg.conf
Le fichier est alors créé sur une partition en lecture/écriture et peut être modifié sans problème.
* Cette remarque et cette méthode s'appliquent à tous les liens contenus dans le répertoire /etc.
* Parmi les paquetages à installer rapidement : openntpd et htpdate pour automatiser la mise à jour de l'horloge système du routeur. Sans ces outils, vous êtes condamnés à perdre la date système à chaque arrêt du routeur.
===== Installation d'une interface graphique =====
* Les inconditionnels de la GUI regretteront sûrement d'avoir dû troquer l'interface Web d'origine pour l'administration à la main via SSH.
* Qu'ils se consolent : il existe plusieurs projets - plus ou moins aboutis et complets - d'interface graphique pour OpenWRT.
* Dans ce paragraphe, nous décrirons l'installation d'une des interfaces les plus prometteuses à notre goût (jugement cependant tout à fait subjectif et donc à prendre comme tel !) : OpenWRT Administrative Console.
* Cet outil utilise le serveur HTTP livré en standard avec openWRT et est constitué de scripts qui appellent majoritairement l'utilitaire nvram décrit ci-dessus pour modifier à la volée les paramètres de configuration réseau du routeur.
* Elle permet ainsi de modifier la configuration des interfaces réseau du routeur mais elle permet aussi de gérer les paquetages (mise à jour, ajoût, destruction).
* Il faut installer deux paquetages : haserl et webif-test.
* Le résultat est illustré par les quelques captures suivantes :
{{start:openwrt-1.png?600x400}}
{{start:openwrt-2.png?600x400}}
{{start:openwrt-3.png?600x400}}
{{start:openwrt-4.png?600x400}}
* Une version de démonstration complète en ligne est disponible [[http://openwrt.inf.fh-brs.de/~nbd/webif/wireless-config.sh.html|ici]].
===== Filtrage réseau =====
* Par défaut, OpenWRT fournit un ensemble de règles IPtables pour appliquer un filtrage réseau minimaliste mais très bien adapté à un usage "domestique" du routeur.
* En gros, les flux sortants sont autorisés et l'activation du filtrage à état (//stateful inspection//) garantit que seuls les flux retour sont acceptés.
* Voici le fichier de règles inclus en standard et chargé au démarrage :
root@point-central:~# more /etc/init.d/S45firewall
#!/bin/sh
## Please make changes in /etc/firewall.user
${FAILSAFE:+exit}
. /etc/functions.sh
WAN=$(nvram get wan_ifname)
LAN=$(nvram get lan_ifname)
## CLEAR TABLES
for T in filter nat mangle; do
iptables -t $T -F
iptables -t $T -X
done
iptables -N input_rule
iptables -N output_rule
iptables -N forwarding_rule
iptables -t nat -N prerouting_rule
iptables -t nat -N postrouting_rule
### INPUT
### (connections with the router as destination)
# base case
iptables -P INPUT DROP
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --tcp-flags SYN SYN --tcp-option \! 2 -j DROP
#
# insert accept rule or to jump to new accept-check table here
#
iptables -A INPUT -j input_rule
# allow
iptables -A INPUT -i \! $WAN -j ACCEPT # allow from lan/wifi interfaces
iptables -A INPUT -p icmp -j ACCEPT # allow ICMP
iptables -A INPUT -p gre -j ACCEPT # allow GRE
# reject (what to do with anything not allowed earlier)
iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -j REJECT --reject-with icmp-port-unreachable
### OUTPUT
### (connections with the router as source)
# base case
iptables -P OUTPUT DROP
iptables -A OUTPUT -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#
# insert accept rule or to jump to new accept-check table here
#
iptables -A OUTPUT -j output_rule
# allow
iptables -A OUTPUT -j ACCEPT #allow everything out
# reject (what to do with anything not allowed earlier)
iptables -A OUTPUT -p tcp -j REJECT --reject-with tcp-reset
iptables -A OUTPUT -j REJECT --reject-with icmp-port-unreachable
### FORWARDING
### (connections routed through the router)
# base case
iptables -P FORWARD DROP
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
#
# insert accept rule or to jump to new accept-check table here
#
iptables -A FORWARD -j forwarding_rule
# allow
iptables -A FORWARD -i br0 -o br0 -j ACCEPT
iptables -A FORWARD -i $LAN -o $WAN -j ACCEPT
# reject (what to do with anything not allowed earlier)
# uses the default -P DROP
### MASQ
iptables -t nat -A PREROUTING -j prerouting_rule
iptables -t nat -A POSTROUTING -j postrouting_rule
iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE
## USER RULES
[ -f /etc/firewall.user ] && . /etc/firewall.user
===== En cas de problème... =====
* La vie n'est pas toujours un long fleuve tranquille et il peut être utile de savoir comment se sortir de quelques mauvais pas tels que connexion impossible au routeur ou blocage suite à une lecture trop rapide de la documentation officielle (ça sent le vécu, n'est-ce pas ? :-)).
* Premier secours : booter le routeur en mode failsafe (équivalent à un bon vieux boot single). Pour cela, il faut débrancher le routeur puis le rallumer. Dès que la LED DMZ s'allume, il faut presser durant 2 secondes le bouton Reset situé à l'arrière de l'appareil. Si l'opération se déroule bien, la LED DMZ clignotte alors trois fois et la procédure de boot continue. La connexion au routeur par telnet est alors possible. Le plus simple alors est de lancer le script firstboot qui réinitialise OpenWRT.
* Deuxième et dernier recours : si l'opération précédente échoue, il faut réinstaller OpenWRT par TFTP.
===== En guise de conclusion =====
* OpenWRT n'apporte guère de fonctionnalités supplémentaires par rapport au firmware d'origine livré par Linksys. **Mais** - et ce mais est important - il permet l'installation d'outils complémentaires - tels OpenVPN - qui permettent de sécuriser les liaisons Wifi ou augmentent les fonctionnalités offertes, dans la limite des capacités matérielles du routeur. Parmi ces paquetages, citons, outre OpenVPN : antidote (détection de l'ARP Poisoning), arpwatch, etc.
* En outre, OpenWRT est une bonne base d'apprentissage pour qui souhaite construire une AP plus complexe (mais aussi plus onéreuse) par la suite, que ce soit à partir de plate-formes telles que les boitiers Soekris ou même de //vulgaires// PC sous Linux.
* On attend également avec impatience que des projets comme FreeBSD ou OpenBSD soient portés sur cette plate-forme.