Jak nahrát OpenWRT do HW AP Asus WL-500b

Dostal se mi do ruky Asus WL-500b, tedy hardwarový přístupový bod pro WiFi s integrovaným 5-ti portovým ethernet switchem (s podporou automatického křížení kabelu MDI/MDI-X), ve kterém běží operační systém Linux. Původní firmware mi tak úplně nevyhovoval, tak jsem se dal do zkoušení jiných firmwarů pro toto zařízení. Asi nejvíce se mi zalíbil firmware OpenWRT, který má i systém balíčků a velice zdařilé skripty pro kompilaci ze zdrojových kódů. Pochopitelně není nutné tuto distribuci kompilovat ze zdrojových kódů, můžete si stáhnout hotové binárky, ale pokud se vám (tak jako mě) stane, že potřebujete nějaký program, který není dostupný v balíčku, pak není velký problém si takový program skompilovat.
Linuxová distribuce OpenWRT, je původně určena pro routery Linksys WRT54G/GS, podle nichž získala i své jméno, ale podporuje i jiná zařízení, kompletní seznam je zde. Jak jsem již zmínil, tato distribuce má systém balíčků ipkg a lze ji snadno skompilovat pomocí těchto zdrojových kódů, stačí stáhnout, rozbalit a spustit 'make' (při kompilaci si program sám stahuje zdroje balíčků z internetu, několik stovek MB).
Router jsem i rozebral, ale bohužel jsem ho zapoměl nafotit. Uvnitř je základní deska s miniPCI slotem ve kterém je umístěna WiFi karta. Odvážní lidé mohou zkusit kartu vyměnit, údajně to funguje, ale bývají problémy s ovladači pro jiné karty.

Jak flashovat ?

Flashování probíhá v tzv. firmware restoration modu, ve kterém má zařízení ip adresu 192.168.1.1 a očekává připojení pomocí TFTP a nasypání firmware. "firmware restoration mode" je výborná funkce, neboť tento režim se nespouští z flash paměti a funguje tedy i pokud se vám povede nahrát nefunkční flash (nebýt této funkce, nevím kolik bych těch Asusů vlastně spotřeboval :) ).
Pro flashování samozřejmě potřebujete správný firmware, buď si ho stáhněte, nebo skompilujte, v každém připadě potřebujete soubor openwrt-linux.trx
Dále se budu zabývat flashováním pouze z operačního systému Linux, možná to jde i z Windows, nicméně já to neumím a Windowsová utilita na obnovu firmware mi nefunguje.
Firmware se do Asusu nahrává pomocí TFTP, takže budete také potřebovat tftp klienta a tento skript. (trošku jsem ten skript upravil tak, aby fungoval s mým Asusem)
Firmware restoration mód se spouští tak, že při zapnutí zařízení podržíte stisknuté tlačítko restore, měla by se rozblikat PWR LED. Asus připojte kabelem z portu LAN1 nejlépe přímo do počítače (měla by se rozsvítit LED na síťové kartě a odpovídající LED na Asusu) a v počítači si nastavte IP adresu na 192.168.1.2 (nebo jinou až 192.168.1.254).
Nyní můžete rovnou nahrát do Asusu nový firmware, ale stává se mi, že Asus s novým firwarem ne a ne naběhnout ať zkouším co se dá. Nakonec jsem zjistil, že pomůže před samotným flashováním nahrát do Asuse zvláštní "flash", který vymaže celou pamět. Takovouto mazací flash si můžete vyrobit následujícím příkazem: 'dd if=/dev/zero of=./zero.flash bs=1k count=4096', pak ji nahrajte do Asuse './recover.sh zero.flash'. Skript by měl chvíli běžet a na Asusu by se měly rozblikat LED , skript může jednou (nikoli dvakrát - to je chyba !) vypsat hlášku 'Transfer timed out.'. Vyčkejte po nahrání asi 20s, je trochu vidět, že se změní frekvence blikání LED. Asus rozpozná "chybnou" flash a automaticky znovu najede do módu pro nahrání firmware. Nyní nahrajte do Asusu OpenWRT './recover.sh openwrt-linux.trx'. Měly by se rozblikat LED signaluzující síťovou komunikaci. Po té vyčkejte až LED přestanou blikat (asi 20s). Pak by měla trvale svítit PWR LED, pokud bliká signalizuje špatný flash.
Po chvíli by se měla rozsvítit také LED AIR, pokud svítí, máte skoro vyhráno :) Nyní je třeba přepojit síťový kabel z portu ETH1 do WAN. Příkazem 'telnet 192.168.1.1' se připojte na svůj nový router s OpenWRT.
Nyní je třeba nakonfigurovat síťové adresy a nastavit WiFi. Vše je popsáno na stránkách OpenWRT. Nastavení proměnných v nvram je popsáno zvlášť. Já používám Asuse v režimu klient a nastavuji ho takto:
nvram set lan_ifname=br0
nvram set lan_ifnames="eth0 eth1"
nvram set lan_proto=static
nvram set lan_ipaddr=192.168.1.1
nvram set lan_netmask=255.255.255.0

