Doplňky k WISP FAQ

Lukáš Turek

Jak na Traffic Shaping

Pokud pomocí WISPu rozdělujete připojení k Internetu, budete dříve či později potřebovat, aby se připojení dělilo spravedlivě. Tedy aby pokud stahují 4 lidé zároveň, dostal každý svojí čtvrtinu pásma. Vše potřebné již ve WISPu je, ale nastavit to není tak jednoduché, jak to vypadá.

A teď k věci:
Nastavení se provádí v /etc/network/ifup.local. Tam již je funkce set_shaper. Volá se

  set_shaper ip_adresa rychlost id

To omezí adresu ip_adresa na rychlost (zadává se např. 128kbit). id je jakékoli číslo (radši nenulové), ale pokud se voláním funkce přidává více pravidel, musí být u každého pravidla jiné. Pozor! Funkce set_shaper funguje jen pokud se pomocí konfiguračního menu nastaví nějaké omezení rychlosti na rozhraní (rate)!

Funkce set_shaper bohužel umí omezit jen jednu adresu, neumí udělat spravedlivé rozdělení pásma. K tomu jsem napsal funkci div_bandwidth:

  #Rozdeli pasmo na rozhrani $1 s rychlosti $2 mezi $3 uzivatelu, jejichz IP adresy
  #jdou poporade od $4. Volitelne lze zadat maximalni rychlost pro uzivatele $5.
  div_bandwidth()
  {
    IPRULE=`echo $4 | sed 's/[^.]*$//'`
    HOST=`echo $4 | sed 's/.*\.//'`

    if [ "$5" = "" ]; then
      CEIL=$2
    else
      CEIL=$5
    fi

    tc qdisc add dev $1 root handle 1: htb default 0
    tc class add dev $1 parent 1: classid 1:1 htb \
      rate $2kbit ceil $2kbit burst 2k quantum 1500

    i=0
    while [ $i -lt $3 ]
    do
      tc class add dev $1 parent 1:1 classid 1:1$i htb \
        rate $(expr $2 / $3)kbit ceil $CEIL\kbit burst 2k quantum 1500
      tc filter add dev $1 protocol ip prio 2 parent 1: u32 \
        match ip dst $IPRULE$(expr $HOST + $i) classid 1:1$i
      tc qdisc add dev $1 parent 1:1$i handle 11$i: sfq perturb 10
      i=$(expr $i + 1)
    done
  }

Abyste ji mohli použít, přidejte tento kód do ifup.local (nejlépe pod funkci set_shaper, tj pod "}"). Funkce se volá

  div_bandwidth rozhraní rychlost počet_lidí počáteční_ip maximum

rozhraní je síťová karta do lokální sítě (např. eth0). rychlost je šířka pásma do Internetu (v kbit), které se rozdělí mezi počet_lidí. Jejich adresy musí být v jednom bloku za sebou, počínaje počáteční_ip. Potom bude každý klient moci využít celé pásmo, když bude připojen sám, a pokud bude stahovat více lidí zároveň, rychlost se spravedlivě rozdělí. Volitelně lze zadat maximum: maximální rychlost pro 1 klienta (tj. i když bude stahovat jako jediný, dosáhne maximálně této rychlosti). Příklad:

  div_bandwidth eth0 256 4 192.168.1.1 128

Upozornění: Funkce div_bandwidth (tj. vše mezi "{" a "}") se nijak měnit nemusí, mění se jen její volání (které se napíše někam pod funkci div_bandwidth, tj pod "}"). Dosazení hodnot do funkce se provede samo.

Vytvořená pravidla pro shaping se vymažou příkazem: tc qdisc del dev rozhraní root. Stará pravidla se musí vymazat, než se zadají nová!

Poznámka: Rychlost, kterou zadáváte, se nemůže rovnat skutečné rychlosti připojení. Zadejte přibližně 90% skutečné rychlosti (ideální je to vyzkoušet).

Poznámka 2: Rozdělení pásma na 2 rozhraní (typicky eth0 a netcs0) bohužel nejde udělat nějak jednoduše. Musí se rozdělit pásmo na 2 části a na každou z těchto částí aplikovat popsané dělení, např. :

  div_bandwidth eth0   128 4 192.168.1.1 64
  div_bandwidth netcs0 128 4 192.168.2.1 64

