Objavljeno: 20.11.2005 17:04 | Avtor: Tom Erjavec | Monitor Maj 2004

Usmerjevalnik z ugnezdenim Linuxom 2. del

V prvem delu tega prispevka, v prejšnji številki, smo preleteli ozadje gnezdenja Linuxa in opisali izbrano strojno opremo brez gibljivih delov ter eno od možnih programskih oprem za ta amaterski projekt. Mini distribucijo Linuxa LEAF/Bering smo opremili s primernimi gonilniki za izbrano strojno opremo. Pregledali smo sredstva za postavljanje gonilnikov in zaganjanje storitev ter delovanje iz RAM diska, ki je primerno za gnezdenje.

Nastavljanje omrežnih funkcij

Programski paketi, navedeni v parametru LRP, ki sem jih nastavil v svoji postavitvi, so poleg standardno potrebnih za delovanje operacijskega sistema še:

iptables - filtriranje paketov IP

pump - odjemalec DHCP

shorwall - lupina požarnega zidu nad filtrom iptables

ulogd - zapisovanje omrežnih dogodkov

dnscache - shranjevanje in posredovanje informacij DNS za notranje omrežje

weblet - mini strežnik HTTPD za nadzor usmerjevalnika z notranjega omrežja

libz, sshkey, sshd, sftp - knjižnica in strežniki za podporo protokolu SSH

S tem, da zaganjalnik naloži želene pakete, usmerjevalnik seveda še ni nastavljen. Zdaj pride na vrsto menu lrcfg, v katerem moramo pazljivo nastaviti nekaj parametrov. V resnici posredno nastavimo datoteke v imeniku /etc skozi prijaznejšo lupino menuja.

Nastavljanje Beringovih omrežnih funkcij na menuju lrcfg

Navodila distribucije Bering so tu povsem zanesljiva in natančna. Če vemo, za kaj gre pri usmerjanju IP, ne bi smelo biti težav. Ob morebitnih dvomih pa je priznana biblija za IP knjiga W. Richarda Stevensa: TCP/IP Illustrated, Volume 1. S praktičnim delom že nekoliko zastarela, pa vendar dokaj poučna, je tudi knjiga Tonyja Mancilla: Linux Routers, s strnjenim pregledom osnov IP omrežij ter s praktičnimi znanji iz projekta LRP.

V oklepajih je navedena datoteka, ki jo nastavimo pri posamezni postavki. Naštete so samo najpomembnejše postavke za nastavljanje omrežnih parametrov usmerjevalnika.