nvram set wan_proto=none
nvram set wan_hostname=Asus

nvram set wifi_ifname=eth2
nvram set wifi_proto=static
nvram set wifi_ipaddr=10.101.5.145
nvram set wifi_netmask=255.255.255.128
nvram set wifi_gateway=10.101.5.129
nvram set wifi_dns=194.108.56.1

nvram set wl0_ifname=eth2
nvram set wl0_mode=sta
nvram set wl0_infra=1
nvram set wl0_country_code=DE
nvram set wl0_radio=1
nvram set wl0_channel=0
nvram set wl0_plcphdr=*
nvram set wl0_ssid=FreeNet.broumak

nvram commit
reboot

Nyní by Asus měl být připojen k AP a můžeme instalovat balíčky z internetu:
ipkg update
ipkg install dropbear
ipkg install dhcp-fwd
ipkg install libpthread
/usr/bin/dropbear

Používám Asus v režimu klient, je nepříjemné mít u klienta router s NATem, proto používám parprouted, který umožnuje AP používat podobně jako bridge, stejně jako to umí jiné AP v režimu klient. Parprouted není mezi běžnými balíčky OpenWRT, tak jsem si udělal balíček vlastní. Můžete si ho stáhnout zde.
Balíček je třeba stáhnout do Asusu nejlépe do adresáře /tmp, a po té nainstalovat.
cd /tmp; wget http://broumovska.lbcfree.net/~wasik/parprouted_0.63-1_mipsel.ipk
ipkg install /tmp/parprouted_0.63-1_mipsel.ipk
Používám také DHCP a program dhcp-fwd, který umožňuje používání DHCP i počítačům v síti za Asusem. Konfigurace vypadá takto:
vim /etc/dhcp-fwd.conf
user            root
group           root

chroot          /var/run/dhcp-fwd

logfile         /var/log/dhcp-fwd.log
loglevel        1

pidfile         /var/run/dhcp-fwd.pid

ulimit core     0
ulimit stack    64K
ulimit data     32K
ulimit rss      200K
ulimit nproc    0
ulimit nofile   0
ulimit as       0

#       IFNAME  clients servers bcast
if      br0     true    false   true
if      eth2    false   true    true

ip      br0     10.101.5.148

#       TYPE    address
#server ip      192.168.8.66
server  bcast   eth2

Zbývá dokončit nastavení zapnutím dhcp-fwd při startu a vypnutím demonů telnet a dnsmasq.
mv /etc/init.d/dhcp-fwd /etc/init.d/S50dhcp-fwd
rm /etc/init.d/S50dnsmasq
rm /etc/init.d/S50telnet
Na konci nezapomeňte nastavení uložit do flash paměti:
nvram commit
Tím je konfigurace hotova a Asus by měl být plně funkční. Při použití programu parprouted Asus mění MAC adresy ethernetových rámců, které přes něj procházejí a pokud na AP používáte MAC filtr je třeba povolit MAC adresu Asusu, MAC adresy síťových karet za Asusem nastavovat nemusíte. V nastavení DHCP ovšem můžete s MAC adresami pracovat tak, jako kdyby se neměnily, o to se postará program dhcp-fwd.
V porovnání s AP OEM D-Link DWL-900AP+ rev. B1 je provoz přes Asus WL-500B o něco stabilnější, nevyskytují se duplicitní pakety a má lepší citlivost. Jediný problém na který jsem zatím narazil je, že když při bootu Asusu není dostupná vybraná WiFi síť (výpadek AP) a po nějaké době je siť opět aktivní, pak se Asus do sítě automaticky nepřipojí a je třeba znovu zadat ssid programem iwconfig (nebo provést restart Asuse).

Jan Wasserbauer
Poslední aktualizace 20.3.2005