Rozdělení uploadu:
Pokud používáte překlad adres, nelze dělit upload stejným způsobem jako download. V okamžiku, kdy se toto dělení provádí, je již zdrojová adresa přeložená na adresu vnějšího rozhraní a neví se, od koho pocházejí. Pakety se tedy musí napřed označit a pak dělit podle těchto značek. To provádí funkce div_upload, která je jinak totožná s div_bandwidth:

  #Rozdeli upload na rozhrani $1 s rychlosti $2 mezi $3 uzivatelu, jejichz IP adresy
  #jdou poporade od $4. Volitelne lze zadat maximalni rychlost pro uzivatele $5.
  div_upload()
  {
    IPRULE=`echo $4 | sed 's/[^.]*$//'`
    HOST=`echo $4 | sed 's/.*\.//'`

    if [ "$5" = "" ]; then
      CEIL=$2
    else
      CEIL=$5
    fi

    tc qdisc add dev $1 root handle 1: htb default 0
    tc class add dev $1 parent 1: classid 1:1 htb \
      rate $2kbit ceil $2kbit quantum 1514

    i=0
    while [ $i -lt $3 ]
    do
      tc class add dev $1 parent 1:1 classid 1:1$i htb \
        rate $(expr $2 / $3)kbit ceil $CEIL\kbit burst 2k quantum 1500
      iptables -t mangle -A PREROUTING -s $IPRULE$(expr $HOST + $i) -j MARK --set-mark 1$i
      tc filter add dev $1 prio 2 parent 1: protocol ip handle 1$i fw classid 1:1$i
      tc qdisc add dev $1 parent 1:1$i handle 11$i: sfq perturb 10
      i=$(expr $i + 1)
    done
  }

Na dělení podle značek je potřeba přidat modul cls_fw. Přidáte jej příkazem "modprobe cls_fw", natrvalo připsáním do /etc/modules.

Doplněk: Funkce omezí veškerý provoz na zadaném rozhraní na rychlost připojení Internetu. Což není zrovna vhodné, pokud vám na routeru běží třeba FTP server. Vytvořil jsem tedy další funkci bypass_shaper, která vyřadí lokální přenos z omezení:

  bypass_shaper()
  {
    tc class add dev $1 parent 1: classid 1:2 htb rate $2 ceil $2
    tc filter add dev $1 protocol ip prio 1 parent 1: u32 match ip src $3 classid 1:2
  }

Volá se

  bypass_shaper rozhraní rychlost rozsah

Pokud chcete používat zároveň funkci set_shaper a bypass_shaper, musíte ve funkci set_shaper změnit oba výskyty "prio 1" na "prio 2".

Tím se lokální provoz procházející síťovou kartou rozhraní vyřadí z omezení na rychlost připojení do Internetu. Místo toho se omezí na rychlost, která se zde zadává i s jednotkami (např. 2Mbit). rozsah je rozsah adres, který používáte v lokální síti (např. 192.168.0.0/16). Původně jsem chtěl do funkce zadat napevno všechny privátní rozsahy, ale dnes i sítě některých ISP fungují v privátním rozsahu.

Další informace:
HTB - jemný úvod - článek na root.cz
Linux Advanced Routing and Traffic Control - nevyčerpatelný zdroj informací o Traffic Shapingu
HTB Homepage - Stránka autora HTB (použitého nástroje pro traffic shaping) s manuálem a příklady nastavení

Děkuji člověku s nickem "Pomerančovej Džžus", který mě konečně dokopal napsat uvedenou funkci. Článek vznikl přepsáním ICQ komunikace s ním.

Jak na DNS

S DNS souvisí dva programy: Dnscache a Tinydns.

Dnscache zajistí, že router se bude chovat jako DNS server (tj. počítače v síti můžou mít jako DNS nastavenou adresu routeru a ne adresu serveru od poskytovatele připojení). Zároveň výsledky DNS dotazů ukládá, čímž se další dotazy urychlí.

Tinydns vám umožní zavést si v lokální síti DNS jména.

Dnscache

Balík dnscache.lrp najdete na stránce distribuce Bering, jejíž je standardní součástí.

Konfigurační soubory se skrývají v adresáři /etc/dnscache/env. Můžete je editovat přímo, nebo pomocí menu (příkaz lrcfg). Pozor! Každý konfigurační soubor musí končit prázdným řádkem!

