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)
# 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
hostname - ime usmerjevalnika (/etc/hostname)
resolv.conf - kazalci na strežnike DNS (/etc/resolv.conf)
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
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
#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: