Utiliser un firmware OpenWRT pour WRT54G

I) Introduction

OpenWRT est un ensemble d’outils linux basiques permettant de faire fonctionner les Linksys WRT54G v1, v2, et GS sous Linux. Ce firmware utilise le code GPL fournit par Linksys qui comprend :

-  un noyau Linux 2.4.20 adapté
-  des binaires pour gérer la carte wireless Broadcom
-  des outils de base : busybox, httpd, telnet ...

II) A qui s’adresse ce firmware ?

Du fait qu’il est dépourvu d’une interface d’administration par navigateur web, tout se fait via telnet ou via ssh. Il est donc recommandé d’avoir une expérience de base avec les outils réseaux linux : ifconfig, route, tc, iwconfig ...

Si vous recherchez un firmware puissant et facile à personnaliser, celui-ci vous est dédié car il vous permettra de configurer votre routeur jusque dans ses moindres détails : dns, dhcp, vpn, radius, nas ... les possibilités sont illimitées. Vous pouvez même monter une distribution Linux complète pour architecture MIPS via NFS.

III) Comment l’installer

Deux possibilités :

-  vous utilisez une machine Windows/MacOS (< MacOSX) et vous ne pouvez pas compiler le firmware (les outils ne sont pas disponibles)

-  vous disposez d’une machine sous Linux et vous pouvez compiler vous même votre firmware