Poznámka pro CZFree:
CZFree používá vlastní doménu .czf s nezívislou hyearchií DNS serverů. Je tedy nutno zajistit, aby se DNS dotazy do domény .czf neposílaly na server ISP, ale na některý z kořenových DNS serverů CZFree. Proto jsem vytvořil upravenou Dnscache (stačilo upravit spouštěcí skript). Ta přidává nový konfigurační soubor DOMAINS. V něm je na každém řádku doména a její DNS server (oddělené mezerou). Pokud má doména více DNS serverů, bude na několika řádcích tatáž doména pokaždé s jinou adresou serveru. Příklad:

  czf 10.24.1.2
  czf 10.15.0.1
  10.in-addr.arpa 10.24.1.2
  10.in-addr.arpa 10.15.0.1

Další informace:
Dokumentace k dnscache

Tinydns

Balík tinydns.lrp lze stáhnout z téhož místa, kde byla Dnscache. Konfigurační soubory jsou ve dvou adresářích (/etc/tinydns-private/env a /etc/tinydns-public/env), takže je asi lepší použít menu (příkaz lrcfg).

Důležité: Adresa, na které běží Tinydns server musí být odlišná od adresy, kde běží Dnscache! Jinak se totiž dotazy odlišit nedají - všechny jsou na standardním portu 53. Vhodné je nastavit adresu Tinydns na 127.0.0.1 (dotazy zvenku půjdou na Dnscache a ta je pošle na 127.0.0.1 (localhost), tahle spolupráce se zajistí automaticky).

Poznámka: Jaký je vlastně (technicky) rozdíl mezi privátním a veřejným serverem? Veřejný server je začleněný do hyearchického doménového systému. Dnscache tedy ani nemusí vědět, že na routeru DNS server běží: prostě se zeptá nadřízeného DNS serveru a od něj získá adresu, kde běží Tinydns. U privátního serveru je to nutné obejít, a Tinydns musí přímo vnutit Dnscache sebou spravovanou doménu (to udělá tak, že nacpe záznam do /etc/dnscache/root/servers).

Vlastní nastavení domén je v souborech /etc/tinydns-public/root/data (veřejný server) a /etc/tinydns-private/root/data (privátní server). Každá řádka je uvozena jedním znakem, který určuje její typ:

Použití se nejlépe vysvětlí na příkladě (síť 192.168.1.0/24 s doménou moje.sit):

  #Domenu moje.sit spravuje DNS server ns1.moje.sit
  .moje.sit::ns1.moje.sit

  #Reverzni zaznamy 192.168.1.0/24 spravuje tentyz server
  #Povsimnete si opacneho poradi IP adresy!
  .1.168.192.in-addr.arpa::ns1.moje.sit

  #Mailserver domeny je mail.moje.sit
  @moje.sit::mail.moje.sit

  #Router 192.168.1.1 ma hlavni DNS jmeno router.moje.sit (na toto jmeno
  #se nastavi i reverzni zaznam) a dalsi jmena ns1.moje.sit a mail.moje.sit
  =router.moje.sit:192.168.1.1
  +ns1.moje.sit:192.168.1.1
  +mail.moje.sit:192.168.1.1

  #Obdobne se priradi jmena pocitacum v siti (s reverznim zaznamem)
  =adam.moje.sit:192.168.1.2
  =bara.moje.sit:192.168.1.3

V případě u privátního serveru se ještě do DOMAINS přidá záznam:

  1.168.192.in-addr.arpa
  moje.sit

Další informace:
Dokumentace k tinydns

Jak na DC Hub

Ať už si o nich myslíme cokoli, P2P sítě na sdílení souborů jsou jednou z nejvyužívanějších služeb Internetu. Pro malou síť je ideální Direct Connect. Existuje pro něj open-source server (hub) Open DC Hub, který lze zprovoznit i na WISPu pomocí balíku opendc.lrp.

Instalace:
Před spuštěním Open DC Hubu je nutné vytvořit uživatele a skupinu opendchub:

Dále je nutno nastavit heslo pro přístup na konfigurační konzoli (z bezpečnostních důvodů jsem nechtěl nastavovat nějaké výchozí heslo, nechal jsme ho prázdné, takže se připojit nelze). V souboru /home/opendchub/.opendchub/config najděte admin_pass="" a do těch uvozovek napište zvolené heslo.

Nyní můžete hub spustit příkazem "/etc/init.d/opendchub start". Měl by se též spouštět automaticky po restartu.

