Portál AbcLinuxu, 5. května 2025 16:36
WiFi přístupový bod a router Asus wl500g Deluxe: instalace nového firmware, používání minimalistické distribuce OpenWrt.
Zhruba před rokem jsem si domů na hraní opatřil malou linuxovou mašinku - Wifi access point a router wl500gx od Asusu. Router běží na operačním systému Linux a navíc může celé zařízení komunikovat se světem i přes dva USB 2.0 porty. Původní firmware od Asusu je přístupný pouze přes internetový prohlížeč, ale dostupné zdrojové kódy dovolují firmware upravit a vytvořit si v routeru vlastní prostředí.
Zřejmě nejblíže má k firmwaru "opravdovému od Asusa" Olegův firmware. Nastavení zůstává téměř stejné, přibylo jen několik vylepšení. Olegův systém bude vyhovovat především lidem, kteří chtějí používat router v takové podobě, která se co nejvíce blíží původnímu záměru výrobce. Z mého hlediska však přinesl Oleg do routeru jednu z nejpodstatnějších věcí: příkazovou řádku.
Jakmile jsem se dovedl k routeru připojit pomocí telnetu či ssh, začal jsem experimentovat s Linuxem v routeru trochu více. Nicméně mě Olegův software nijak neuchvátil, protože jeho orientace na zpětnou kompatibilitu s původním Asus firware a zaměření na webové nastavení je velmi omezující. Dalším omezením Olegova firmware je nepřepisovatelný souborový systém squashfs. Připojil jsem tedy k routeru disk přes USB a zkusil nainstalovat nějakou normálnější distribuci - Gentoo. Po pár dnech hračičkování jsem Gentoo vzdal a odložil router k ledu. Až poměrně nedávno jsem narazil na systém OpenWrt a zajásal jsem: tohle je přesně ono - systém, který se snaží tvářit jako systém a ne jako soubor utilit na nastavování jednoho konkrétního kusu hardware.
Radost z každé hračky
Moje nadšení z distribuce OpenWrt pramení možná z toho, že jsem občas postaven před požadavek zajistit někde mimo civilizaci jednoduchý systém pro sběr dat - wl500 & OpenWrt mi nabízí lacinou a spolehlivou alternativu k obvyklému PC či k čistě hardwarovému řešení (8051).
Firmware v každém podobném zařízení předkládá uživateli hotovou sestavu funkcí, které lze jen těžko rozšiřovat nebo nahradit nepoužívané funkce jinými požadovanými vlastnostmi. OpenWrt se svými vlastnostmi podobá spíše běžným distribucím na PC. Základní firmware obsahuje jen minimální funkčnost, kterou lze dále rozšiřovat instalací dalších softwarových balíčků. V zařízení je firmware uloženo v paměti flash a OpenWrt umí zpřístupnit tuto paměť i pro zápis běžnými systémovými nástroji (textovým editorem). Jiné typy firmware jsou spíše jen sbírkou utilit, které můžeme či nemusíme používat, ale nelze se jich zbavit jinak, než přepsáním celého firmware. V kontrastu s tím připomíná práce s OpenWrt spíše práci na vzdáleném serveru - systém je možné přizpůsobovat momentálním podmínkám přímo za provozu.
Protože je systém OpenWrt určený především pro bezdrátové routery, je skladba balíčků orientovaná hlavně tímto směrem. Nechybí balíčky pro nastavení firewallu (iptables), pro vzdálený přístup k souborům (ftp, nfs, samba), pro dálkovou správu (telnet, ssh). Lze zprovoznit dokonce i http server a php.
Systém může běžet na dvou různých filesystémech: squashfs a jffs2. Squashfs je odolnější vůči haváriím (systém je pouze pro čtení) a jsou v něm uložené všechny balíčky firmware; zbytek systému (adresář /etc a podobně) je uložený na filesystému jffs2. Filesystém jffs2 je navržený firmou Axis speciálně pro embedded zařízení s pamětí flash. I tento filesystém by měl být odolný vůči výpadkům a haváriím a dovoluje pracovat s pamětí flash podobně jako s pevným diskem v běžném počítači.
OpenWrt lze provozovat na procesorech Broadcom. Zařízení s tímto procesorem je celá řada. Na stránce http://wiki.openwrt.org/TableOfHardware můžete vyhledat svoje zařízení a přesvědčit se, jestli na něm lze OpenWrt zprovoznit.
Já jsem dostal do rukou pouze dvě zařízení schopná provozovat OpenWrt: Asus wl500g Deluxe a Asus wl300g. Výhodou obou strojů je velmi snadná dostupnost - obě zařízení se prodávají v cenách kolem dvou a půl tisíc, model wl500g je o pár stokorun dražší.
Router obsahuje 200 MHz procesor Broadcom, 32 MB RAM, 4 MB paměti flash, dva porty USB 2.0, šest (snad) nezávislých 10/100 Mbit ethernetových rozhraní a wifi jednotku. Na jednom ethernetovém rozhraní je připojená wifi, další rozhraní je použito pro WLAN (připojení na internet) a zbývající čtyři rozhraní jsou propojena ve switchi pro připojení lokální sítě. V případě potřeby by mělo jít upravit rozdělení ethernetových portů - použít jeden port například pro připojení na internet, jeden port pro připojení demilitarizované zóny a zbývající tři porty spolu s wifi použít pro připojení lokální sítě.
Velikou výhodou jsou dva USB porty. V závislosti na nainstalovaném software lze připojit k USB například tiskárnu, disk či kameru (a vytvořit si jednoduchý systém pro hlídání objektu). Existují i experimentální drivery bluetooth zařízení, našinci mohou ocenit i možnost připojení k internetu přes CDMA modem od Eurotelu.
Zprovoznění kamery nebo CDMA modemu bude pravděpodobně jednodušší s Olegovým systémem, OpenWrt je ve své základní verzi koncipovaný příliš minimalisticky.
Na disku je strašně málo místa a instalace dodatečných balíčků trvá
velmi, velmi dlouho, zvláště v případě, že místo na disku dojde.
Nevydržíte-li s nervy a pokillujete rozjeté instalační procesy, můžete se
dostat do stavu, že ipkg přestane fungovat úplně, a pak jsem našel asi
jediné řešení - kompletní reinstalace firmware. Až při psaní tohoto článku
jsem objevil soubor /usr/lib/ipkg/status
(textový soubor s
informacemi o nainstalovaných balíčcích). Cítím šanci, že až příště
rozbourám balíčkovací systém, nebudu muset sahat po všeléku, který sluší
spíše neunixovým typům operačních systémů.
Filesystém jffs2 se chová ve srovnání s normálními filesystémy značně nezvykle. Na disk, na kterém je 400 KB volného místa, není problém překopírovat 500 KB veliký soubor, ale na dokončení celé operace si můžete počkat třeba i několik desítek minut. Přerušení může mít za následek ztrátu místa na disku - naštěstí mi zatím vždy pomohl restart.
Pokud už sáhnu po reinstalaci, oceňuji, že velká část nejzákladnějšího nastavení je v paměti nvram, takže alespoň síťovou komunikaci nemusím nastavovat po úspěšné reinstalaci celého systému znovu.
Instalace samotná dokáže být velmi problematická. Zkusím jednou, podruhé, potřetí... a takhle mne dokáže router zaměstnat několik hodin. Pochopitelně, co už mám taky dělat s wl500 ve stavu oživlé mrtvoly, kdy na mě pouze smutně poblikává ledka, ze všech funkcí routeru funguje jen ping a tftp pro upload systému a nervozita narůstá. To ovšem nebude zřejmě problém systému, jako spíše routeru samotného.
Dlouhé roky jsem pracoval na počítači s procesorem 386 - nevadí mi, že si na některé věci musím chvíli počkat. 386 určitě není rychlejší, než procesor v routeru, ani 32 MB RAM není příliš omezující. Pamět flash pro uložení firmware se dá snadno rozšířit připojením externího disku, ale v momentě, kdy zkusím nastartovat větší množství aplikací, zjistím, že nelze zapnout swap. Shell busybox určený pro odlehčená řešení umí suplovat funkci programu swapon, ale příliš horlivý odlehčovatel při vytváření distribuce tuto možnost z překladu vyloučil. Olegům systém je v tomto směru okleštěný mnohem méně. Naštěstí není problém překopírovat z Olegova systému binárku busyboxu do OpenWrt. Bohužel v busyboxu Olegova systému zase chybí některé funkce, které se používají v OpenWrt.
Běžící systém na routeru wl500g je (dočasně) k nahlédnutí na adrese http://wl500.bravenec.org. Všetečky, kteří by snad chtěli zkoušet na zařízení portscanning, musím předem upozornit, že porty 135-139,445 filtruje můj ISP, nainstalovaná verze iptables filtrování jednotlivých portů neumí.
Neverte vsem informacim napsanym v clanku. Clanek je napsany vcelku spravne, ale se spoustou chyb. Napr informace, ze iptables maji orezane fitrovani podle portu je nesmysl. Samozrejme ze je mozne pouzit port ve fitrovacim pravidle. A nejen to. Instalaci dalsich balicku muzete firtovat i podle obsahu packetu na ISO layer 7.
Add jffs2 (a trestuhodne zjednodusene): je to zurnalovaci souborovy system, ktery ale obsahuje pouze zurnal a ne soubory samostatne. Jednoduse se poprve soubor zapise do flash cely. Pri zapisovani zmeny soubor zustane jak je, ale do zurnalu se zapise zmena. Teprve pri cteni se soubor s pomoci zurnalu rekontruuje. Stejne tak mazani souboru znamena ze se do zurnalu zapise zmena ze soubor byl smazan, ale ve skutecnosti tam zatim zustava. Pri tomto pristupu samozrejme ve flash zustavaji cim dal tim rozsahlejsi oblasti plne dat, ktere jiz jsou jinde aktualizovany nebo smazany uplne (jffs2 oznaceni "dirty"). Pak prichazi na radu "garbage collector" ktery vytvori ze zurnalu soubor vcetne zmen, znova zapise takovyto soubor do flash a tim muze oznacit dalsi kousky jako "dirty". Pokus fyzicky sektor flash obsahuje pouze "dirty" casti, muze byt smazan a je pripraven na dalsi zapis zurnalu.
Jffs2 pouziva zlib kompresi
Tomu blaznu, ktery tem muj popis precetl az sem jsou uz nasledujici zajimave dusledky jasne:
Díky za věcné připomínky - popis jffs2 je vynikající.
Uvažuju, co si mám uložit za trest za informaci o tom, že iptables v OpenWrt nefunguje, jak bych si představoval. Musím odvolat, co jsem napsal v článku, a hlasitě volat "iptables funguje, funguje, iptables funguje!. Nevím, jaký duševní zkrat mě tak dlouhou dobu udržoval v přesvědčení, že do pravidla:
iptables -A input_rule -p tcp --dport 22 -j ACCEPT
nemusím uvádět -p tcp
. Podobných pravidel jsem jinde vytvořil stovky a najednou jako beran opakuju pořád do omrzení jednu chybu stále dokola. L7 pravidla jsem zkoušel taky - nicméně zdá se mi to moc velký kanón, když potřebuju od iptables pouze propustit dva pevné porty směrem dovnitř.
Sypu si popel na hlavu
Když jsem tuto informaci do článku psal (šlo to těžko, váhal jsem, instinktivně jsem cítil, že tak základní věc by nikdo nevyhazoval), doufal jsem, že mě někdo vyvede z omylu. Ať žijí komentáře pod články. Díky
V případě potřeby by mělo jít upravit rozdělení ethernetových portů - použít jeden port například pro připojení na internet, jeden port pro připojení demilitarizované zóny a zbývající tři porty spolu s wifi použít pro připojení lokální sítě.
Tak tohle by mne hodně zajímalo, tedy hlavně to, zda by to bylo možné softwarově nebo pouze hardwarovým zásahem. Ještě víc by mne ale spíš zajímalo, jestli na tom lze rozchodit proxy ARP.
Bližší popis je k nalezení zde: http://wiki.openwrt.org/OpenWrtDocs/Configuration. Když to budete zkoušet, koukněte se ještě do souboru /etc/init.d/S05nvram. Já jsem byl se svými pokusy neúspěšný, ale protože to na nic to nepotřebuju, nehledal jsem příčiny. Pravděpodobně byl můj neúspěch způsobený tím, že ve výše uvedeném skriptu se přepisují některé nvram proměnné na defaultní hodnoty a já jsem to objevil až dodatečně.
Něco z tohoto?
http://tracker.openwrt.org/search/?query=arp&b=search
problém je v tom, že nesmíš používat tabulku INPUT ale FORWARD
takže správně by mělo být:
iptables -A FORWARD -p tcp --sport 411 -j DROP
iptables -A FORWARD -p tcp --dport 411 -j DROP
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.