interfaces - nastavimo IP naslove na omrežne vmesnike (/etc/network/interfaces)

  • Za naš projekt nastavimo zunanji vmesnik, da bo pridobil IP naslov prek protokola DHCP od ponudnika Interneta, notranji vmesnik pa nastavimo na statični IP naslov iz razreda zasebnih IP naslovov 10.x.x.x (nemara bo kdo drug raje izbral zasebni obseg 192.168. x.x):
  • # nastavljanje javnega vmesnika

    auto eth0

    iface eth0 inet dhcp

    # nastavljanje zasebnega vmesnika

    iface eth1 inet static

    address 10.8.0.1

    masklen 13

    broadcast 10.15.255.255

  • Dolžino maske bo vsakdo prilagodil svojim potrebam.
  • hostname - ime usmerjevalnika (/etc/hostname)

    resolv.conf - kazalci na strežnike DNS (/etc/resolv.conf)

  • Za naš projekt usmerimo DNS zahtevke kar na naš usmerjevalnik. Čudno? Ne. Uporabili smo tudi paket dnscache, ki bo prevzel funkcijo strežnika za DNS kar na našem usmerjevalniku.
  • nameserver 10.8.0.1

    Nastavljanje programskih paketov in požarnega zidu

    Zdaj moramo skozi podoben menujski vmesnik nastaviti še programske pakete.

    Nastavljanje Beringovih programskih paketov na menuju lrcfg

    Poleg initrd in modules je res nujno nastaviti samo še požarni zid shorewall. Možnosti za nastavljanje je veliko več, kot je opisanih spodaj. Opisali smo samo tiste, ki so neobhodno potrebne za delovanje požarnega zidu.

    zones - definiramo omrežne segmente usmerjevalnika (/etc/shorewall/zones)

    #ZONE   DISPLAY        COMMENTS

    net        Net       Internet

    loc        Local     zasebno LAN omrezje

    interfaces - preslikamo logične segmente na fizične vmesnike (/etc/shorewall/interfaces)

    #ZONE   INTERFACE   BROADCAST   OPTIONS

    net        eth0      detect     dhcp,routefilter,norfc1918

    loc        eth1      detect

  • Z zgornjimi določili smo logični segment net preslikali na fizični vmesnik eth0 in segment loc na fizični vmesnik eth1. Vključene možnosti na segmentu net nam po vrsti zagotavljajo:
  • dhcp - parametre na tem vmesniku bo upravljal protokol DHCP
  • routefilter - na tem vmesniku bo jedro operacijskega sistema onemogočilo lažne IP naslove ("IP spoofing")
  • norfc1918 - na tem vmesniku so prepovedani zasebni internetni naslovi iz dokumentacije RFC 1918
  • rules - določimo pravila za filtriranje paketov v posameznih segmentih (/etc/shorewall/rules)

    #  Omogoci DNS povezave z usmerjevalnika v javno omrezje

    #ACTION      SOURCE         DEST      PROTO     DEST PORT   

    ACCEPT     fw           net       tcp       53

    ACCEPT       fw           net       udp       53

    #

    #  Omogoci protokol SSH iz zasebnega omrezja na usmerjevalnik

    ACCEPT       loc:10.8.0.0/13   fw       tcp       22

    #

    #  Omogoci ping iz vseh smeri v vse smeri

    ACCEPT       loc           fw       icmp      8

    ACCEPT       net           fw       icmp      8

    ACCEPT       fw           loc       icmp      8

    ACCEPT       fw           net       icmp      8

    #

    # Posebna pravila za Bering:

    # Omogoci udp/53 iz loc na usmerjevalnik za dnscache

    # Omogoci tcp/80 iz loc na usmerjevalnik za weblet

    ACCEPT       loc           fw       udp       53

    ACCEPT       loc           fw       tcp       80

  • Zgoraj zapisana pravila zadoščajo za enostaven požarni zid. Generalna politika požarnega zidu je sicer "prepovedan ves promet v vseh smereh". S pravili lahko oblikujemo poljubno storitev požarnega zidu. Če bi želeli, da požarni zid na usmerjevalniku vse prejete zahtevke za vzpostavitev povezav HTTP in SSH preusmeri na strežnik na naslovu 10.12.5.16 znotraj zasebnega segmenta, bi napisali tako pravilo:
  • #ACTION      SOURCE DEST          PROTO     DEST PORT   

    DNAT      net       loc:10.12.5.16   tcp       ssh,http

    masq - določimo prevajanje omrežnih naslovov

    #INTERFACE        SUBNET

    eth0        eth1

    Zgornje pravilo bo zagotovilo prevajanje vseh zasebnih naslovov z vmesnika eth1 v javni naslov vmesnika eth0 in nasprotno.

    Zagon usmerjevalnika z disketne enote

    Osnovno nastavljanje je s tem končano. Vse spremembe in nastavitve, ki smo jih naredili v datotečnem sistemu na disku RAM, bi bile izgubljene, če bi zdaj na novo pognali sistem. Zato moramo iz menujskega sistema lrcfg pognati proceduro za shranjevanje sprememb z diska RAM na disketo. Proces je v bistvu enostaven: posamične dele diska RAM (ali pa kar vsega) zapakira v datoteke gzip in jih s končnico .lrp zapiše na disketo. Ob naslednjem zagonu sistema se bodo naložile kot paketi .lrp in se razpihnili v datoteke na disku RAM.

    Shranjevanje nastavitve po delih ali v celoti

    Po shranjevanju res lahko izklopimo sistem in ga znova poženemo. Ustavljanje sistema Linux z ukazom shutdown -h now ali podobnim je zgolj higienske narave, saj fizičnega diska ni in do morebitnih napak datotečnega sistema zaradi nedokončanih pisalnih operacij sploh ne more priti. Usmerjevalnike na podlagi projekta LRP in izpeljank lahko vedno brez škode brutalno ugasnemo s stikalom.

    Po vnovičnem vklopu stikala in enominutnem žaganju po disketi se usmerjevalnik zbudi v želenem stanju.

    S paketom weblet je usmerjevalnik nadzorljiv z brskalnikom tudi na daljavo.

    Prenos v flash DoC

    Kdor se bo lotil opisanega postopka po tem prispevku, naj si najprej prebere besedilo do konca in se šele nato spravi k delu.

    To, kar smo naredili do zdaj, je že funkcionalno, če uporabljamo navaden zavržen namizni PC. V mojem primeru pa se je delo tu šele zares začelo. Sliko diskete sem moral spraviti v flash disk, saj STB3036 sploh nima disketne enote. Oglejmo si nekaj detajlov iz tega dela projekta.

    Ob nalaganju gonilnikov za DoC, mtdcore.o, docecc.o, doc2000.o, docprobe.o in nftl.o, v zapisanem vrstnem redu (ročno to lahko naredimo tudi z ukazom insmod) Linux zazna navidezno napravo IDE, izvedeno v čipu DoC. Logična naprava /dev/nftla postane vidna kot običajen disk IDE.

    Namestimo si orodja, ki jih potrebujemo. Shranjena so v paketih fdisk.lrp, mkdosfs.lrp in syslinux.lrp, ki si jih naložimo z ukazom

    lrpkg -i <ime_paketa>

    Najprej moramo v DoC zapisati tabelo razdelkov ("partition table"), da bomo izbrani razdelek nato lahko formatirali. V Linuxu to počnemo z ukazom fdisk. Le-ta zapiše podatke o definiranih razdelkih v prvi sektor diska, imenovan "Master Boot Record" (MBR).

    Za zagon Linuxa bomo uporabili zaganjalnik syslinux in DOSov datotečni sistem FAT. Zato s fdisk-om naredimo razdelek tipa 01, to je FAT-12. Namenimo mu vse navidezne cilindre diska /dev/nftla. Nato temu razdelku vklopimo zaznamek za aktivnost, tako da se bo operacijski sistem začel nalagati iz tega razdelka. Tabelo razdelkov, ki smo jo določili, zapišemo na disk /dev/nftla in zapustimo fdisk.

    Imamo razdelek s FAT-12, a je prazen. Moramo ga formatirati, tj. v njem ustvariti datotečni sistem. V Linuxu lahko datotečni sistem FAT-12 naredimo z ukazom

    mkdosfs -F 12 /dev/nftla1

    pri čemer ne smemo pozabiti na stikalo -F 12. Brez njega bo ustvarjeni datotečni sistem tipa FAT-16.

    Zdaj imamo na flash disku DoC vse nared. DoC priključimo v Linuxov datotečni sistem z ukazom

    mount -t msdos /dev/nftla1 /doc

    kjer je /doc priključna točka datotečnega sistema na disku RAM. Podobno priključimo disketno enoto

    mount -t msdos /dev/fd0u1680 /mnt

    in prenesemo vsebino diskete v flash disk:

    cp /mnt/* /doc

    Flash disk zdaj vsebuje vse, kar je bilo prej na disketi. Ne moremo pa z njega še pognati Linuxa. Za to moramo uporabiti paket syslinux, ki v ciljni razdelek zapiše zagonsko datoteko ldlinux.sys in pokaže, katero jedro naj zažene. Za to moramo na flash disku popraviti vsebino datoteke syslinux.cfg, tako da bo kot zagonsko napravo določala /dev/nftla1 namesto diskete /dev/fd0u1680:

    boot=/dev/nftla1:msdos

    Podobno naredimo za parameter PKGPATH. Slika flash diska je zdaj popolna. Zadnji korak je zagonska koda - logično odklopimo flash disk in nanj zapišemo zagonski program:

    umount /doc

    syslinux -s /dev/nftla1

    Ugasnemo vso strojno opremo. Odklopimo disketni pogon, ki je še vedno povezan s popkovino z namiznega računalnika. Prižgemo usmerjevalnik. Prešteje RAM, pregleda strojno opremo... No, bo kaj? Nič. Obvisi.

    Na tej točki sem izgubil več noči. Verjetno nisem prebral vse dokumentacije, vsekakor mi je manjkala drobna informacija, zaradi katere sem trikrat šel skozi celoten postopek in iskal, kje sem se zmotil, a je bil rezultat vedno isti. Linux se je ob začetku nalaganja s syslinuxom vedno obesil.

    Ko odpove v računalništvu vse, nam kot zadnje pribežališče ostane urejevalnik šestnajstiških števil. Prav tega sem se oprijel kot rešilne bilke. Vzrok za napako je bil nekje med tabelo razdelkov in zagonsko datoteko ldlinux.sys v aktivnem razdelku. V branju hex kode je nekaj prvinsko nedotaknjenega - bereš absolutno resnico, ki jo vidi procesor. Med bralcem in procesorjem ni nobenega prevajalnika, interpretorja ali kake druge nezanesljivosti, ki bi lahko potvorila čisto resnico.

    "Tu je kleč," me je po hamletovsko presvetlilo. V MBR ni bilo zagonske kode! Same binarne ničle in tabela razdelkov! Znova sem podrl vsebino flash diska. Po omari sem pobrskal za približno 18 let staro disketo z operacijskim sistemom MS-DOS 6.0, ki je iz nerazumljivega vzroka še vedno delovala, nato pa sem znova prelistal priročnik za MS-DOS. Niti Linuxov fdisk niti MS-DOS-ov FDISK nista v flash disk zapisala zagonske kode. Po napornem iskanju po spletu sem končno odkril nedokumentirano lastnost MS-DOSa: FDISK zapiše zagonsko kodo samo v MBR prvega fizičnega diska v računalniku (torej na prvi disk prvega vmesnika IDE). Druga nedokumentirana lastnost MS-DOSa je, da lahko FDISK s stikalom /MBR prisiliš, da zapiše zagonsko kodo tudi v MBR kakšnega drugega diska poleg prvega.

    HexEditor z dvema posnetkoma MBR - levi brez zagonske kode in desni z njo. Tabela razdelkov, vidna na dnu obeh zapisov, je pri obeh enaka.

    Oborožen s temi prijazno skritimi informacijami, sem si ročno naredil tak zagonski zapis, ga shranil v datoteko mbr.bin in ga v Linuxu ročno z ukazom

    dd if=/mnt/mbr.bin of=/dev/nftla bs=512 count=1

    prenesel na prazen DoC, nato pa od začetka ponovil prenos vsebine diskete na DoC, od definiranja razdelkov naprej.

    Nagrada je bila veličastna. Ob vklopu se je Linux naložil kot blisk. Seveda, zdaj je bilo vse v čipovju: moj STB3036 ni imel nobenega mehanskega dela več.

    Izhod v sili: predelava na CD-ROM ISO-9660

    Zavedam se, da se odvečna strojna oprema s flash diski ne valja ravno po mizah. Kadar je 1,68 MB premalo prostora, da bi vanj spravili vse želene funkcije prehodnega usmerjevalnika (gateway router), flasha pa nimamo, imamo za izhod v sili lahko CD-ROM.

    Najprej moramo na disketi popraviti nastavljanje Beringa, da pred nalaganjem operacijskega sistema iz initrd.lrp naloži gonilnike za naprave IDE in za CD-ROM (cdrom.o, ide-mod.o, ide-cd.o, ide-probe-mod.o in isofs.o), sicer zagonska procedura ne bo mogla brati datotek s CDja. Ta popravek naredimo z menuja lrcfg v postavki initrd. V drugem sledimo navodilom.

    Postopek je enak kakor za flash, le da namesto v flash zapečemo sliko diska RAM, ki jo imamo na disketi, na CD. Ker prostor tu ni razkošje, lahko naložimo toliko paketov, kolikor nam jih prenese pomnilnik RAM po zagonu. Vsebino delujoče diskete z Beringom prepišemo v poljubni imenik na disku. Vanj dodamo pakete, ki jih želimo zaganjati s CDja, in popravimo nastavitvene datoteke, tako da se bodo paketi naložili in bo syslinux pognal operacijski sistem s CDja namesto z diskete. Natančna dokumentacija o tem je zapisana v priročniku Bering_doc_install_1.2.pdf.

    Zmogljivosti

    Po namestitvi svojega usmerjevalnika sem naredil primerjalne ad-hoc teste med komercialnim širokopasovnim usmerjevalnikom in svojim izdelkom. Metoda testa je bila preprosta in sklepam lahko, da bi bili pri testiranju v živem okolju rezultati komercialnega usmerjevalnika še slabši. Varljivost testa je v tem, da bi bili v živem okolju IP paketi manjši in bi imel zato usmerjevalnik več dela s prevajanjem naslovov (NAT), zato pa manj dela z drobljenjem paketov (fragmentation). Iz obeh posnetkov z analizatorja je razvidno, da je bilo praktično 100 % pretoka ustvarjenega z največjimi možnimi okvirji v ethernetu, 1518 B, kar je posledica drobljenja velikih paketov.

    Z delovne postaje na zasebnem segmentu sem pingal delovno postajo na javnem segmentu. Vmes je bil prvič komercialni usmerjevalnik, drugič pa moj izdelek. Ping je bil največji možni, to je skoraj 64 KB (več operacijski sistem ne pusti zaradi potencialnega rušenja slabih izvedb skladov IP v starejših operacijskih sistemih). Vsak ping je torej generiral 8 × 64 Kb, to je 512 Kb. Ker ping generira pakete vsako sekundo in ker ciljni sistem vsak ping vrne nazaj pošiljatelju, da to skupaj promet 1 Mb/s za vsak delujoči ping. Pinge sem prožil drugega za drugim za neomejen čas, tako da se je promet kumuliral z vsakim dodatnim pingom.

    Rezultat testiranja komercialnega usmerjevalnika je na sliki 14.

    Obremenilni test komercialnega širokopasovnega usmerjevalnika

    V začetku grafa je vidno koračno dviganje pretoka, dvakrat v inkrementih po 1 Mb/s in nato enkrat za 2 Mb/s. Pri 4 Mb/s komercialni usmerjevalnik pade v zasičenje in prepustnost zaoscilira. Obremenjevan je bil še naprej, do 8 Mb/s, vendar je prepustnost pri tem stalno oscilirala, izguba paketov pa se je povečala do 86 %. Malo zahtevnejših uporabnikov IP televizije in videa na zahtevo si s takimi usmerjevalniki na hitrih povezavah ADSL ne znam predstavljati.

    Povsem drugače se je na obremenilnem testu obnašal moj usmerjevalnik. Njegova karakteristika je na sliki 15 (bralec mora upoštevati različni skali obeh grafov: prva do 7 Mb/s, druga do 60 Mb/s). Skozi ves graf je videti skoraj brezhibno odzivnost. Tudi pri tem testu je bila obremenitev stopnjevana v inkrementih po 1 Mb/s vse do hitrosti 40 Mb/s, torej 10x več, kot je bil zmogljivostni prag komercialnega usmerjevalnika. Izguba paketov je bila pri največji obremenitvi še vedno 0 %, zakasnitev pa je zrasla z 1 ms na 75 ms pri dveh hopih, kar je še vedno sprejemljiv odzivni čas.

    Obremenilni test usmerjevalnika z ugnezdenim Linuxom

    Sklep

    Izgradnja opisanega usmerjevalnika sicer ni pretirano zahtevna, terja pa svoj čas in nekaj izkušenj. Pokazali smo, da je mogoče tudi iz zastarele strojne opreme, na kateri se današnji najbolj uporabljani grafični operacijski sistem sploh ne bi zagnal, z uporabo mini distribucije Linuxa narediti zmogljiv polnokrven usmerjevalnik, ki vsaj za desetkrat prekaša svoje komercialne tekmece v razredu SOHO ("Small Office/Home Office").

    Odprta podlaga pušča možnosti za številne izboljšave in nadgradnje. V opisanem izdelku je upravljanje na ravni pisanja parametrov v postavitvene datoteke (kar lahko imamo s stališča zanesljivosti delovanja tudi za prednost!), čeprav so vsi komercialni izdelki že prešli na grafične vmesnike prek brskalnika. Paleta številnih paketov in novih orodij omogoča izredno fleksibilnost pri namembnosti naprave. Lahko si omislimo tretji (četrti, peti ...) segment za demilitarizirano cono požarnega zidu, na usmerjevalnik lahko postavimo javni spletni strežnik in e-poštni strežnik (čeprav je to s stališča varnosti vprašljivo). Z uporabo paketa freeswan lahko usmerjevalnik spremenimo v prehod VPN s šifriranjem tunelov 3-DES.

    Možnosti za nadgradnje je veliko in prepričan sem, da bo mogoče v letu dni sestaviti še številne nove zanimive postavitve.

    Viri:

  • http://leaf.sourceforge.net, strani z več izpeljankami projekta LEAF, izhajajočega iz LRP (Bering, Dachstein, Lince, Oxygen ...)
  • http://www.shorewall.net, strani Toma Eastepa o projektu Shorewall
  • http://sourceforge.net/project/showfiles.php?group_id=13751, odložišče datotek projekta Bering
  • http://leaf.sourceforge.net/devel/jnilo/bering/latest/modules/, prevedeni moduli za distribucijo Bering z jedrom Linuxa 2.4.20
  • http://syslinux.zytor.com/, domača stran zaganjalnika syslinux Petra Anvina
  • W. Richard Stevens: TCP/IP Illustrated, Volume 1, Addison Wesley Professional Computing Series, Addison Wesley Longman, Inc, 1994
  • Tony Mancill: Linux Routers, A Primer for Network Administrators, Prentice Hall, 2001
  • http://www.faqs.org/rfcs/rfc1918.html, Address Allocation for Private Internets, priporočilo RFC za uporabo zasebnih internetnih naslovov
  • http://leaf.sourceforge.net/devel/cstein/Packages/weblet.htm, navodila za uporabo paketa weblet za nadzor naprav LRP na daljavo prek brskalnika
  • http://lrp.steinkuehler.net/, domača stran Charlesa Steinkuehlerja
  • Naroči se na redna tedenska ali mesečna obvestila o novih prispevkih na naši spletni strani!

    Komentirajo lahko le prijavljeni uporabniki

     
    • Polja označena z * je potrebno obvezno izpolniti
    • Pošlji