Konfigurace:
Konfigurační soubory se nacházejí v adresáři /home/opendchub/.opendchub. Hlavní konfigurace je v souboru config, zpráva zobrazovaná po připojení v souboru motd. Změna těchto souboru se ale projeví až po restartu hubu. A není dobré restartovat hub, když jsou na něm připojeni uživatelé. Proto má hub konfigurační konzoli, kde se dá všechno nastavit pomocí příkazů a změny se ihned projeví. Připojíte se na ni příkazem

  telnet localhost 53696

Tip: Pokud si to číslo 53696 také pořád nemůžete zapamatovat, přidejte na konec /etc/services řádek

  opendchub	53696/tcp	# Open DC Hub Console

Pak se budete moci připojovat na konzoli příkazem

  telnet localhost opendchub

Příkazy
Všechny příkazy začínají znakem "$" a končí znakem "|" (ve Windows je na jakékoli klávesnici napíšete pomocí Alt+36 a Alt+124), např. $exit|. Popisuji jen nejdůležitější příkazy, zbytek najdete v dokumentaci k Open DC Hubu.

Parametry
Parametry nastavení hubu jsou v souboru config. Příkazem $set parametr hodnota| v konzoli hubu je lze měnit bez nutnoti restartu hubu. Pozor, v hodnotě parametru nesmí být "|", to by se považovalo za konec příkazu!

Další informace:
Stránka Open DC Hubu - odtud můžete stáhnout opendchub-0.7.14.tar.gz, kde najdete kompletní dokumentaci
Fórum o Open DC Hubu
DC++ - Direct Connect klient pro Windows
DCGui - Direct Connect klient pro Linux, Windows i Mac

Poznámka: Podařilo se mi dostat Open DC Hub na 1 disketu :-) (pomocí distribuce Bering, včetně přístupu přes Telnet a FTP). Pokud by se to snad někomu hodilo, ozvěte se a já to dostanu do distribuovatelné podoby.

Jak na FTP

Jednoduchý přístup přes FTP pro nahrávání balíků apod. se dá udělat pomocí ftpd.lrp, ale lepší je použít přístup přes SCP (např. pomocí WinSCP) - není třeba ve WISPu nic nastavovat a je to i bezpečnější.

Dále se tedy budu zabývat pouze vytvořením anonymního FTP (tj. takového, na které se dá přihlásit zadáním jména "anonymous" a e-mailové adresy jako hesla). Zvolil jsem server ProFTPD, který umí ledascos, ale pro jednoduché účely má i docela jednoduché nastavení. Nesehnal jsem balík s aktuální verzí, takže jsem zkompiloval momentálně nejnovější verzi 1.2.9, ze staženého balíku jsem použil jen spouštěcí skript. Výsledek můžete stáhnout tady: proftpd.lrp.

Před spuštěním
Než ProFTPD spustíte, je nutno vytvořit uživatele a skupinu ftp:

Důležité: ProFTPD vyžaduje, aby měl router korektní jméno, které lze převést na IP adresu. Nejsnažší je nastavit jméno přikazem hostname (hostname jméno) a pak toto jméno přidat do /etc/hosts spolu s IP adresou routeru - na řádku bude IP adresa, mezera a zadané jméno.

Spuštění
Nyní můžete server ProFTPD spustit příkazem /etc/init.d/proftpd start. Měl by se též automaticky spouštět po restartu. Pokud řešíte problém, můžete jej donutit vypisovat všechny informace na konzoli příkazem "proftpd -d9 -n" (ukončíte jej pak Ctrl+C). Nyní se můžete připojit vaším oblíbeným FTP klientem anonymně na standarní port 21. Zobrazí se obsah adresáře /home/ftp (takže prozatím nic). Zatím je povolen pouze download souborů, ne upload.

Konfigurace
Konfigurace ProFTPD je v souboru /etc/proftpd.conf. V ProFTPD se dá nastavit snad cokoli, včetně virtuálního hostingu, já se soustředím jen na vysvětlení některých parametrů z konfiguračního souboru.

Jak udělat FTP na disku?
Popsaný postup má drobný háček - je k ničemu. FTP prostor je totiž v ramdisku, ze kterého WISP běží. Je tedy omezen na pár MB a po restartu se ztrácí (i když zálohujete konfiguraci!). Budu předpokládat, že na disku je další partition naformátovaná jako FAT32. Zde se ukáže síla Linuxu: bez problémů lze /home/ftp "přesměrovat" na tuto partition příkazem:

  mount -t vfat -o uid=400,gid=400 /dev/hda2 /home/ftp