Si vous êtes sous Windows/MacOS (versions antérieures à MacOSX

Je fournis à titre expérimental des firmwares à l’adresse suivante :

http://openwrt.alphacore.net/firmwares

Nous verrons plus tard comment les configurer.

Si vous êtes sous Linux ou MacOSX

Vous pouvez compiler vous même votre propre firmware et c’est une expérience intéressante.

Commencez par télécharger via CVS le dernier buildroot


cvs -d:pserver:anonymous@openwrt.org:/openwrt login
cvs -d:pserver:anonymous@openwrt.org:/openwrt co buildroot

Une fois que c’est terminé, allez dans le répertoire buildroot puis tapez make. Le script va alors commencer par télécharger toutes les archives nécessaires : uClibc, WRT54GS ...

Attention : entre 700Mo et 1Go d’espace disque sont nécessaires après décompression des archives

Attention : actuellement, la version du snapshot à télécharger est 20041031, changez cette variable dans le Makefile pour : 20041201


cd buildroot
make

Patientez pendant la compilation. A la fin vous devriez disposer des fichiers suivants, à la racine du répertoire buildroot


openwrt-g-code.bin
openwrt-gs-code.bin          
openwrt-kmodules.tar.bz2    
openwrt-linux.trx

Préparer votre routeur au flashage du firmware

Changer le firmware pour un autre non supporté par Linksys annule votre garantie ! cependant vous pouvez toujours revenir aux firmwares d’origine

Mais n’ayez crainte, il n’y a aucun moyen de planter votre routeur au point de ne pouvoir le récupérer.

Votre routeur doit avoir une adresse Internet pour que la mise à jour. Si vous n’en avez pas, rentrez en une du style : 192.168.2.1

Connectez vous sur l’interface web de votre routeur (ex : http://192.168.1.1 )

Puis allez dans Administration > Diagnostics

(PNG)

Cliquez sur Ping

Puis tapez les commandes suivantes :


;cp${IFS}*/*/nvram${IFS}/tmp/n (cliquez sur Ping)
;*/n${IFS}set${IFS}boot_wait=on (cliquez sur Ping)
;*/n${IFS}commit (cliquez sur Ping)
;*/n${IFS}show>tmp/ping.log (cliquez sur Ping)

Comme montré dans les captures d’écran suivantes :

(PNG)
(PNG)
(PNG)
(PNG)

Ces commandes permettent d’activer le boot_wait c’est à dire que votre routeur pourra toujours recevoir un firmware même si l’envoi échoue la première fois.

Allez ensuite dans Administration > Firmware Upgrade

(PNG)

Sélectionnez votre fichier. Suivant votre modèle, vous devrez uploader le firmware qui correspond.

-  Pour les WRT54G v1 et v2 : openwrt-g-code.bin
-  Pour les WRT54GS : openwrt-gs-code.bin
-  Pour les WRT54G déjà sous OpenWRT ou pour les autres modèles de routeurs : openwrt-linux.trx (c’est une manipulation qui sera décrite plus tard)

(PNG)

Le firmware est en train d’être envoyé, donc patientez et ne fermez pas votre navigateur.

En cas de problèmes durant l’envoi, le routeur peut être récupéré via tftp cette manoeuvre est décrite ci-dessous.

Mon routeur semble ne pas fonctionner après flashage ou j’ai raté le flashage

C’est le cas si les led Power et Diagnostic ou DMZ clignonent, dans ce cas il faut que vous envoyiez le firmware via tftp. Pour cela, vous pouvez télécharger un client FTP comme celui-ci : http://www.winagents.com/downloads/tftpsetup.exe

Puis activer le mode de transfert binaire, et activez le packet tracing, puis uploadez le firmware ainsi :


tftp 192.168.1.1
tftp> binary
tftp> rexmt 1
tftp> trace
Packet tracing on.
tftp> put openwrt-g-code.bin

Votre WRT54G devrait à présent disposer d’un nouveau firmware OpenWRT prêt à fonctionner.

IV) Bien commencer avec son WRT54G

La première étape consiste à se connecter sur le WRT54G via telnet :


telnet 192.168.1.1
Connected to gw1.alphacore.home.
Escape character is '^]'.



BusyBox v1.00 (2004.11.20-23:09+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

@OpenWrt:/#

Vous avez la liste des commandes disponibles via la comande help


Built-in commands:
-------------------
       . : alias bg break cd chdir command continue eval exec exit export
       false fg getopts hash help jobs kill let local pwd read readonly
       return set shift times trap true type ulimit umask unalias unset
       wait

La première étape consiste à configurer la connexion internet. Ici nous prenons le cas d’une connexion internet via DHCP (Freebox).


udhcpc -i vlan1 -b -p /tmp/dhcp-wan.pid

Vous devriez à présent avoir une adresse internet :

ifconfig vlan1
vlan1     Link encap:Ethernet  HWaddr 00:0F:**:**:**:**
         inet addr:82.67.132.**  Bcast:82.67.132.255  Mask:255.255.255.0
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:2630747 errors:0 dropped:0 overruns:0 frame:0
         TX packets:3365319 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0
         RX bytes:887479573 (846.3 MiB)  TX bytes:3937287185 (3.6 GiB)

Une fois que la connexion internet est configurée, vous pouvez configurer votre serveur dhcp et serveur dns cache. Le serveur qui fait tout ça s’appelle dnsmasq


Fichier /etc/dnsmasq.conf

Voici une configuration assez simple :


domain-needed
bogus-priv
filterwin2k
local=/lan/
domain=alphacore.home
except-interface=vlan1
read-ethers
dhcp-range=192.168.0.1,192.168.0.253,255.255.255.0,1h
dhcp-leasefile=/tmp/dhcp.leases
dhcp-option=3,192.168.0.250
dhcp-option=6,192.168.0.250

L’option 3 spécifie les routeurs du réseau.

L’option 6 précise les serveurs DNS disponibles.

Il faut ensuite redémarrer le serveur pour lui faire prendre en compte les nouvelles modifications :


killall dnsmasq
dnsmasq

Les outils tels que ifconfig et iwconfig ont exactement la même utilisation. Pour donner l’adresse IP locale 192.168.0.250 à votre routeur tapez :


ifconfig br0 192.168.0.250 netmask 255.255.255.0

Pour changer le SSID tapez :


iwconfig eth1 essid "florian@nantes-wireless.org"

Ceci est un exemple.

Attention, ces paramètres ne sont valables que le temps que le routeur est allumé, pour les conserver, il faut les inscrire dans la NVRAM


Enregistrer les paramètres dans la NVRAM

NVRAM pour Non Volatile RAM est une sorte de puce qui stocke des paramètres globaux du routeur. Attention, il ne faut pas faire trop de nvram commit afin de ménager votre routeur.

Pour fixer l’adresse IP locale et statique tapez :


nvram set lan_ipaddr=192.168.0.250
nvram set lan_proto=static

Pour fixer le SSID, tapez :


nvram set wl0_ssid="<ssid>"

La listes des paramètres de la nvram est donnée via nvram show.

Pour fixer les paramètres dans la nvram tapez :


nvram commit
nvram_commit(): start
nvram_commit(): end

(Cf : http://www.openwrt.org/OpenWrtNVRAM et http://campus.ecp.fr/ petrus/linux_chillispot_openwrt.php )


V) Quelques scripts utiles

Voici un firewall amélioré pour le WRT54G supportant le port forwarding et la sécurisation des connexions :


#!/bin/sh
. /etc/functions.sh
WAN=$(nvram get wan_ifname)
IPT=/usr/sbin/iptables
for T in filter nat mangle ; do
 $IPT -t $T -F
 $IPT -t $T -X
done
LOOP=127.0.0.1
INTINF=br0
$IPT -P OUTPUT ACCEPT
$IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPT -A INPUT -i $WAN -p tcp --dport 20 -j ACCEPT
$IPT -A INPUT -i $WAN -p tcp --dport 5000 -j ACCEPT
$IPT -A INPUT -i $LOOP -j ACCEPT
$IPT -A INPUT -i $WAN -s $LOOP -j DROP
$IPT -A FORWARD -i $WAN -s $LOOP -j DROP
$IPT -A INPUT -i $WAN -d $LOOP -j DROP
$IPT -A FORWARD -i $WAN -d $LOOP -j DROP
$IPT -A INPUT -i $INTINF -s $LOOP -j DROP
$IPT -A INPUT -i $INTINF -d $LOOP -j DROP
$IPT -A INPUT -i $WAN -j DROP
$IPT -A FORWARD -i $INTINF -d $LOOP -j DROP
$IPT -A FORWARD -i $WAN -s 192.168.0.0/16 -j DROP
$IPT -A FORWARD -i $WAN -s 172.16.0.0/12 -j DROP
$IPT -A FORWARD -i $WAN -s 10.0.0.0/8 -j DROP
$IPT -A INPUT -i $WAN -s 192.168.0.0/16 -j DROP
$IPT -A INPUT -i $WAN -s 172.16.0.0/12 -j DROP
$IPT -A INPUT -i $WAN -s 10.0.0.0/8 -j DROP
$IPT -A FORWARD -p tcp --sport 137:139 -o $WAN -j DROP
$IPT -A FORWARD -p udp --sport 137:139 -o $WAN -j DROP
$IPT -A OUTPUT -p tcp --sport 137:139 -o $WAN -j DROP
$IPT -A OUTPUT -p udp --sport 137:139 -o $WAN -j DROP
$IPT -A INPUT -i $INTINF -j ACCEPT
$IPT -A OUTPUT -o $INTINF -j ACCEPT
$IPT -A FORWARD -i $INTINF -j ACCEPT
$IPT -A FORWARD -o $INTINF -j ACCEPT
$IPT -A INPUT -i $WAN -p udp -j DROP
$IPT -A INPUT -i tun+ -j ACCEPT
$IPT -A OUTPUT -o tun+ -j ACCEPT
$IPT -A INPUT -i tap+ -j ACCEPT
$IPT -A OUTPUT -o tap+ -j ACCEPT
$IPT -A FORWARD -i tun+ -o tun+ -j ACCEPT
$IPT -A FORWARD -i tun+ -o eth0 -j ACCEPT
$IPT -A FORWARD -i tap+ -o tap+ -j ACCEPT
$IPT -A FORWARD -i tap+ -o eth0 -j ACCEPT
$IPT -A FORWARD -i eth0 -o tun+ -j ACCEPT
$IPT -A FORWARD -i eth0 -o tap+ -j ACCEPT
$IPT -t filter -A INPUT -m state --state INVALID -j DROP
$IPT -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPT -t filter -A INPUT -p icmp -j ACCEPT
$IPT -t filter -A INPUT -i $WAN -p tcp -j REJECT --reject-with tcp-reset
$IPT -t filter -A INPUT -i $WAN -j REJECT --reject-with icmp-port-unreachable
$IPT -t filter -A FORWARD -m state --state INVALID -j DROP
$IPT -t filter -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPT -t filter -A FORWARD -i $WAN -m state --state NEW,INVALID -j DROP
$IPT -t filter -A FORWARD -o $WAN -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
$IPT -t nat -A POSTROUTING -o $WAN -j MASQUERADE
$IPT -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH  -j DROP
$IPT -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
$IPT -A INPUT -p tcp --tcp-flags ALL FIN -j DROP
$IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
$IPT -t nat -A PREROUTING -i $WAN -p tcp --dport 53 -j DNAT --to-destination 192.168.0.1:53
$IPT -t nat -A PREROUTING -i $WAN -p tcp --dport 80 -j DNAT --to-destination 192.168.0.2:80
$IPT -t nat -A PREROUTING -i $WAN -p tcp --dport 20 -j DNAT --to-destination 192.168.0.2:20
$IPT -t nat -A PREROUTING -i $WAN -p tcp --dport 21 -j DNAT --to-destination 192.168.0.2:21
$IPT -t nat -A PREROUTING -i $WAN -p tcp --dport 65000:65534 -j DNAT --to-destination 192.168.0.2
$IPT -t nat -A PREROUTING -i $WAN -p tcp --dport 5000 -j DNAT --to-destination 192.168.0.1
$IPT -A FORWARD -i $WAN -p tcp --dport 65000:65534 -d 192.168.0.2 -j ACCEPT
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 0 > /proc/sys/net/ipv4/tcp_window_scaling
echo 0 > /proc/sys/net/ipv4/tcp_sack
echo 0 > /proc/sys/net/ipv4/tcp_timestamps
echo 8192 > /proc/sys/net/ipv4/tcp_max_syn_backlog
echo 2 > /proc/sys/net/ipv4/tcp_retries1
echo 1 > /proc/sys/net/ipv4/tcp_syn_retries
echo "10000 65000" > /proc/sys/net/ipv4/ip_local_port_range
echo 0 > /proc/sys/net/ipv4/tcp_sack
echo 0 > /proc/sys/net/ipv4/tcp_timestamps
echo "alphacore.home" > /proc/sys/kernel/domainname
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo 0 > /proc/sys/net/ipv4/tcp_ecn
ping -c 4 www.free.fr

Ce firewall fait du filtrage avancé et du port forwarding, adaptez le en fonction de vos besoins. Notamment les ports à laisser passer :


$IPT -A INPUT -i $WAN -p tcp/udp --dport <no de port> -j ACCEPT

Vous pouvez également gérer des entrées statiques dans votre DHCP via le fichier /etc/ethers ou utiliser la syntaxe de dnsmasq


00:E0:**:**:**:** 192.168.0.2
00:40:**:**:**:** 192.168.0.3

Utiliser ipkg

L’utilitaire ipkg permet d’installer des paquetages.

Commencez par mettre à jour la liste :


ipkg update
Downloading http://openwrt.org/ipkg/Packages ...
Connecting to openwrt.org[208.185.247.160]:80
Packages             100% |********************************************************| 15596       00:00 ETA
Done.
Updated list of available packages in /usr/lib/ipkg/lists/openwrt

Puis listez les paquets qui vous intéressent :


ipkg list
[...]
tc - iproute2 stuff
tcpdump - A Tool for network monitoring and data acquisition. BSD licensed.
tspc - Provides a Freenet6 TSPC client for IPv6.
vsftpd - a fast and secure FTP server
wondershaper - Wondershaper qos management
zlib - zlib is a library implementing the 'deflate' compression system used by many programs.

Pour installer des paquetages tapez :


ipkg install <nom paquetage>

Pour les enlever tapez :


ipkg remove <nom paquetage>

Vos possibilités avec ce routeur sont quasi illimitées, donc vous pourrez ajouter une quantité assez importante d’utilitaire et d’autres programmes. Nous verrons dans un prochain article comment construire ses propres paquetages et les partager sur Internet

Vous avez besoin d’aide pour passer à OpenWRT ?

Lisez la documentation disponible sur www.openwrt.org

Rejoingez nous sur irc : irc.epiknet.org #nantes-wireless ou sur irc.freenode.net #wrt54g (en anglais uniquement)

où écrivez-nous par mail : ritalman@nantes-wireless.org