Případný zájem/dotaz můžete projevit na wifi(závin)faltynek(tečka)org.
Tato stránka si klade za cíl pomoci uživatelům, kteří používají router WL-500 s firmwarem OpenWRT upraveným p.salkem. Připomínám, že vlastním WL-500b verze 1 (tj. 11Mbps s radio-síťovkou Broadcom). Dalším cílem je pomoc v oblasti zabezbečení Wi-Fi metodou WPA. Pro WPA používám software wpa_supplicant, ten zajišťuje potřebnou asociaci Wi-Fi rozhraní s přístupovým bodem, autentizaci/autorizaci jménem/heslem a následně výměnu šifrovacích klíčů. wpa_supplicant je zkompilován pouze s podporou binárního driveru od Broadcomu (wl.o). Pro svou činnost vyžaduje kryptografické funkce zknihovny openssl (libssl).
Soubory, které by se mohly hodit:Binárka | ipk balíček | Zdrojový kód | Kam/jak rozbalit? | Co to? |
---|---|---|---|---|
wpa_supplicant 0.4.7 | Neumím | src | /usr/sbin/ | wpa_supplicant |
.config | --- | --- | --- | Aktuální konfigurační soubor tohoto buildu wpa suplikanta |
libssl 0.9.7e | libssl 0.9.7e | src | /usr/lib/ | Knihovny SSL pro součinnost s WPA suplikantem. |
--- | --- | wpa_supplicant.conf | /etc/ | Konfigurační soubor pro wpa_supplicant |
--- | dropbear 0.44 | src | ipkg install ... | SSH server/klient namísto telnetu |
Vyskytlo se několik nejasností/neznalostí, dotazů apod. S některými jsem se více či méně úspěšně potýkal mj. i v konferenci na czfree.net. Zde je několik snad prospěšných otázek/odpovědí.
Neberte prosím informace na této stránce jako dogma. Jsou to jen mé osobní zkušenosti/názory a často jen domněnky.
Co je to firmware? (pro WL-500)Stejně jako u kteréhokoli jiného zařízení je firmware program, který "běží" v zařízení a zajišťuje operace a služby potřebné pro funkčnost. WL-500 má výhodu v tom, že v něm běží Linux. Chytré hlavy buď upravily původní "distribuci" a tak vznikl firmware taky známý jako Olegův, nebo portovali již hotovou "distribuci" z jiného zařízení Linksys WRT54G, která se jmenuje OpenWRT.
"Distribuce" Linuxu, původně určená pro zařízení WRT54, v současnosti aplikovatelná do kdejakého kusu hardware. Pro WL-500 existuje několik modifikací OpenWRT. Zde se zaobírám hlavně modifikací od uživatele p.salek. Tato větev se ovšem už nevyvíjí, protože autor nemá čas. Pro mé účely se jeví jako více-méně dostačující. Jednou z dalších modifikací je pak větev uživatele jaha2x.
V současné době (12/2005) se zdá, že OpenWRT modifikace těchto dvou
uživatelů již na svých původních výskytech nejsou k dispozici (viz
nefunkční odkazy):o( Můžete zkusit zastihnout autory
na konferenci czfree anebo
zkusit štěstí jinde.
Nicméně i tak doufám, že zde naleznete užitečné informace ;o)
p.salek OpenWRT po naflashování a nabootování routeru nastaví na LAN síťovce IP adresu 192.168.0.1. Toto se dá změnit v souboru /etc/init.d/S40network. Na takto nastartovaný router je možno se přihlásit telnetem bez hesla. (To je samozřejmě v produkčním prostředí při připojení k síti bezpečnostní riziko jako kráva).
Flash pamět u WL-500 není po zapsání p.salek OpenWRT úplně plná a zbývá menší množství prostoru pro uživatelova data. Flash je tedy rozdělena na RO část (jen pro čtení) a RW část (čtení, zápis). RO část je přístupná v adresáři /rom. RW část je pak připojena jako kořenový souborový systém a do RO části z něj vedou symbolické odkazy. Tím je docela elegantně vyřešena myšlenka bezpečné modifikace "firmwarových" souborů. Pokud totiž chceme provést nějakou změnu, je potřeba smazat odkaz z RW do RO, zkopírovat daný soubor do RW a tady ho následně vesele změnit. Např. mně se nelíbíla adresa 192.168.0.1, takže jsem provedl toto:
rm /etc/init.d/S40network # smazání odkazu do RO cp /rom/etc/init.d/S40network /etc/init.d/ # kopie z RO do RW vi /etc/init.d/S40network # změna adresy na 192.168.1.1
Obdobným způsobem lze postupovat u dalších souborů, které nevyhovují vašim představám. Pokud by takových bylo mnoho, stojí za úvahu vyrobit firmware, kde tyto soubory budou změněné k obrazu vašemu, ovšem to já zatím neumím :o)
Dlužno podotknout, že RO oblast používá souborový systém squashfs a RW oblast pak systém jffs2.
Pokud je potřeba do routeru narvat "něco většího" a ještě jen dočasně, je vhodné to řešit přes adresář /tmp, který je připojen do operační paměti RAM, tzn. operace jsou rychlé. Samozřejmě po restartu vše z /tmp zmizí, protože je to jen RAM. Na jffs2 při zápisu probíha komprese a to dokáže být hodně pomalé, navíc toho místa je tam poskrovnu. Z technologicého hlediska má flash omezený počet zápisových cyklů, čili čím méně se bude zapisovat, tím déle vydrží. Počet cyklů je však u jednoho typu flashky 100, u jiného 1 000 000, takže těžko říct :o)
K routeru se dodává CD se "softwarem", kde je k dispozici utilita "Firmware restoration". Touto jsem já prováděl flashování, až na pár vyjímek, kdy jsem ještě z originálních/Olegových firmwarů prováděl flash přes WWW rozhraní. Před flashováním je nutné uvést router do "flashovacího" režimu:
V takovém stavu je router schopen příjmat pokyny k flashování.
OpenWRT poskytuje pěknou bezpečnostní pomůcku (kterou jsem v jisté chvíli hodně ocenil). Tou je tzv. failsafe režim. V tomto režimu se nepřipojuje RW oblast flashky a jako kořenový strom je použito obsahu z RO části. Tedy toho, co se v normálním režimu tváří jako /rom. Toto chování řeší zacyklené init skripty, zakomentované/nenalezené/vadné SSH/telnet servery apod. Prostě situace, které nastanou vinou editace (rm/cp/vi) původních souborů. RW část je nutno pro napravení situace připojit ručně:
mtd unlock mtd4 # netuším, co to dělá mount -t jffs2 /dev/mtdblock/4 /jffs # připojení RW oblasti do /jffs
Zde se pak nepříjemný omyl opraví, uloží a router se rebootuje, aby přešel zase do normálního režimu.
Podobný postup jako před flashováním:
Pokud se půjde přihlásit telnetem bez hesla, failsafe byl aktivován.
V routeru existuje příkaz nvram, který je schopen nastavit/zobrazit "systémové proměnné", které jsou uloženy v nvram. To je zkratka pro Non-Volatile RAM, čili paměť, která zachová data i po výpadku napájení (asi kus FLASH). Pro tento účel je vyhrazen blok 32kB. Systémové proměnné slouží buď přímo k ovládání funkce hardwaru anebo různé firmwary si do nich ukládají různé konfigurační údaje. Seznam existujících systémových proměnných lze vypsat:
nvram show
voláním nvram bez parametrů lze zjistit možnosti dalšího použití.
Jedná se o tzv. multi-call binary, což znamená, že podle toho, s jakým názvem či parametrem program spouštíme, takovou vykonává činnost. Je to kolekce základních systémových utilit v jednom souboru. Pokud existuje např. v adresáři /bin/ symbolický odkaz s názvem rm ukazující na /bin/busybox, pak spuštění tohoto /bin/rm vyvolá busybox chovající se jako běžný program rm sloužící k mazání souborů. (Ve skutečnosti je /bin/rm odkaz na /rom/bin/rm a ten je teprve odkazem na busybox).
[root@router:~]# ls -l /rom/bin/ -rwxrwxr-x 1 root root 22964 Apr 6 2004 admcfg -rwxr-xr-x 1 root root 42 May 10 2004 alldone lrwxrwxrwx 1 root root 7 May 19 2004 ash -> busybox -rwxr-xr-x 1 root root 850084 May 19 2004 busybox lrwxrwxrwx 1 root root 7 May 19 2004 cat -> busybox ... lrwxrwxrwx 1 root root 7 May 19 2004 ps -> busybox rm lrwxrwxrwx 1 root root 7 May 19 2004 pwd -> busybox --> lrwxrwxrwx 1 root root 7 May 19 2004 rm -> busybox lrwxrwxrwx 1 root root 7 May 19 2004 rmdir -> busybox lrwxrwxrwx 1 root root 7 May 19 2004 run-parts -> busybox lrwxrwxrwx 1 root root 7 May 19 2004 sed -> busybox lrwxrwxrwx 1 root root 7 May 19 2004 sh -> busybox ... lrwxrwxrwx 1 root root 7 May 19 2004 vi -> busybox lrwxrwxrwx 1 root root 7 May 19 2004 zcat -> busybox
Toto zapouzdření mnoha programů v jednom celku je úsporné na prostorové požadavky - sdílení kódu. V embedded systémech s omezenými paměťovými možnostmi je to docela zásadní věc. Jednotlivé programy v BusyBoxu se nazývají aplety, a lze je při konfiguraci (před zkompilováním) přidat/ubrat do/z výsledku podle potřeby. Seznam podporovaných apletů se dá zjistit prostým voláním:
busybox
Telnet je služba vzdáleného připojení, která číhá obvykle na portu 23. Připojení k systému probíhá zadáním uživatelského jména a hesla. Nevýhoda telnetu je v tom, že přenášená data jdou po síti v otevřené formě (včetně hesla). Stejně tak veškerá činnost prováděná na vzdáleném systému je "zjistitelná" jednoduchým "odposlechem" linky. Proto vznikly nástroje na bezpečnější spojení, založené na šifrování přenášených dat, které už tak lehce kompromitovatelné nejsou.
Protokol šifrovaného vzdáleného přístupu je obecně znám jako ssh. Tato služba naslouchá obvykle na potu 22. V unixovém světě je ssh klient/server naprosto běžnou součástí. Ve windousech je to horší a člověk si jej musí sehnat. Je to např. buď klasické ssh z CygWinu nebo velice užitečný program PuTTY. To dovoluje použít mj. jak telnet protokol, tak SSH protokol, což je velice praktické. Ve windousech totiž telnet existuje, ale jako většina standardních, ale MS zprzněných, programů se, mně osobně, jeví jako hůře použitelný.
Je v zásadě několik možností, jak do/z routeru dostat nějaká ta data ve formě souborů:
cd /tmp wget http://www.faltynek.org/wifi/wpa_supplicant-0.4.7-mipsel.tgz gzip -d wpa_supplicant-0.4.7-mipsel.tgz tar -xvf wpa_supplicant-0.4.7-mipsel.tar # nebo místo toho gzip/tar jen: # tar -zxvf wpa_supplicant-0.4.7-mipsel.tar
scp wpa_supplicant-0.4.7-mipsel.tgz 192.168.1.1:/tmp scp 192.168.1.1:/tmp/messages .Zápis znamená: "přenes něco někam", kde každé něco je pak ve formě uživatel@počítač:soubor a někam ve formě počítač:soubor_nebo_adresář. Pokud není zadán uživatel, bere se aktuální přihlášený. (Tečka na konci druhého řádku znamená aktuální adresář).
ln -s /usr/sbin/wpa_suplicant /wwwPo stažení souboru může být žádoucí daný odkaz smazat:
rm /www/wpa_supplicant
Do prohlížeče pak stačí zadat URL takto vyrobeného odkazu (samozřejmě "prohlížečem" může být opět wget či cokoli mluvícího HTTP řečí). Např. je-li název router znám cílovému stroji z DNS, pak můžeme psát:
http://router/wpa_supplicant #do address baru prohlížeče wget http://router/wpa_supplicant #nebo na command-line
Pro někoho možná až trapný dotaz. Ovšem najdou se lidé, kterým editor vi (obsažený v omezené verzi v BusyBoxu) zrovna k srdci nepřirostl :o) Pokud tedy, přihlášeni k routeru, chceme editovat nějaký soubor, můžeme pro tuto činnost použít právě vi. Např.:
vi /etc/init.d/S40network
Pokud soubor neexistuje, je vyroben. Spuštěné vi je implicitně v příkazovém režimu, do editačního režimu lze přepnout buď stisknutím <insert> nebo a jako append nebo i jako insert. Po provedení změn lze přejít zpět do příkazového režimu pomocí <esc>. Uložení pak je :w (dvojtečka, malé w, z příkazového režimu), opuštění pak:q. Vyhledávání je /text (lomítko, vyhledávaný text v přík. režimu). Další vyhledávání je n resp. N, podle směru (dolů/nahoru). Smazání řádku je dd, vložení (naposled smazaného) je p - pod aktuální řádek, popř. P nad aktuální řádek. Atd, apod...
Prosté vypsání souboru na terminál je možné provést příkazem cat. Tedy např. necháváme-li si ukládat zprávy od logovacího démona (syslogd) do souboru /tmp/messages a chceme je zobrazit na konzoli, provedeme:
cat /tmp/messages
Pokud máme dobrý terminál, je možné se ve vypsaném textu pohybovat např. pomocí kláves či scrollbaru. Pokud ne, máme k dispozici pouze několik posledních řádek, které se vlezly na konzoli. To lze obejít buď tak, že soubor zobrazíme (nebo filtrujeme) pomocí příkazu more:
more /tmp/messages # jednoduše cat /tmp/messages | more # nebo složitější způsob, tzv. řetězení, filtr apod.
more ovšem umožňuje pouze posun dopředu, což taky není úplně praktické. Pokud jsme kamarádi s editorem vi, není asi nic pohodlnějšího, než daný soubor otevřít v něm:
vi /tmp/messages
Pokud si chceme prohlížet nějaký dlouhý výpis z programu, lze použít právě filtr more. Např. nápověda k programu wl:
wl 2>&1 | more wl 2>&1 > /tmp/wl.help vi /tmp/wl.help
První řádek spustí wl, přesměruje chybový výstup na standardní výstup (2>&1, protože wl bez parametrů vypisuje nápovědu na chybový výstup), a ten předhodí na standardní vstup programu more.
Pokud more není vyhovující, další dva řádky přesměrují text do souboru /tmp/wl.help a ten je pak zobrazen v editoru vi.
Typicky v nějakém init sriptu v /etc/init.d/. Parametry lze zjistit z nápovědy. Já používám volání:
wpa_supplicant -t -w -i eth2 -c /etc/wpa_supplicant.conf >>$LOGFILE 2>&1 &Podrobný popis kroků, který wpa_supplicant zahájí po svém spuštění je zde (sekce "Using wpa_supplicant"). Pro správnou činnost musí být zaveden a funkční modul wl.o. Zjistit se to dá například příkazy:
lsmod wl isup wl radioAktivovat bezdrátové rozšíření na síťovce eth2 lze pak provést pomocí:
wl up wl radio on wl ... # apod. viz. nápověda k wlKonfigraci eth2 lze zjistit/změnit pomocí:
ifconfig eth2 ifconfig eth2 up ifconfig eth2 ... # viz. opět nápověda
Ve zdrojových souborech nebo na stránkách autora (sekce "Configuration file") je "ukázkový" konfigurační soubor wpa_supplicant.conf. Zde je vhodné zvolit jeden blok, který se podobá naší síti nejvíce a upravit jej k obrazu svému. Některé volby jsou mi nejasné a to jsem o chaosu WPA/TKIP EAP/MSCHAPv2 už něco málo zjistil :o) Každopádně zde prezentovaný soubor je funkční oproti Radius serveru na poskytovateli 802.cz. Je pouze nutné vyplnit správné ssid (název přísupového bodu), jméno a heslo. Všechny ostatní zakomentované řádky (#) lze klidně smazat z důvodů úspor či přehlednosti.
Pokud nám poskytovatel sdělil, že IP adresa nám bude přidělována z DHCP serveru, potřebujeme program, který se s tímto serverem bude bavit - DHCP klient. V BusyBoxu je k dispozici udhcpc, který je pro danou funkci dostačující. Volání:
udhcpc -b -i eth2
znamená: "zjisti adresu (a ostatní parametry) pro síťovku eth2 z DHCP serveru, pokud se to nepovede, přejdi do pozadí a zkoušej dál". udhcpc pro každou událost dovoluje přiřadit uživatelský skript. Tzn. např. když se mu podaří získat adresu, když obnoví adresu po určité době, když nedostane žádnou odpověď na DHCP požadavek, apod.
Spolu s adresou poskytovatel může přidělovat i další parametry, jako je odchozí brána (router, alias default gateway), DNS servery, maska sítě apod. Skripty, které používám jsou mírně modifikované ukázkové skripty z udhcpc. Leží v adresáři /usr/share/udhcpc/:
default.bound | Provede se při první pozitivní odpovědi z DHCP serveru. Do /etc/resolv.conf naháže konfiguraci DNS serverů, přiřadí síťovce adresu/masku, atd... |
default.renew | Provede se při obnově adresy. Identické jako předchozí. |
default.leasefail | Provede se, když na výzvu nedorazí odpověď z DHCP serveru. |
Pokud je potřeba obsluhovat routerem více počítačů v nějaké domácí mikrosíti, je užitečné mít DNS server pro překlad názvů domácích počítačů na IP adresy, abychom např. při kopírování přes scp nemuseli psát 192.168.1.1, ale např "router" nebo "WL500" nebo cokoli jiného. Podobně při komunikaci s ostatními PC v síti.
Stejně tak, pokud se nám nechce na každém PC nastavovat síťové parametry (zvláště ve windousech, kde se člověk ukliká), můžeme brát jako užitečné mít na routeru i DHCP server, který se o daný problém postará. "Známým" počítačům je klidně možné přidělovat "statické" IP adresy, tzn. na DHCP žádost dostane vždy stejnou adresu. Toho je možné využít následně při konfiguraci DNS serveru a daným adresám přiřadit jména. Vazba se provádí podle MAC adresy síťovky, kterou je proto dobré zjistit. V Linuxu jednoduše pomocí ifconfig, ve windousech pak pomocí zprzněnce ipconfig /all. Ačkoli to tak mnohdy nevypadá, jednotlivé oktety MAC adresy se oddělují dvojtečkou, nikoli pomlčkou.
Výše uvedené požadavky na DHCP server a DNS server splňuje program dnsmasq. Podobně pokud by nám stačil pouze DHCP server, je k dispozici v BusyBoxu udhcpd. Mně osobně se více líbí dnsmasq a tudíž používám tento program.
dnsmasq se jednoduše a hlavně přehledně dá nakonfigurovat editací souboru /etc/dnsmasq.conf. Zde je uvedena spousta komentářů a vysvětlujících příkladů.
Máme-li k dispozici domácí síť, ale od poskytovatele pouze jednu IP adresu a přesto bychom chtěli ze všech PC v síti na Wi-Fi internet, je potřeba provést nějaké finty tak, aby se z vnějšku celá síť tvářila jako jeden počítač s tou dodanou IP adresou.
Tento problém se dá řešit různými způsoby, mně nejpřívětivější se zdá překlad adres, alias NAT (tuším, že to znamená Native Address Translation). Toto řešení znamená, že na routeru se něco postará o to, aby pakety odcházející do internetu měly jako zdrojovou adresu nastavenu IP adresu routeru (tu, kterou nám poskytovatel přidělil např. přes DHCP). Příchozí pakety pak jsou "přeznačeny" (podle toho, ke kterému PC v lokální síti patří) správnou lokální adresou. Logicky z toho plyne jedna vlastnost NATu: nelze z vnější sítě (internetu) navázat spojení přímo na jeden PC v lokální síti, protože NAT by nevěděl, jakou adresou pakety přeznačit (pokud je spojení navázáno zevnitř, NAT si pamatuje, kdo ho navázal a podle toho přeznačkuje pakety příchozí v rámci tohoto spojení). Izolaci LAN od vnější sítě lze brát jako výhodu (můj názor) stejně tak jako nevýhodu.
Tuto vlastnost lze pro konkrétní případy vhodně eliminovat. Např. pokud nutně potřebuji na PC xxx v LAN provozovat FTP server, na který je možno se připojit zvenčí, lze zajistit, aby příchozí spojení na router byla "přesměrována" na daný PC xxx s FTP serverem. Pak se pro uživatele v internetu jako FTP server jeví náš router. Technika se nazývá port forwarding - přesměrování portů.
Uvedené hrátky s pakety a adresami zajistí vhodně nastavený paketový filtr v jádře. Nastavení jeho tabulek se provádí příkazem iptables. Opět se dá říct, že toto nastvení je možné umístit do init skriptů v adresáři /etc/init.d/. Zapnutí NATu je možno provést příkazem:
iptables -t nat -A POSTROUTING -o $PROVIDER -j MASQUERADE
Kde $PROVIDER obsahuje adresu, která bude do paketu zapsána jako zdrojová. Přesměrování portů je možné realizovat například podobně jako zde:
iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4 --dport 80 -i eth2 -j DNAT --to 192.168.1.3:80
Zhruba to znamená, že přijde-li na rozhraní eth2 paket z počítače 1.2.3.4 a "je namířen" na port 80 našeho routeru, jádro jej přesměruje na PC 192.168.1.3 v lokální síti, taktéž na port 80.
Pokud se výše uvedené, zjednodušené příklady zdají nejasné a zavádějící, je možné si počíst trošku podrobněji: Připojujeme domácí síť, Stavíme firewall, Linux 2.4 NAT HOWTO, atd...
Pro jednoduché diagnostické/informační účely je možné využít kombinaci HTTP serveru a CGI skriptů. Co to je? Pokud chci zjistit/provést něco, co bych normálně řešil příkazem, přihlášen přes SSH na WL-500, a přihlašovat se mi nechce, napíšu si na to CGI skript. To není nic jiného, než bash shell skript (resp. ash shell skript :o). Je spuštěn HTTP serverem a výstup je zobrazen jako HTML stránka v prohlížeči. CGI používám typicky pro zobrazení logů a konfiguračních informací. Ukázkový skript např. /www/cgi-bin/messages.cgi.
HTTP server je obsažen v BusyBoxu ve formě apletu httpd. Je možné jej minimálně konfigurovat, volby konfiguračního souboru se dají zjistit přímo ze zdrojáku httpd. V podstatě se jedná akorát o nastavení přístupových práv. Např. /etc/httpd.conf, pokud obsahuje text
A:192.168.1.0/24 A:127.0.0.1 A:1.2.3.4 D:*
Říká, že na http stránky lze přistupovat pouze z lokální sítě, z vlastního routeru a pak ještě z počítače 1.2.3.4, jinak odnikud.
| |