Pokud chcete, aby se toto provedlo po restartu, přidejte do /etc/fstab řádek:

  /dev/hda2 /home/ftp vfat uid=400,gid=400 0 0

Pokud je partition na disku až třetí, má označení hda3, je-li první na druhém disku, je hdb1 atd.

Další informace:
Homepage ProFTPD - kompletní dokumentace

Jak na www server

Balík s nejrozšířenějším www serverem Apache je tady: httpd.lrp. Před spuštěním je pouze nutné zajistit, aby měl server korektní DNS jméno. Pokud máte v síti již funkční DNS, stačí nastavit DNS jméno routeru jako jeho hostname: hostname DNS_jméno. Pokud ne, nastavte routeru nějaké jméno příkazem "hostname jméno" a pak toto jméno přidejte do /etc/hosts spolu s IP adresou routeru - na řádku bude IP adresa, mezera a jméno routeru.

Nyní můžete spustit server příkazem /etc/init.d/httpd start. Je nastaven i na automatické spouštění po restartu. Pokud zadáte do prohlížeče adresu routeru, měl by se zobrazit prázdný seznam souborů (žádné stránky jste zatím nenahráli). Pokud stránky nahrajete do adresáře /var/httpd/htdocs, měly by se zobrazit. Pokud ne, podívejte se, v čem je problém, do /var/httpd/logs/error_log. V témže adresáři je i access_log - přehled přístupů na váš server.

CGI Skripty
Server má v sobě podporu CGI skriptů (PHP bohužel ne). Skripty se nahrávají do adresáře /var/httpd/cgi-bin a z prohlížeče je vyvoláte zadáním adresy http://adresa_serveru/cgi-bin/jméno_skriptu. Při vytváření skriptu je nutno dodržet tyto podmínky:

  1. Skript nelze napsat ve Windows v Notepadu a pak nahrát na router, Windows používají jiné ukončovače řádek než Linux. Musíte jej buď psát v editoru, který umí UNIXové soubory (např. UltraEdit) a nebo rovnou ve WISPu (je tam snadno ovladatelný editor ae a samozřejmě klasický vi)
  2. Skript musí mít práva na spuštění - nastavíte příkazem "chmod 755 skript"
  3. Skript musí mít na začátku (kromě klasického #!/bin/sh):
      echo -e "Content-type: text/html\n"

Ten, kdo by si psal vlastní CGI skript, tyto řádky jistě číst nemusí. Píšu je proto, pokud byste chtěli použít nějaký hotový skript, například Wewimo zobrazující signál klientů na Wi-Fi AP. Skript je již na CGI připraven, takže bod 3) odpadá, jen je nutno na začátku změnit CGI_SCRIPT=0 na CGI_SCRIPT=1. Při tom můžete nastavit i HOSTNAME o 2 řádky níže.

Konfigurace
Hlavní konfigurace je v /var/httpd/httpd.conf. Popíšu jenom pár nejzákladnějších parametrů, ale žádný z nich pravděpodobně nebude potřeba měnit. Nezapomeňte, že znak '#' na začátku řádky znamená komentář, a řádek se tedy ignoruje!

Další informace
Dokumentace Apache HTTP Serveru
Malý průvodce konfigurací Apache - článek na root.cz, doufám, že ještě umíte slovensky :-)

Jak na statistiky

Na základě několika dotazů jsem se rozhodl napsal něco o tom, jak lze sbírat a zobrazovat informace o přenesených datech jednotlivých klientů. Možností je několik:

Pokud vám stačí sbírání informací do logů, můžete použít IPFM. Existuje i hotový balík pro WISP: ipfm.lrp. Chcete-li statistiky spřístupnit přes www (ve formě tabulek), můžete nainstalovat scr_ipfm (napsáno v PHP).

Ovšem statistiky vždycky vypadají lépe a radostněji, pokud se jim dá vizuální podoba ve formě grafů. Ve velkých sítích se používají nástroje jako MRTG nebo Cricket, ale to je v našem případě kanón na vrabce. Jednodušší je sbírat data pomocí zmiňovaného IPFM a zobrazovat je do grafů pomocí RRDTool (postup je popsán zde). Já jsem se pokusil najít něco ještě jednoduššího. A objevil jsem BandwidthD.

BandwidthD je pro náš účel ideální: sám sbírá informace o přenesených datech a sám generuje grafy (celkem a pro každou IP adresu), není potřeba PHP ani CGI. Kromě grafů zobrazuje i tabulku množství přenesených dat podle jednotlivých adres. Přenosy navíc dělí do několika kategorií: HTTP, TCP, UDP, ICMP, VPN, P2P (podle portů, takže to moc nefunguje, P2P programy používají náhodné porty (DC) nebo lze port měnit (eMule)). I nastavení je docela jednoduché, BandwidthD nenabízí žádné komplikované funkce, jen to, co je potřeba. Vytvořil jsem balík bwidthd.lrp. Přidal jsem do něj i knihovny, které BandwidthD potřebuje (libgd, libpng a libpcap), proto je balík trochu větší (244 kB).

Instalace
Předpokládám, že již máte funkční www server (viz "Jak na www server" výše). Konfigurace BandwidthD je v souboru /etc/bandwidthd.conf. Před spuštěním je zde nutno nastavit subnet, ve kterém se nacházejí IP adresy, které chceme měřit. Parametr je "subnet síť maska", např. "subnet 10.0.0.0 255.0.0.0". Dále je nutno nastavit síťové rozhraní, ze kterého bude BandwidthD sbírat data (pravděpodobně rozhraní do Internetu). Parametr je "dev "rozhraní"", např. "dev "eth0"".

Pak je nutno nastavit "propojení" s www serverem. BandwidthD ukládá vytvořené grafy do /var/bandwidthd/htdocs. V adresáři s www stránkami se tedy musí vytvořit link ("zástupce") na tento adresář:

  ln -s /var/bandwidthd/htdocs adresář_s_www_stránkami/bandwidthd

Pokud jste instalovali www server podle mého návodu, jsou www stránky v adresáři /var/httpd/htdocs. Příkaz tedy bude:

  ln -s /var/bandwidthd/htdocs /var/httpd/htdocs/bandwidthd

Nyní již můžete spustit BandwidthD příkazem "/etc/init.d/bandwidthd start". Pokud otevřete v prohlížeči http://váš_server/bandwidthd, měla by se zobrazit stránka vytvořená BandwidthD. A za pár minut by se zde měly objevit první grafy.

Zachování hodnot při restartu
BandwidthD si udržuje informace, ze kterých grafy vytváří, pouze v paměti. Z grafů je nelze nijak získat zpět, takže restartem BandwidthD se tyto informace ztrácí. Naštěstí BandwidthD umí data ukládat i do logu: /var/bandwidthd/log.cdf. A to hlavní: po spuštění je z tohoto logu načte.

Pokud dáte uložit konfiguraci WISPu, uloží se i logy BandwidthD. Bohužel se ale nacházejí v paměti, ne na disku, takže například výpadek proudu nevydrží (resp. načtou se logy z okamžiku posledního uložení konfigurace). Nevýhoda je, že logy mohou po čase zabrat docela dost místa. Proto je vhodné je čas od času "orotovat" příkazem /etc/init.d/bandwidthd rotate. To znamená, že se 1. log přesune na 2., 2. na 3., 3. na 4., 4. na 5. a 5. se vymaže.

Logování je možné vypnout (output_cdf v /etc/bandwidthd.conf se nastaví na false), stejně tak je možno vypnout načítání dat z logů (recover_cdf se nastaví na false). Ale nezapomeňte, že pak po ukončení BandwdthD nebude možné žádným způsobem získat nasbíraná data zpět (grafy sice zůstanou, ale jen do nového spuštění BandwidthD nebo restartu).

Poznámka: BandwidthD standardně kreslí graf jen u adres, které přenesly alespoň 1MB dat. Pokud toto chcete změnit, odkomentujte (odstraňte '#') z řádky #graph_cutoff 1024 a zadejte jinou hodnotu (v kilobytech), klidně i 0.

