Praktikum 10 - Sissejuhatus võrgutehnoloogiasse
Kaasaegse operatsioonisüsteemi lahutamatuks osaks on andmevahetus (võrguühendus) teiste arvutitega. Veelgi täpsemalt enamik operatsioonisüsteeme on täna ühendatud internetti ja vigane võrguühendus võib tähendada mitmete operatsioonisüsteemi osade ning tarkvarade vähendatud funktsionaalust. Käesoleva praktikumi eesmärgiks ongi tutvuda IP-pakettide ruutimisega läbi mitme võrguseadme ehk uurida läbi lihtsustatud näite seadistamise kuidas internet jõuab teie arvutisse.
IP-aadress on arvutivõrgus asuva seadme identifikaator: seadmele määratud alaline või ajutine tunnusnumber, mille abil saavad nad üksteisega suhelda. Internet on omavahel kokku ühendatud arvutivõrgud, millest tuleneb ka nimetus (INTERconnected NETworks). Kahte võrku ühendaval seadmel (üldjuhul marsruuter) on vähemalt üks IP-aadress iga võrgu jaoks, millesse ta kuulub.
IP-aadressid võivad olla seadistatud võrguliidestele käsitsi ("staatiliselt") või automaatselt vastavalt selles võrgus jagatavale infole. IPv4 puhul jagatakse dünaamilisi aadresse DHCP-protokolliga. Selleks töötab võrgu mingis masina(te)s DHCP-server ning dünaamiliselt aadressi hankivates klientarvutites töötab vastaval liidesel DHCP-klient. Näiteks NAT-võrguga VirtualBoxis pakub DHCP-teenust VirtualBox ise, aga lihtsas (kodu)võrgus pakub DHCPd tavaliselt marsruuter. DHCP-server(id) võivad asuda ka eraldi masina(te)s (asutustes parema hallatavuse, tõrkekindluse, koormusjatuse, turvalisuse jm põhjustel).
IPv4-aadress jaguneb sisemiselt kaheks osaks – mingi esimesi bitte identifitseerib võrgu ning üle jäävad bitid identifitseerivad üksikut masinat (hosti) seal võrgus. Võrgumask näitab, missugused bitid on võrgu identifitseerimiseks (see võib igas võrgus isemoodi olla, kuni kaugemad ruuterid teavad sellise võrgu asukohta).
Praktikum toimub mitme virtuaalse Linuxi arvutiga, mis moodustavad meile tavapärast olukorda matkiva struktuuri, kus lõppkasutaja peab "laia Internetiga" ühendamiseks pakette saatma läbi mitme võrgu. Eesmärk on ühendada Internetiga kahe ruuteri taga olev klientarvuti, nagu näidatud joonisel.
Ruuter1
saab oma välise ühenduse IP-aadressi DHCP abil automaatselt ja VirtualBox laseb ta NAT-i kaudu Internetti.Ruuter2
saab oma ühenduseRuuter1
käest, nende vahel on IP-võrk192.168.X.0/24
, kusX on teie matriklinumbri kaks viimast kohta
.- Klient saab omakorda ühenduse
Ruuter2
käest ja nende vahel on IP-võrk192.168.{X+1}.64/26
.
NB! Praktikumis seadistatakse iga tegevusega veidi täiendavat funktsionaalsust ja juhendi lõpuks saab valmis näidis, kuidas Internet töötab. Küll aga tähendab see seda, et ühtegi punkti ei tohi vahele jätta ega ainult osaliselt teha, sest muidu ei hakka lõpplahendus tööle. Samuti pöörake tähelepanu, et tihti peidab järgmine tegevus ära mõne veateate olukorra, kus ping või pakettide edastamine ei toimi.
Kui praktikumijuhendiga hätta jääte siis on soovitatav lisaks vaadata COVID ajal toimunud praktikumi videosalvestust, kus tutvustatakse täiendavalt käesolevat praktikumijuhendit.
Sissejuhatus võrgutehnoloogiasse – olulisemad mõisted:
Järgnevad mõistete seletused pärinevad Erkki Laaneoks'a Võrgutehnoloogia 2010. aasta õpikust. Kellel on soovi täpsemalt uurida eesti keeles vastavaid mõisteid, leiavad sealt ka pikema seletuse. https://dspace.ut.ee/bitstream/handle/10062/18478/9789949195466.pdf
Saamaks kaks osapoolt omavahel suhtlema, peavad nad üksteisest aru saama. Inimestel on selleks keel, mida nad räägivad ning mille abil nad end üksteisele arusaadavaks teevad. Arvutite jaoks on selleks protokoll. Protokoll
on hulk kokkuleppeid, mille põhjal toimub suhtlus ja üksteisest arusaamine osapoolte vahel. Näiteks füüsilise taseme protokolli poolt määratakse kasutatavate elektrisignaalide tugevuse muutumise sagedus, pingenivood, kaabli üldtakistus, kodeering jne.
Arvutivõrk
on kogum arvuteid ja muid seadmeid, mis kasutavad ühist võrguprotokolli, jagamaks ressursse läbi võrgumeediumi. Muudeks seadmeteks peale arvutite võivad olla veel printerid, võrguseadmed, terminalid jt.
internet
– väikese algustähega internetiks nimetatakse suvalist kinnist ühendatud võrkude kogumit. Võib öelda ka, et internet on võrgustik ehk võrkude võrk.
Internet
– suure algustähega Internetiks nimetatakse maailma kõige suuremat internetti, mida meist enamik kasutab.
Oktett
– spetsifikatsioonides võidakse rääkida terminist "oktett". Oktett tähendab kaheksat ja väljade suurustes on ta ekvivalentne baidiga (üks bait on kaheksa bitti).
IP
on adresseerimisel kasutatavaks protokolliks Internetis. IP on marsruuditav protokoll (routed protocol). See tähendab, et edastatav andmeühik ehk pakett on võrgusõlmedel suunatav ühelt sõlmelt teisele, kuni pakett jõuab sihtpunkti (võrgusõlmed suunavad paketti järjest lähemale sihtpunktile). IP-võrgus olevat masinat, millel on unikaalne IP-aadress
, nimetatakse hostiks
. Hostiks võib olla tavaline arvuti, kuid ka server, võrguprinter, võrguseade, külmkapp jne – kõik seadmed, millele saab määrata IP-aadressi ja millega saab suhelda.
Iga arvuti, mis IP-võrgus asub, peab antud võrgus olemise ajal omama unikaalset aadressi. IP-aadress on midagi sarnast näiteks postiaadressi või telefoninumbriga. Igaüks, kellel on telefon, omab mingit unikaalset identifikaatorit, millele helistades jõuab kõne just ainult temani või jõuab kiri üheselt määratud aadressile. See tagab, et suvaline host saaks suhelda suvalise teise hostiga, kui ta teab tema aadressi. IP-aadresside kasutust reguleerib organisatsioon nimega IANA (Internet Assigned Numbers Authority). IANA koduleht: http://www.iana.org. IP-protokoll on ühenduseta, see tähendab, et mingit eraldi ühendust ei looda enne paketi teele saatmist. Seega ei pruugi paketi saatja IP-protokolli tasemel ette teada, kas pakett jõuab kohale või mitte või kas sihtpunkt üldsegi olemas on (näiteks IP-aadress ei ole kasutusel või on arvuti välja lülitatud). Samuti ei pruugi paketi liikumistee olla alati samasugune, see tähendab, et üks pakett võib liikuda ühte teed pidi, aga teine pakett teist teed pidi sihtpunkti. Sellest lähtuvalt võib hiljem teele pandud pakett jõuda sihtpunkti varem kui temast varem teele saadetud pakett, sest iga pakett on iseseisev ja sõlmed teevad edastamisotsused jooksvalt antud hetkel eeldatavalt parimat teed valides (mingite kriteeriumite alusel). Ühendusele orienteeritud ühendusviisi puhul luuakse ühenduskanal mõlema otspunkti vahel, seejärel saab andmeid vahetada osapoolte vahel. Paralleelina on tavalise paberkirja saatmine ühenduseta andmete saatmise viis (eelnevalt ei looda osapoolte vahel kanalit, seega võib kiri ära kaduda, adressaat mitteeksisteeriv olla jne). Ühendusele orienteeritud ühendus on seevastu tavaline telefoniühendus, kus luuakse otspunktide vahel ühendus, mille järel hakatakse sõnumeid vahetama. Ühenduseta ühendust kutsutakse tihti ka pakettkommuteeritud (packet-switched) meetodiks ja ühendusega ühendust lülitus-kommuteeritud (circuit-switched) meetodiks.
IP-aadress on kokku 32-bitine number. Inimesele loetavamaks ja paremini käideldavamaks kujuks on IP-aadress, kus ta on jaotatud neljaks osaks (igas osas kaheksa bitti), mis eraldatakse omavahel punktidega ja kirjutatakse enamasti kümnendsüsteemi arvudega. Neid osasid nimetatakse oktettideks (koosneb kaheksast bitist). Iga okteti väärtuseks on 0-255 (2^8-1=255; -1, sest loendamist alustatakse nullist). Seega on IP-aadressi üldkuju järgmine: "A.B.C.D", kus A, B, C, D ∈ {0, 1,..., 255}.
Igas internetis peavad kõikide hostide IP-aadressid olema unikaalsed, Internetis samuti. Kuna IP-aadressi alusel peab olema võimalik saata paketti suvalisele aadressile internetis, kus võib olla väga palju hoste, siis on vaja adresseerimine loogiliselt üles ehitada. IP-aadress jaotatakse kahte ossa: võrgu- ja hostiosa. Võrguosa bitid on IP-aadressis eespool olevad bitid ja hostiosa bitid on tagumised bitid. Võrguaadressiks (network address) nimetatakse IP-aadressi, kus hostiosa bitid on kõik nullid. Võrgu leviedastusaadressiks (broadcast address) nimetatakse IP-aadressi, kus hostiosa bitid on kõik ühed. Võrgu kasutatavateks IP-aadressideks nimetatakse kõiki IP-aadresseid, mis jäävad võrguaadressi ja leviedastusaadressi vahele. Võrguaadressil, kasutatavatel aadressidel ja leviedastusaadressil on võrguosa bitid samasugused, kuid hostiosa bitid on erinevad. Iga leviedastusdomeen omab oma unikaalset võrguaadressi ehk igal leviedastusdomeenil on unikaalsed võrguosa bitid, mida ei ole mitte kusagil mujal Internetis. Ühe leviedastusdomeeni sees on kõik hostiosa bitid samuti unikaalsed. Seega mitte ükski arvuti Internetis ei saa omada sama IP-aadressi. Edaspidi käsitleme IP-d Interneti kontekstis.
Võrgu- ja hosti aadressiosa piiritlemiseks kasutatakse võrgumaski
(network mask). Võrgumask
on samuti 32 bitti pikk, nagu IP-aadresski. Võrgumaskis on võrguosa bittide osas kõik ühed ja hosti osas kõik nullid. Seega võrgumask on binaarsel kujul 1...10...0. Võrgumask näitab, millised bitid IP-aadressis on võrguaadressi osa ja millised bitid on IP-aadressis suvalised, et vastav IP-aadress kuuluks vastavasse võrku.
Saatja peab mingile teisele hostile andmete saatmiseks teadma sihtpunkti (kui host asub samas kohtvõrgus) või võrguvärava MAC-aadressi (kui host asub väljaspool kohtvõrku) ja sihtpunkti IP-aadressi. IP- ja MAC-aadressi sidumisel on oluline teada, kas IP-aadress, kuhu me tahame paketti saata, asub saatjaga samas võrgus või mitte. Hostid omavad tabelit, mis sisaldab lokaalsetele IP-aadressidele vastavaid MAC-aadresse (mittelokaalsetele IP-aadresside puhul kasutatakse võrguvärava MAC-aadressi). Seda tabelit nimetatakse ARP
-tabeliks (Address Resolution Protocol).
NAT
i tegeval seadmel on kaks poolt, millest üks ühendatakse välisvõrguga ja omab välisvõrgu IP-aadressi (näiteks 123.45.67.89), teine pool ühendatakse sisevõrguga (vt ka joonist 11.2). Sisevõrgus kasutatakse privaatseks kasutamiseks mõeldud aadressiruumi, kus NAT-marsruuter omab samuti vastavasse võrku kuuluvat IP-aadressi. NAT toimib tõlgina välisvõrgu ja sisevõrgu vahel, kasutades tõlkimiseks porte (TCP ja UDP omasid).
Masinate loomine
Alustuseks tekita endale kolm (3) virtuaalmasinat, mille vahel pakette marsruutida.
- Esimese asjana peaksid tõmbama endale https://owncloud.ut.ee/owncloud/s/FKy7Kkr3Q25tmci net.ova ja importima oma VirtualBoxi.
- Klooni endale kolm (3) täiendavat virtuaalmasinat – olgu nende nimeks <sinuperekonnanimi>-ruuter1, <sinuperekonnanimi>-ruuter2 ja <sinuperekonnanimi>-klient. Iga masina kloonimiseks tee järgmist:
- Vali virtuaalmasin
net
. paremklõps net-virtuaalmasinal
->Clone
, nimeks näiteks "sinuperekonnanimi-ruuter1";Linked clone
; MAC Address Policy: "Generate new MAC addresses for all network adapters" ->Clone
.
- Vali virtuaalmasin
- Anna igale hostile erinev hostinimi, et masinaid lihtsamini eristada.
- Logi masinasse sisse kasutajana
kasutaja
, paroolisherenow
. - Klaviatuuri asetust saad muuta ajutiselt näiteks käsuga
sudo loadkeys ee
.- Klaviatuuri keele püsivaks muutmiseks saate Ubuntus kasutada järgmist käsku:
sudo dpkg-reconfigure keyboard-configuration
.
- Klaviatuuri keele püsivaks muutmiseks saate Ubuntus kasutada järgmist käsku:
- Muuda failis
/etc/hostname
arvuti nimi ära.
sudo nano /etc/hostname
- Muuda ka failis
/etc/hosts
oma masina DNS-nimi ära, sest igas korralikult konfitud masinas on failis/etc/hosts
oma masina kohta kirje (harilikult päris IP-aadressiga, aga sageli piisab kasvõi sellisest minimaalsest, nagu siin Ubuntus127.0.1.1 ruuter2
– tegu on masinasisese IP-ga)
sudo nano /etc/hosts
- Tee masinale võrguliideste ümberühendamiseks viisakas välja lülitamine ehk halt – vajuta klaviatuuril
parem Ctrl + H
.
- Logi masinasse sisse kasutajana
Võrkude ühendamine
- Tekita endale kaks VirtualBoxi-sisest Host-only võrku:
File -> Tools -> Network Manager-> Create
. Lisa sinna kaks võrku (Linuxi hostisvboxnet0
javboxnet1
, Windowsi hostisVirtualBox Host-Only Ethernet Adapter #2
jaVirtualBox Host-Only Ethernet Adapter #3
). Keela kummalgi seadistustest ära DHCP-server. Selleks valiNetwork
-aknas sakkDHCP server
ning võta linnuke eest valikultEnable DHCP server
. - Seadista
ruuter1
võrguliidesed:- ruuter1
Settings -> Network
- Adapter 1:
enabled
, Attached to:NAT
- Adapter 2:
enabled
, Attached to:Host-only Adapter
, Name:VirtualBox Host-Only Ethernet Adapter #2
(Linuxisvboxnet0
)
- ruuter1
- Seadista
ruuter2
võrguliidesed:- ruuter2
Settings -> Network
- Adapter 1:
enabled
, Attached to:Host-only Adapter
, Name:VirtualBox Host-Only Ethernet Adapter #2
(Linuxisvboxnet0
) - Adapter 2:
enabled
, Attached to:Host-only Adapter
, Name:VirtualBox Host-Only Ethernet Adapter #3
(Linuxisvboxnet1
)
- ruuter2
- Seadista
kliendi
võrguliidesed:- klient
Settings -> Network
- Adapter 1:
enabled
, Attached to:Host-only Adapter
, Name:VirtualBox Host-Only Ethernet Adapter #3
(Linuxisvboxnet1
) - Adapter 2:
disabled
- klient
Võrguaadresside konfigureerimine
Siin jaotises kirjeldame igale Linuxi virtuaalmasina liidesele sobivad IP-aadressid.
- Seadista kõigile masinatele võrgukonfiguratsioon vastavalt allolevale infole.
- Esiteks tapa maha olemasolev vaikimisi DHCP-klient
eth0
-liidesel, et see hiljem probleeme ei tekitaks (NB! allpool olev käsk on vaja käivitada kõigis kolmes virtuaalmasinas:ruuter1
,ruuter2
,klient
):
sudo ifdown eth0
Seadistamise lõpuks peab olema selline seis (seadistamise näited ise on allpool):
- ruuter1 –
eth0
DHCP (vaikimisi),eth1
staatiline192.168.X.1/24
- ruuter2 –
eth0
staatiline192.168.X.2/24
,eth1
staatiline192.168.{X+1}.65/26
- klient –
eth0
staatiline192.168.{X+1}.66/26
,eth1
puudubX on teie matriklinumbri kaks viimast kohta.
- Võrgu aadresside käsitsi seadistamiseks Linuxis redigeeri
/etc/network/interfaces
-faili (enne selle faili muutmist on alati soovitatav võrguliidese draiver enne seisma panna:sudo ifdown eth0
võisudo ifdown eth1
)
sudo ifdown eth0 sudo nano /etc/network/interfaces
Selleks on järgmised vihjed:
- Näide DHCP kasutusest:
auto eth0 iface eth0 inet dhcp
- Näide staatilisest IP-aadressist:
auto eth7 iface eth7 inet static address 10.0.0.1 netmask 255.255.240.0 network 10.0.0.0 broadcast 10.0.15.255
- Asendage loomulikult liidese nimi, aadress ja mask ning arvutage harjutuse mõttes välja ka
network
(võrgu algus) jabroadcast
(hostiosas kõik bitid 1). Sellesse failigateway
lisamine pole vajalik, kuna me tegeleme ruutimisega allpool käsitsi. Arvutatudnetmask
i jabroadcast
i väärtusi võite kontrollida siit.
- Muudatuste aktiveerimiseks tehke iga muudetud liidese kohta järgmist (õige liidesenimega!):
sudo ifdown eth7 sudo ifup eth7
ning vaadake, et ifup vigu ei annaks.
- Tulemusena tekkinud liideste IP-aadresside kontrolliks kasutage
ifconfig -a
või
ip addr l
Testime ühendusi naabritega
- Pingige mõlema naabri ühendused läbi.
- Esiteks pingige
ruuter1
-struuter2
aadressi192.168.X.2
– peab vastama. - Teiseks pingige
ruuter1
-stInternetti
, aadressi8.8.8.8
– peab vastama. - Kolmandaks pingige
ruuter2
-stkliendi
aadressi192.168.{X+1}.66
– peab vastama. - Neljandaks pingige
ruuter2
-stInternetti
, aadressi8.8.8.8
– peab vastama veateategaNetwork is unreachable
. - ** Kontrollige, et
X on teie matriklinumbri kaks viimast kohta
. - Kui Testid 1-3 ei vasta (ehk annavad veateadet
Network is unreachable
), lahendage probleem enne, kui praktikumiga jätkate.
- Esiteks pingige
Häälestame ruuterid pakette edastama
Võib-olla panite tähele, et eelmistes testides Ruuter1
sai juba Internetiga
ühendust, kuid ruuter2
ja klient
ei oska veel Internetti
üles leida. Järgnevalt näitame, kuidas seadistada käsitsi pakettide edasisaatmist sihtkohta ehk ruutimist (ametlik eestikeelne termin on marsruutimine).
- Häälestame ruutingutabelid. Teeme seda lihtsuse mõttes mittepermanentselt.
Ruutingutabeli
vaatamiseks on käsk
ip route
Paneme tähele, et vahetult ühendatud võrkude kohta on ruuting juba automaatselt lisatud.- Ruutingu lisamise käsu kuju on järgmine:
sudo ip route add 10.1.2.0/24 via 1.2.3.4
Seejuures peab1.2.3.4
olema next hop IP address paketi teel ehk järgmine seade, mis on konfigureeritava seadmega vahetult võrguga ühendatud. Ruuteri (1.2.3.4
) maski (/24 vms) pole vaja lisada, sest sihtruuteri näol on alati tegu konkreetse seadmega, mitte võrguga. - Kasutades neid käske, tekitage kõigile kolmele masinale sobivad ruutingutabelid:
- ruuter1 peab teadma, kus on
192.168.{X+1}.64/26
võrk; teist sisevõrku ja Internetti teab ta niigi. - ruuter2 peab teadma, kustkaudu pääseb
Internetti
. Aadressina saab kasutada sõnedefault
reaalse IP ja maski 0.0.0.0/0 asemel. (Mõlemad sisevõrgud on tal niigi teada, kuna need on vahetult ühendatud.) - klient peab teadma, et
Interneti
(kogu mittekohaliku võrguliikluse) jaoks peab ta pakette saatmaruuter2
-le.
sudo ip route add default via 1.2.3.4
- ruuter1 peab teadma, kus on
- Vaikimisi ei edasta laiatarbe-opsüsteemid pakette eri liideste vahel, et mitte võrgus segadust tekitada. Selleks, et Linux hakkaks liideste vahel pakette edastama, tuleb vastavad liidesed seadistada edastama. Meie teeme seda siin lihtsuse mõttes mittepermanentselt (pärast rebooti tuleks uuesti teha).
- Nii
ruuter1
kuiruuter2
mõlemad Ethernet-liidesed häälestage IP-pakette edastama:
sudo -i echo "1" > /proc/sys/net/ipv4/conf/eth0/forwarding echo "1" > /proc/sys/net/ipv4/conf/eth1/forwarding exit
- Nii
- Testime algul
ping
'i jamtr
'i abil (mtr - teenäitaja, "traceroute"):- Pingige kõikidest masinatest kõiki meie poolt konfitud IP-aadresse – peavad toimima.
- Pingige kõikidest masinatest 8.8.8.8 (Google) – peaks pingima ainult
ruuter1
-st, mujalt mitte. - Uurige muudest masinatest
mtr
i abil, kuhu jõuab 8.8.8.8 liiklus – peab jõudmaruuter1
-ni.
-
ruuter2
jaklient
ei pääse välja selle pärast, et sihtmasin ei saada nende IP-aadressidega vastuspakette tagasi ruuter1 poole, kuna need ei ole ruuter1 võrgust. Seega peame häälestamaruuter1
omakorda NAT-ruuteriks, et ta peidaksruuter2
jakliendi
enda IP-aadressi taha ära ning väljastpoolt paistaks kõik võrgupaketid naguruuter1
-st (siis saadab sihtmasin vastusedruuter1
-le tagasi).ruuter1
-s aktiveerigeNAT
(mittepermanentselt):
sudo iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
See tähendab, et pärast ruutinguotsuse tegemist (et pakett väljub eth0 kaudu) rakendame IP maskeraadi ehk lihtsat viisi SNAT-i.- Testige ruuter2 ja kliendi masinatest
mtr 8.8.8.8
Erinevalt varasemast peab see nüüd toimima.
DNSi seadistamine
Eelnevalt seadistasime IP-võrgu, mis suudab edukalt Interneti
(Google'i serveriga) suhelda. Arvutid on numbritega osavad ja eelistavad seega numbreid omavahel suhtluseks ja üksteisele viitamiseks. Inimesed jällegi eelistavad kasutada asjadele viitamiseks nimesid. Selle asemel, et kirjutada aadressiribale 193.40.5.73
, on hulga mugavam kirjutada www.ut.ee. DNSi ülesanne ongi tõlkida inimkujul masinanimed masinloetavateks IP-aadressideks.
- Veenduge, et hetkel meil DNS-nimesid
klient
-virtuaalmasin lahendada ei oska.
ping www.neti.ee
- Lisage DNS-serverite kirjed
klient
-masinasse, selleks sisestage käsksudo ifdown eth0
, avage fail/etc/network/interfaces
ja lisage sinnaeth0
kirjelduse juurde 2 rida (neist gateway rida on selleks, et taastada vaikeruuting selliseks, mida me enne käsitsi tegime):
gateway 192.168.{X+1}.65 dns-nameservers 1.1.1.1
Lubage uuesti eth0
-võrguliides käsuga sudo ifup eth0
.
- Proovige, et
ping www.neti.ee
nüüd töötab:
ping www.neti.ee
ja samuti mtr www.neti.ee
:
mtr www.neti.ee
Praktikumi arvestus
- Praktikumi arvestuse jaoks esitage lahendusena ekraanipilt kliendiarvutist eduka
mtr www.neti.ee
väljundiga. Pildil peavad olema näha IP-aadressid192.168.X.1
ja192.168.X+1.65
, kusX on teie matriklinumbri kaks viimast kohta
.
(Tähtaeg 2 nädalat)
Esitamine
Praktikumi vastused tuleb panna Github/Gitlabi dokumenti nimega praktikum10.md. Kui teil Github või Gitlab lehekülg valmis on, esitage lahendus ka moodles hindamiseks.