Dodatek: Pravděpodobně vás zajímají přenosy z a do Internetu, ne přenosy uvnitř sítě. Pokud máte přímo v routeru rozhraní do Internetu, stačí spustit BandwidthD na tomto rozhraní. Komplikovanější situace nastává, když je váš router součástí větší sítě (např. CZFree) a po spoji k Internetové bráně prochází i lokální přenos. BandwidthD neumí kreslit odděleně grafy pro lokální přenosy a přenosy z Internetu, ale naštěstí je možné určit, jaké přenosy se mají započítávat. Filtr se nastavuje parametrem filter v /etc/bandwidthd.conf (nezapomeňte odstranit '#' na začátku řádku). Syntaxe je shodná se syntaxí filtru v programu tcpdump, viz manuálová stránka. Odfiltrování lokálních přenosů vypadá takto:

  filter "ip and not src and dst net lokální_síť"

lokální_síť je například 10.0.0.0/8.

Jak zvětšit ramdisk

Zatímco .cfs balíky zůstávají na disku (jen se připojí do systému souborů), .lrp balíky se rozbalují do ramdisku. Standardní velikost ramdisku je 8MB, takže pokud přidáváte více balíků, může vám snadno dojít místo. Bohužel nelze ramdisk zvětšit jednoduše editací nějakého konfiguračního souboru, nastavení je skryto uvnitř initrd.lrp.

Co je initrd?
Většina .lrp balíků jsou normální .tar.gz archivy (pokud je přejmenujete na .tar.gz, můžete se do nich podívat i ve Windows, třeba Total Commanderem). Initrd.lrp je jediná vyjímka. Je také zabalen Gzipem, ale není v něm TAR archiv, ale image filesystému (minix). V něm jsou moduly pro přístup k disku (aby bylo možné disk připojit a natáhnout z něj zbývající balíky) a také skript linuxrc, který vytváří ramdisk a rozbaluje do něj balíky. Ten právě potřebujeme upravit.

Jak editovat soubory v initrd?
Napíšu jen posloupnost příkazů, vysvětlování by bylo dost zdlouhavé. Příkazy neopisujte, v tom byste určitě udělali chybu, spíše se připojte např. pomocí PuTTY, zkopírujte je a pak je vložte (v PuTTY pravým tlačítkem myši).

cp /mnt1/initrd.lrp /root/initrd.gz
cd /root
gunzip initrd.gz
dd if=/dev/zero of=/dev/ram bs=1k count=1000
dd if=/root/initrd of=/dev/ram
mount -t minix /dev/ram /initrd

Nyní by se v /initrd mělo objevit několik adresářů. Pokud ne, pravděpodobně bylo v ramdisku málo místa na rozbalení initrd.lrp. Budete muset v syslinux.cfg zrušit některé balíky (nejlépe vše kromě root a sshd) a restartovat.

Nyní lze již normálně editovat soubory, které byly v initrd.lrp. My se podíváme na /initrd/linuxrc (příkaz ae /initrd/linuxrc). Najděte řádek SYSTSIZE=8M a těch 8M změňte na nějakou větší hodnotu (16M nebo rovnou 32M, ale nenastavujte víc než cca polovinu velikosti paměti).

Když už máme initrd připravený k editaci, můžeme též zrušit nepotřebné moduly, které se zavádějí při startu. Pokud WISP spouštíte z klasického harddisku (případně z Compact Flash karty v IDE redukci), můžete v /initrd/boot/etc/modules zakomentovat (znakem '#' na začátku řádku) řádky mtdcore, doc2000, docecc, docprobe a nftl.

Nyní initrd.lrp uložíme:

cd /root
umount /initrd
dd if=/dev/ram bs=1k count=1000 | gzip > /mnt1/initrd.lrp
freeramdisk /dev/ram
rm /root/initrd

Po rebootu bude mít ramdisk nastavenou velikost a bude v něm dost místa pro přidávané balíky.

Jak na filtraci MAC adres

Pokud provozujete Wi-Fi síť, dříve nebo později budete potřebovat síť zabezpečit, aby se do ní nemohl připojit nikdo cizí. To lze vyřešit filtrací podle MAC adresy (adresy, kterou má každá síťová karta a měla by být jednoznačná). Řešení bohužel není 100%, pokud někdo odchytí pár IP-MAC adresa, do sítě se dostane, ale "lepší než bezdrátem do oka". Způsobů filtrace MAC adres je několik:

  1. Použití Closed MAC Policy (filtraci bude provádět přímo síťová karta). To lze snadno nastavit přes menu WISPu, ale ne u všech karet a hlavně to neumožňuje pevně svázat IP a MAC adresu (takže klient by si mohl přisvojit IP adresu jiného klienta).
  2. Použití filtrace pomocí iptables - umožňuje svázat IP a MAC adresu, ale je syntaxe je docela složitá a musí se zavádět další moduly.
  3. Použití "Static ARP" - do ARP tabulky (ve které je ke každé IP adrese přiřazena odpovídající MAC adresa) se přidají statické záznamy (normálně se záznamy zjišťují dotazem do sítě). Tento postup mi připadá nejjednodušší, proto ho popíšu dále.

Statické ARP záznamy jsou uloženy v souboru /etc/ethers. Na každé řádce je dvojice IP adresa - MAC adresa (odělené mezerou). V souboru budou všechny IP adresy z rozsahu Wi-Fi sítě (kromě první (pravděpodobně x.x.x.0), poslední (pravděpodobně x.x.x.255) a adresy routeru). K těm, které mají přiřazeni klienti se zapíše MAC adresa klienta. K těm, které nejsou nikomu přiřazeny a nemají tedy přístup povolen se zapíše 00:00:00:00:00:00.

Pomocí příkazu "arp -f" se záznamy z tohoto souboru načtou do ARP tabulky a uvedou v platnost. Aby se tento příkaz provedl automaticky po startu routeru, přidejte jej do /etc/network/ifup.local.

Příklad:

  192.168.1.1 11:22:33:44:55:66
  192.168.1.2 00:00:00:00:00:00
  192.168.1.3 00:00:00:00:00:00

Do sítě bude mít povolen přístup počítač s IP adresou 192.168.1.1 a MAC adresou 11:22:33:44:55:66, IP adresy 192.168.1.2 a 192.168.1.3 jsou zakázané.

"OK, mám subnet /24, takže teď mám teda napsat 253 řádek? Představoval jsem si líp strávený večer...". Naštěstí ne, soubor můžete vygenerovat jedním (i když trochu delším) příkazem (adresu "192.168.1" nahraďte tou, kterou používáte v síti):

  i=2; while [ $i -le 254 ]; do echo "192.168.1.$i 00:00:00:00:00:00"; i=`expr $i + 1`; done > /etc/ethers

Ke všem IP adresám se vygeneruje MAC adresa 00:00:00:00:00:00, takže zbývá jen změnit záznamy u IP adres, které jsou přiřazeny klientům.

Poznámka: Pokud byste chtěli ponechat několik adres pro volné připojení (pro Street Access nebo na vyzkoušení), stačí jen tyto adresy v /etc/ethers vynechat.

Další informace:
Zabezpečení WiFi sítí - první odkaz co mi dal Google, ale je zde docela dobrý přehled možností zabezpečení a další odkazy na podrobnější informace.

Jak na TeamSpeak

Pokud vás už bolí prsty z psaní si po ICQ/IRC/Jabberu, je na čase zkusit hlasovou komunikaci přes síť. Wi-Fi je na to rychlé dost. Programů je nepřeberné množství, ale mě zdá nejvhodnější TeamSpeak: je freeware bez reklam i jakýchkoli horších věcí, existuje klient pro Windows i Linux a hlavně lze server spustit i na WISPu.

Klienta si můžete stáhnout z domovské stránky a .lrp balík se serverem ode mě: tss.lrp.

Instalace:
Před spuštěním TeamSpeak serveru je nutné vytvořit uživatele a skupinu tss:

Nyní můžete server spustit příkazem /etc/init.d/tss start.

Po spuštení (trvá trochu déle) by se mělo dát na server připojit klientem (na portu 8767). Konfigurace se provádí přes www rozhraní na portu 14534. K připojení na www rozhraní je nutno znát heslo. To se po prvním spuštění vygeneruje náhodně a zapíše do logu /home/tss/server.log. Konkrétní nastavení popisovat nebudu, je docela intuitivní a pro základní použití v něm není potřeba nic měnit. Podrobnější informace viz manuál k serveru.

A to je konec...

Již jsem distribuci WISP přestal používat na svém routeru, nároky už přerostly její možnosti a nadešel čas na instalaci klasické distribuce. Návod se tedy již pravděpodobně rozšiřovat nebude. Ale budu v něm určitě opravovat chyby a nepřesnosti, pokud nějakou naleznete, napište mi na mail: 8an@centrum.cz

Poslední aktualizace 16.6.2004.
Dokument může být používán, kopírován i upravován bez omezení.