This shows you the differences between two versions of the page.
rl:teme:tema2 [2023/12/10 23:01] florin.stancu |
rl:teme:tema2 [2023/12/20 09:27] (current) florin.stancu |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Tema 2 - Home Weather Monitoring System ====== | + | ===== Tema 2 ===== |
- | * **Publicare**: | + | * **Publicare**: |
- | * **11 Decembrie 2023** | + | * //**2023-12-07 08:00**// |
- | * **Termen de predare**: | + | * **Termen de predare**: |
- | * <color red>**13 Ianuarie 2024 23:55** - deadline HARD</color> | + | * //**2023-12-22 23:55 - <color red>deadline HARD!</color> **// |
+ | **Revizii: ** | ||
+ | * **//2023-12-18 22:10//:** Actualizat checker, ''v2023.2'': relaxat verificările de la task 2 (acum este nevoie doar de conectivitate IPv6 în cadrul aceleiași rețele -- deci merge și fără rutare)! | ||
+ | * **//2023-12-08 12:15//:** Actualizat checker, ''v2023.1'': acum va face o verificare mai amănunțită -- toate serviciile vor fi repornite când rulați ''%%--%%save''! Re-citiți rubrica de persistență pentru a vedea cum salvați e.g., regulile ''iptables''! | ||
<hidden> | <hidden> | ||
- | * **Changelog:** | + | * **//2023-12-yy hh:mm//:** Reparat ceva |
- | * //**05 Ianuarie 2023 HH:II**// - TODO; | + | |
</hidden> | </hidden> | ||
- | <note> | + | Tema constă în realizarea configurației unui set de exerciții pe o topologie (vedeți mai jos) simulată folosind containere (implementare în ContainerNet + Docker) într-o mașină virtuală (ori în cloud - OpenStack, ori descărcată și rulată local). |
- | **Obiective**: | + | |
- | * construirea unei distribuții Linux minimaliste; | + | |
- | * configurări de bază Linux; | + | |
- | * servicii de sistem Linux; | + | |
- | * dezvoltare aplicații IoT; | + | |
- | * utilizare interfață serială (UART & TTY) pe Linux; | + | |
- | * optimizări de spațiu; | + | |
- | </note> | + | |
- | <note important> | + | ==== Notare ==== |
- | Pentru a rezolva tema, este recomandat să folosiți [[https://github.com/cs-pub-ro/SI-Lab-VM/releases/|mașina virtuală SI 2023]] cu toate uneltele necesare gata instalate! | + | |
+ | Fiecare exercițiu are un punctaj propriu. Nota pe întreaga temă este dată de suma punctajelor acumulate în urma rezolvării fiecărui exercițiu. | ||
+ | |||
+ | Punctajul maxim care se poate obține pe întreaga temă este 100 de puncte. Acest punctaj este echivalent cu **2 puncte** din nota finală. | ||
+ | |||
+ | Există **și** exerciții bonus, cu ajutorul cărora puteți obține 125 de puncte. | ||
+ | |||
+ | Nu este obligatorie rezolvarea tuturor exercițiilor. Exercițiile pot fi rezolvate în orice ordine, mai puțin în situația în care un exercițiu depinde de rezolvarea unui alt exercițiu (de obicei, primele 4 de stabilire a conectivității containere -- Internet). | ||
+ | |||
+ | <ifauth @rl> | ||
+ | **Cine vede ce este mai jos este asistent ;)** | ||
+ | </ifauth> | ||
+ | |||
+ | ==== Mașina virtuală ==== | ||
+ | |||
+ | === Utilizare === | ||
+ | |||
+ | * Puteți rezolva tema ori folosind infrastructura OpenStack (aveți proiect special numit ''rl_tema_prj'' - meniu stânga sus, lângă logo OpenStack - unde găsiți și imaginea), ori o mașină virtuală locală (citiți mai jos). | ||
+ | * Notă: pe OpenStack, autentificarea cu username și parolă nu este posibilă! Folosiți autentificarea cu chei publice, [[:rl:info:resurse:vm-laborator|prezentată aici]]. | ||
+ | * Pentru autentificare pe VM local, utilizați credențialele **student/student**. | ||
+ | |||
+ | === Pași pentru accesare OpenStack === | ||
+ | |||
+ | * Urmăriți pașii [[:rl:labs:06|din laboratoare]]. | ||
+ | * Link dashboard: https://cloud.grid.pub.ro/ | ||
+ | * Va trebui să vă importați cheia publică pe acest proiect nou ''rl_tema_prj'' (proiectul de laborator este diferit, ''rl_prj''); | ||
+ | * Nume imagine (de selectat la //Sources//): **RL Tema2 v2023.0**; | ||
+ | * Tip instanță: **m1.small** (NU aveți nevoie de mai mult); | ||
+ | * Puneți la VM un nume care să vă conține prefixul ''TEMA2_'' apoi username-ul vostru de Moodle (dacă veți avea nevoie de ajutor din partea unui asistent, să vă găsim ușor); | ||
+ | * **OBLIGATORIU:** autentificarea cu user și parolă a fost dezactivată, folosiți EXCLUSIV chei publice ssh (pe care ar trebui s-o aveți deja configurată în cadrul laboratoarelor). | ||
+ | * **NU modificați parola la conturile root / student!** Dacă vă tăiați accesul la VM din greșeală, cereți ajutorul unui asistentului preferat pe Teams ;) | ||
+ | <note warning>**Atenție!** **NU distrugeți instanța mașinii virtuale** până nu ați încărcat arhiva finală pe RL Checker și ați obținut punctajul dorit (și să fiți siguri că nu veți mai avea nevoie să modificați nimic). | ||
</note> | </note> | ||
- | //TODO// | + | === Rulare în VM local === |
- | <ifauth @si> | + | * Pentru a rula mașina virtuală a temei local, **o puteți descărca [[https://rlrullz.root.sx/share/RL_Tema2_v2023_0.7z|de la acest URL]]** (//4.6GB dezarhivat//). |
- | <color red>CINE VEDE RESTUL E ASISTENT ;) </color> | + | * VM-ul este compatibil atât cu VirtualBox (testat cu 6), cât și VMWare (testat cu Workstation >= 16). Pe Linux, poate fi rulat și prin qemu+kvm. |
+ | * Va trebui să vă creați mașină virtuală nouă în hipervizorul preferat (VMWare / VirtualBox / etc.) și să importați fișierul ''vmdk'' (căutați pe Google documentație, pașii diferă în funcție de programul de virtualizare folosit). | ||
+ | * Accesul prin ssh cu parolă (''student:student'') este activat, deoarece VM-ul rulează pe o rețea privată. | ||
+ | * **Atenție: Imaginea VM-ului diferă de cea a laboratorului**, asigurați-vă că îl folosiți pe cel corect! | ||
- | ===== Enunț ===== | + | ==== Verificarea temei ==== |
- | Dorim să realizăm o aplicație IoT care primește date de la câțiva senzori meteo (temperatură, umiditate, ploaie -- datele vor fi emulate) și îi face disponibili pe o interfață web a unui Raspberry PI (de asemenea, emulat în qemu). | + | * Pentru verificarea temei este disponibil un checker local. Atenție: nu este substitut pentru depanare! |
+ | * Altfel spus, contează soluția voastră, nu checker-ul. | ||
+ | * Dacă, dintr-o greșeală, checker-ul dă rezulat pozitiv în cazul unui exercițiu rezolvat greșit nu înseamnă că se va puncta. O eventuală actualizare a checker-ul va puncta corect (însă veți fi notificați să re-verificați pe canalele obișnuite, forum și Teams). | ||
+ | * Obiectivul trebuie să fie rezolvarea corectă a enunțului. Checker-ul vine ca o confirmare (ne dorim cât mai sigură) a acelei rezolvări. | ||
+ | * Punctajul afișat de RL Checker la final va fi și cel acordat în catalog la final. | ||
- | Ca și cerință principală, va trebui să realizați o imagine incorporabilă cu Linux ce va expune pe rețea un server HTTP cu o aplicație web de vizualizare a senzorilor, ce va prelua datele de pe interfață UART (formatul descris mai jos). | + | * Play fair: orice tentativă de fraudare / atac la infrastructură va avea ca efect pierderea definitivă a punctajului (sau chiar repetarea materiei, în anumite cazuri), chiar dacă checkerul este //păcălit// :P. |
+ | * Înainte de a rula checkerul, se recomandă descărcarea ultimului update prin rularea: <code>root@host$ t2update</code> | ||
- | Aveți în imaginea următoare un exemplu de pagină web ce va fi afișată (însă aspectul nu prea contează): | + | * Comenzile de mai jos pot fi rulate indiferent de directorul in care ne aflăm. |
+ | * Pentru a actualiza checker-ul: <code>t2update</code> | ||
+ | * Pentru a rula checkerul: <code>t2check</code> | ||
- | TODO | + | * Exemple de folosire: <code> |
+ | root@host:~# t2check | ||
+ | task01 ......................... 10.0/10.0 | ||
+ | task02 ......................... 10.0/10.0 | ||
+ | task03 ......................... 10.0/10.0 | ||
+ | task04 ......................... 10.0/10.0 | ||
+ | ... | ||
- | ===== Cerințe ===== | + | root@host:~# t2check 10 |
+ | task10 ......................... 0.0/10.0 | ||
+ | mail not received | ||
+ | </code> | ||
- | === Imaginea Linux de bază: === | + | * Dacă sunt probleme, puteți să postați un mesaj pe thread-ul aferent de pe [[https://curs.upb.ro/2023/mod/forum/view.php?id=85311|forum]]; |
- | Pas inițial: realizarea unei imagini de bază de Linux (kernel + rootfs) ce va fi folosită ca punct de plecare / suport pentru programele & serviciile cerute de restul cerințelor: | + | ==== Predarea temei ==== |
- | * Imaginea trebuie construită din componente de la zero: kernel compilat + generat rootfs; | + | - Pentru împachetarea soluției, rulați: <code>root@host$ t2check --save</code> (<color red>atenție: această comandă va reseta rețelistica și reporni toate serviciile, echivalent cu un reboot mai rapid -- asigurați-vă că ați lucrat persistent (//vedeți mai jos, la task-uri, cum//)!</color>) |
- | * **Rootfs**-ul să ocupe cât mai puțin posibil (vedeți mai jos punctajele); se poate folosi orice distribuție & abordare de generat ''rootfs'' (atât printre cele studiate la laborator, cât și celelalte populare în industrie): | + | - Rezultatul este o arhivă semnată în directorul în care invocați comanda (''$PWD''). |
- | * [[https://buildroot.org/|Buildroot]] -- recomandat, puteți obține cele mai reduse dimensiuni! | + | - Folosind utilitarul ''scp'', copiați acest fișier pe stația voastră locală (atenție să nu încurcați directoarele și să copiați o arhivă veche / salvată în altă parte!). Dacă sunteți conectat la OpenStack prin serverul intermediar ''fep.grid.pub.ro'', va trebui să copiați mai întâi acolo, apoi s-o preluați pe stația voastră de lucru (alternativ, puteți folosi funcționalitatea de ''ProxyCommand'' a clientului ''ssh'' pentru o conexiune directă). |
- | * [[https://www.debian.org/|Debian]], prin [[https://ocw.cs.pub.ro/courses/si/laboratoare/08|qemu + debootstrap]] -- nerecomandat (se vor obține dimensiuni destul de mari, ''500MB ~ 1GB'') și nu vor fi ușor depunctate (10%); | + | - Încărcați arhiva pe [[https://curs.upb.ro/2023/mod/lti/view.php?id=85310|RL Checker]] (Moodle). |
- | * [[https://alpinelinux.org/|Alpine Linux]] bootstrapuit folosind [[https://wiki.alpinelinux.org/wiki/Bootstrapping_Alpine_Linux|apk.static]] -- procedură similară cu ''debootstrap'', însă se vor obține imagini mult mai mici (recomandat, însă va trebui [[https://github.com/alpinelinux/alpine-chroot-install|să vă documentați]] bine înainte)! | + | |
- | * [[https://www.yoctoproject.org/|Yocto Linux]] - pentru experți ;) | + | |
- | * **NU se acceptă**: rootfs gata construit / descărcabil (e.g., arhivă cu //favorite distro// de pe site-ul oficial sau third-party); | + | |
- | * Sistemul (rootfs + kernel) să fie compilat pe ''AArch64'' (i.e.: ''arm64'') și să poată fi rulat în ''qemu'' folosind machine type ''raspi3b'' (vedeți mai jos config-uri de kernel testate deja pentru compatibilitate + script de rulare recomandat); | + | |
- | * Imaginea trebuie împachetată într-un fișier disk SD (a cărui dimensiune trebuie să fie o putere a lui 2, cum [[https://interrupt.memfault.com/blog/emulating-raspberry-pi-in-qemu#running-qemu|găsiți precizat prin tutoriale]]) -- alegeți, însă, o dimensiune cât mai mică posibil (e.g., dacă imaginea voastră ocupă ''70MB'', creați imaginea de ''128MB''). | + | |
- | Sistemul trebuie să conțină următoarele configurații de bază (ne ajută pe noi, în special, să automatizăm partea de testare): | + | <note important>Este **obligatoriu** ca rezolvarea exercițiilor să se facă în mod persistent. La o repornire a mașinii virtuale, rezolvările trebuie să rămână active, altfel puteți întâmpina dificultăți la o revenire ulterioară asupra temei. |
- | * utilizator ''root'' cu parola ''tema2'' (obligatoriu: să ne putem autentifica în consola emulată); | + | Folosiți comanda ''reboot'' înainte să testați de-a întregul (checkerul local doar simulează ceva mai rapid). |
- | * hostname-ul ''tema2''; | + | |
- | * să-și preia automat IP-ul folosind DHCP pe prima interfață disponibilă (recomandat: folosiți la rulare parametrul de kernel ''net.ifnames=0'', astfel încât numele primei interfețe să fie ''eth0'' pentru o configurație portabilă); | + | |
- | * să ruleze SSH pe portul 22 (la fel, să fie activată autentificarea cu ''root'' + parolă!); | + | |
- | * să ruleze Avahi mDNS daemon și să răspundă la numele ''tema2.local'' (opțional, dar ne ajută la testare; setupul pe host se face mai dificil, însă pe mașina emulată, însă este suficient să fie compilat/instalat pachetul ''avahi-daemon'' - sau echivalentul în distribuția aleasă - și testa cu ''ping tema2.local''). | + | |
- | Rezolvarea acestei cerințe este OBLIGATORIE pentru obținerea oricărui fel de punctaj (altfel nu avem ce testa => ''0p'')! | + | De asemenea, puteți folosi comanda ''systemctl restart rl-topology'' pentru a reporni rapid toate containerele (sistemul lor de fișiere este și el persistent).</note> |
<note warning> | <note warning> | ||
- | Inb4: veți avea de customizat //rootfs-ul//. După cum va trebui să separați fișierele / codul / scripturile sursă de imaginea binară obținută ca rezultat al procesului de build (care poate fi semi-manual sau complet automatizat -- ce preferați), recomandăm organizarea unui **overlay** -- subdirector al temei unde includeți DOAR fișierele de configurație / surse ce doriți să apară în imaginea finală ce le vor suprascrie pe cele implicite. | + | Pentru a rezolva tema este suficient să prelucrați fișiere doar din căile ''/etc'', ''/home'' și ''/root'' (atât pe host, cât și pe containere). NU instalați alte pachete în plus! |
+ | </note> | ||
- | Pentru rootfs-ul construite prin tehnică de //package-based bootstrapping//, puteți copia ulterior acest overlay folosind ''cp -ar'' sau ''rsync -a''. | + | <note warning> |
- | + | NU opriți / ștergeți manual containerele Docker (decât dacă doriți să luați de la zero cu configurarea acestora, vedeți mai jos comanda). | |
- | Pentru BuildRoot, citiți [[https://buildroot.org/downloads/manual/manual.html#rootfs-custom|recomandările oficiale de customizare]]. | + | |
- | + citiți enunțul până la capăt pentru a vedea cerințele finale! | + | Pentru a **șterge și reseta** configurația de pe un container, se folosiți secvența: <code>systemctl stop rl-topology && docker container rm <nume container> && systemctl restart rl-topology;</code> |
</note> | </note> | ||
- | === HTTP Server / Web UI: === | ||
- | Dorim ca sistemul să expună un server HTTP pe portul 80 o interfață web minimalistă care să prezinte datele de la senzorii primiți prin UART: | + | ==== Personalizarea temei ==== |
- | * Sistemul va trebui să ruleze un server http ce va asculta după cereri HTTP (pe portul 80) pentru controlul luminilor (definite mai jos); | + | Rezolvările sunt particularizate pentru fiecare student (pe baza contului Moodle). Pentru a obține aceste date, accesați link-ul Moodle [[https://curs.upb.ro/2023/mod/lti/view.php?id=85310|RL Checker]]. |
- | * Puteți folosi orice limbaj de programare / scripting / framework pentru a construi acest endpoint; exemple: | + | |
- | * **Python**: [[https://docs.python.org/3/library/http.server.html|http.server]] / [[https://flask.palletsprojects.com|flask]] / [[https://djangoproject.com/|Django]] / etc.; | + | |
- | * **NodeJS**: [[https://nodejs.org/api/http.html|http]] / [[https://expressjs.com/|ExpressJS]] / other 1000s of libraries; | + | |
- | * **PHP** (//+ Apache / Nginx / Lighttpd etc.//): cu sau fără framework (recomandat); | + | |
- | * **Golang**: [[https://pkg.go.dev/net/http|net/http]] (bonus: dimensiuni mici ale aplicațiilor!); | + | |
- | * **Rust**: [[https://docs.rs/http/latest/http/|http]] (built in libraries + dimensiuni ff. mici, la fel ca la GoLang!); | + | |
- | * **C/C++ (for hardcore developers)**: [[https://facil.io/|Facil]] / [[https://github.com/oatpp/oatpp|Oat++]] / etc. -- ''performanță++ && dimensiuni%--%'' ;) | + | |
- | * **//Atenție://** Dacă alegeți să compilați //rootfs// prin Buildroot, veți avea de scris/făcut rost de scripturi de compilare + împachetare atât pentru codul vostru + toate dependințele necesare (e.g., la Python PIP / VirtualEnv, pachete ''npm'' pentru NodeJS etc.)! Se poate, desigur, face cross compiling, însă trebuie folosit compilatorul de la Buildroot (same thing for Yocto)! | + | |
- | <note> | + | **Atenție:** datele de particularizare afișate pe Moodle vor fi introduse şi în fişierul **''/root/assignment.txt'' de pe host**, unde va trebui să păstrați formatul text ''VARIABILA=valoare'' (liniile noi în plus nu contează)! **Nu modificați aceste valori**, ele fiind verificate cu strictețe de către checker-ul online! Includeți ȘI variabila ''USERNAME''! |
- | Serverul trebuie să pornească automat la boot (ca daemon). Majoritatea distribuțiilor folosesc [[https://www.digitalocean.com/community/tutorials/systemd-essentials-working-with-services-units-and-the-journal|systemd]] ca ''init'' și manager de servicii, deci va trebui să creați un astfel de descriptor pentru aplicația web. | + | |
- | În ''BuildRoot'' și ''Yocto'' aveți mai multe opțiuni de init system-uri, la alegere: **Busybox** (cel mai light dintre toate, se scriu scripturi ''sh''), **SysVInit** (aka ''rc.d''/''runlevels'') sau **SystemD** (mai popular și bine documentat, însă trebuie compilat și poate adăuga //~1-2h// în plus la timpul de compilare, depinde de puterea de calcul a sistemului). | + | Informațiile generate anterior vor fi folosite în enunțul temei cu următoarele notații: |
- | </note> | + | |
- | Datele de la senzori le veți prelua de la un alt serviciu, descris în subsecțiune următoare. | + | * ''$A'' - valoarea variabilei A |
- | Dacă nu rezolvați acest task, puteți să prezentați pur și simplu câteva date de test în interfața Web. | + | * ''$B'' - valoarea variabilei B |
+ | * ''$C'' - valoarea variabilei C | ||
+ | * ... | ||
+ | ==== Discuții legate de temă ==== | ||
- | === Sensor data acquisition daemon: === | + | Toate discuțiile legate de probleme/întrebări/exerciții din tema de RL trebuie puse pe [[https://curs.upb.ro/2023/mod/forum/view.php?id=85311|forumul temei]]. |
+ | Reguli de utilizare ale acestui forum: | ||
- | Pe lângă serviciul web, va trebui să dezvoltați un daemon de achiziție a datelor de pe un dispozitiv serial (emulat prin QEmu ca ''usb-serial'', vizibil în guest Linux ca ''/dev/ttyUSB0''); | + | * Nu se pun rezolvări directe pe forum. |
+ | * Fiecare întrebare legată de un task trebuie pusă pe thread-ul dedicat acelui task. | ||
+ | * În momentul în care puneți o întrebare, includeți în mesaj: | ||
+ | * contextul în care a apărut problema pe care o semnalați | ||
+ | * ce ați încercat să faceți pentru a repara problema | ||
+ | * alte informații care pot descrie mai bine problema | ||
+ | * dacă este vorba de rezolvarea unui task, cum ați verificat rezolvarea task-ului | ||
+ | * Verificați dacă cineva nu a mai întâmpinat aceeași problemă și i-a fost oferit un hint sau o soluție (lurk before you leap). | ||
+ | * Post-uri care nu sunt puse pe thread-ul corespunzător vor fi șterse. | ||
+ | * **Nu creați thread-uri noi (off-topic) de discuție! Vor fi șterse.** | ||
- | * Programul va rula într-o buclă de citire de la dispozitiv, parsare și trimitere date către . | + | ==== Subiecte ==== |
- | * La fel ca la serviciul web, puteți folosi orice limbaj / biblioteci de conectare pe dispozitivul serial (chiar și ''bash'' :D ): | + | |
- | * **Python**: [[https://pypi.org/project/pyserial/|pyserial]]; | + | |
- | * **NodeJS**: [[https://www.npmjs.com/package/serialport|serialport]]; | + | |
- | * **PHP**: [[https://www.php.net/manual/en/book.dio.php|DirectIO]]; | + | |
- | * **Golang**: [[https://pkg.go.dev/go.bug.st/serial|goserial]] sau alte biblioteci similare (sunt multe cu același nume); | + | |
- | * **Rust**: [[https://docs.rs/serialport/latest/serialport/|serialport]]; | + | |
- | * **C**: [[https://blog.mbedded.ninja/programming/operating-systems/linux/linux-serial-ports-using-c-cpp/|POSIX + termios]]; | + | |
- | * Puteți face comunicarea între cele 2 procese (de la daemonul de achiziție date seriale la server HTTP) prin orice mecanism vă pune Linux / limbajul la dispoziție (unix pipes, sockeți, RPC framework al limbajului, chiar și sistem de fișiere pentru o implementare rudimentară); | + | |
- | * Acest program trebuie **OBLIGATORIU** să se numească ''iotsensord'' și să pornească automat cu sistemul! | + | |
- | ==== Format date seriale ==== | + | <color green>**Este recomandat să citiți enunțul în întregime prima oară și de oricâte ori aveți întrebări!**</color>. |
+ | Și, desigur, recitirea completă a task-ului următor de care vă apucați / după o pauză îndelungată de la rezolvarea acestuia. | ||
- | Dispozitivul serial emulat va trimite informații codificate în text (ASCII), câte o linie per senzor, un mesaj fiind terminat printr-un caracter simplu ''LF'' (''\n''). | + | === Topologie & infrastructură === |
- | Formatul folosit va fi similar CSV-ului, însă câmpurile vor fi separate prin caracterul '';'', având sintaxa generală: <code> | + | În topologie aveți ruterele ''host'' (fiind VM-ul care găzduiește toată infrastructura), ''Router0'' (containerul are denumirea ''R0'') și ''Router-X'' (sub ID-ul ''R-X''), ''PC1'', ''PC2'', ''PC3'' conectate la ''SW'' (switch -- nu veți avea nimic de configurat la el) prin 2 VLAN-uri (''10'' și ''20'') și ''PC-X'' (rețea cu ''R-X''). |
- | TIMESTAMP; LOCATION; SENSOR_NAME; SENSOR_VALUE; FLAGS (optional) | + | |
+ | **Atenție**: din motive tehnice, identificatorii echipamentelor ''Router0'' și ''Router-X'' au fost prescurtate la ''R0'' respectiv ''R-X''. Folosiți denumirile prescurtate DOAR ATUNCI când vă conectați la container (folosind comanda ''go'' sau comenzi docker -- dacă va fi cazul), în rest utilizați denumirea full pentru orice altceva (e.g., alias / hosts). | ||
+ | |||
+ | {{:rl:teme:tema2_topology_2023.png?600}} | ||
+ | |||
+ | <note> | ||
+ | **Fapt divers:** VLAN9 se numește rețeaua de pe OpenStack, dacă rulați local, acolo va fi rețeaua hivervizorului (VMWare / VirtualBox) cu mașina fizică. | ||
+ | </note> | ||
+ | |||
+ | <note important>Va trebui să realizați **primele 4** exerciții în ordine. Întrucât aceste exerciții oferă, în final, conectivitate la Internet, restul vor depinde de acestea!</note> | ||
+ | |||
+ | == Configurații persistente == | ||
+ | |||
+ | <note warning> | ||
+ | Toate configurațiile să fie **persistente**. Trebuie să fie active și după repornirea mașinii virtuale. | ||
+ | |||
+ | Pentru modificarea unor fișiere speciale din containerele Docker (''/etc/hosts'', ''/etc/resolv.conf'') va trebui să folosiți un script de init sau hook de ifupdown-ng. Găsiți mențiuni adecvate la exercițiile unde va fi necesar să faceți asta! | ||
+ | </note> | ||
+ | |||
+ | Pentru configurație persistentă, atât host-ul, cât și containerele vin cu [[https://github.com/ifupdown-ng/ifupdown-ng|ifupdown-ng]] pre-instalat. | ||
+ | |||
+ | Pentru a începe să configurați, verificați fișierele existente la căile ''/etc/network/interfaces'' și ''/etc/network/interfaces.d/*'' | ||
+ | (=> [[https://github.com/ifupdown-ng/ifupdown-ng/blob/main/doc/ADMIN-GUIDE.md|RTFM here ;)]]). | ||
+ | |||
+ | Pentru a configura persistent **rute adiționale** (și nu numai!), puteți folosi hook-ul ''up'' din sintaxa de configurare ''interfaces''. Exemplu (fragment): <code> | ||
+ | iface <intf> | ||
+ | address A.B.C.D/xx | ||
+ | up ip route add X.Y.Z.T/yy via Q.W.E.R | ||
</code> | </code> | ||
- | Unde: | + | Fișierele ''/etc/network/interfaces*'' se parsează și execută linie cu linie, scripturile ''if[up|down]'' oprindu-se la prima eroare întâlnită. |
+ | De exemplu, dacă aveți într-o secțiune ''iface'' un hook "''up ip ro add invalid route...''" și pe rândurile următoare aveți alte declarații, acestea nu vor mai ajunge să fie aplicate! | ||
- | * ''TIMESTAMP'' este o valoare intreagă, Unix Timestamp, exprimată în secunde de la Unix Epoch (''01.01.1970 00:00''); | + | Puteți folosi următorul oneliner pentru a verifica rapid o interfață: <code> |
- | * ''LOCATION'' va reprezenta locația senzorului și va avea următoarele valori: ''ext'' -- exterior (i.e., afară), ''int'' interior (i.e., în casă); | + | ifdown --force <intf>; ifup <intf>; ip a sh; ip ro sh |
- | * ''SENSOR_NAME'': este denumirea senzorului; vor fi definiți senzorii: ''humidity'' (relative humidity, procentaj), ''temp'' (temperatură, în grade Celsius) și ''rain'' (boolean, ''0 / 1''); | + | # hint: folosiți ifdown și ifup cu parametrul -a pentru a porni TOATE interfețele declarate! |
- | * ''SENSOR_VALUE'': valoarea senzorului; număr întreg, de obicei, însă la valorile de temperatură pot apărea și cu virgulă mobilă (e.g., ''23.5''); **nu apare** nicio unitate de măsură, acestea fiind implicit cele de mai sus; | + | # ÎNSĂ: NU RULAȚI `ifdown -a` pe host! VĂ VEȚI PIERDE CONECTIVITATEA PE eth0 !!! |
- | * ''FLAGS'': câmp opțional (poate să lipsească), poate avea valoarea ''ERROR'' pentru a alerta (din interfața web) faptul că a apărut o eroare la senzorul fizic și datele nu sunt valide (se va citi valoarea ''0'' la câmpul ''VALUE''). | + | </code> |
- | ===== Instrucțiuni pentru rularea imaginii folosind QEmu ===== | + | **Pentru a salva regulile ''iptables''**, urmați pașii de aici: https://www.serveracademy.com/courses/linux-fundamentals/how-to-save-iptables-rules-permanently/ (există mai multe modalități, e.g. puteți pune hook-uri de ''up'' la o interfață etc.). <color red>SUB NICI O FORMĂ SĂ NU INSTALAȚI PACHETELE DESCRISE DIN TUTORIALE (mai ales ''ifupdown'' -- vă strică VM-ul, aveți deja ''ifupdown-ng''!!)</color>. |
- | Ca și punct de pornire, puteți descărca un {{si:teme2023:TODO-skel.tar.gz|schelet inițial cu scripturi + structură recomandată}} (**v0.1**). | + | <note important>Dacă folosiți mai multe fișiere în scripturi (e.g., apelați dintr-un script alt script), folosiți căi absolute. Adică folosiți ''/root/scripts/make-juju.py'' în loc de ''./make-juju.py'' pentru a nu se baza pe directorul actual de lucru (''working directory''). NU uitați să le faceți executabile și să includeți shebang-ul!</note> |
- | Aceasta conține: | + | |
- | * script de testare ''launch-tema2.sh'' pe sistemul gazdă (va rula ''qemu'' cu fișierele kernel+imagine, vedeți mai jos, la conținutul arhivei, ce denumiri folosește); | + | === Ex. 1 [25p] Adresare + rutare IPv4 === |
- | * un script Python ''sensors-emu.py'' ce emulează datele de la senzori, integrat cu ''launch-tema2.sh'' (vedeți cod sursă / help); | + | |
- | Aceste scripturi au fost testate în VM-ul oficial folosit la laborator. | + | - Configurați cu adrese IPv4 toate legăturile din topologie, astfel: |
- | Dacă aveți setup propriu, puteți cere ajutor pe Teams / Forum dacă apar probleme. | + | * Subnetați în două rețele fixe (de dimensiuni egale) spațiul ''10.13.$A.0/24''; distribuiți prima subrețea către ''VLAN10'', iar cealaltă lui ''VLAN20''; atribuiți prima adresă asignabilă ruterului (''Router0''), apoi următoarele în ordinea denumirilor stațiilor (i.e., ''Router0, PC1, PC3'' respectiv ''Router0, PC2'')! **Atenție**: pe router aveți deja declarate VLAN-urile în fișierul din ''/etc/network/interfaces.d/''! |
+ | * Pentru rețelele ''host -- Router0'' și ''host -- Router-X'', subnetați **optim** spațiul ''10.11.$B.0/29'' și distribuiți-le în ordinea mențiunii din enunț; ''host'' trebuie să aibă, mereu, **prima** adresă asignabilă! | ||
+ | * Pentru rețeaua ''Router-X -- PC-X'': ''172.18.$C.64/29''; ruterul va avea prima adresă asignabilă, iar stația ''PC-X'' **PE ULTIMA** (atenție: **nu broadcast!**, cea dinaintea acestuia)! | ||
+ | * //Recomandare:// nu modificați nimic pe containerul ''SW'' (switch), altfel riscați să vă stricați infrastructura! | ||
+ | - Configurați rutarea IPv4 (atât default gateways, cât și rute statice!) astfel încât toate stațiile să se poată accesa unele pe altele prin adresă IP! | ||
- | ===== Trimitere ===== | + | <note warning><color red>**Atenție mare**:</color> adresa IP de pe ''eth0'' a sistemului ''host'' este asignată dinamic de către hipervizor, prin DHCP; NU vă atingeți (//never go full ifdown!//) de această interfață, altfel riscați să vă pierdeți accesul la VM!</note> |
- | Soluția temei va fi trimisă în două moduri (vă rugăm să respectați convențiile de denumire cu exactitate!): | + | === Ex. 2 [15p] Adresare IPv6 === |
- | * **arhivă cu codul sursă** + Readme + hash și alte metainformații (vedeți mai jos) -> [[TODO|pe Moodle]] | + | |
- | * **arhivă cu binarele / imaginea rulabilă** -> le urcați pe [[https://ctipub-my.sharepoint.com|Sharepoint-ul contului Microsoft de student]] și dați share prin Link Public (pe care ni-l trimiteți doar nouă în fișierul ''url.txt''). | + | |
- | **Arhiva cu binarele** (''.tar.*z'' pls; se acceptă ''gz'' și ''xz'') trebuie să conțină (**obligatoriu: să folosiți strict aceste denumiri de fișiere**): | + | - Configurați adrese IPv6 pentru rețeaua ''VLAN10'' și ''VLAN20'' (notă: variabila ''$VLANID'' va avea valoarea 10, respectiv 20): |
- | * ''tema2.img'': imaginea finală (format ''raw''!); poate conține sau nu partiții (dar va trebui să adaptați scriptul de rulare). | + | * Folosiți spațiul ''2023:E666:$B:$A:$VLANID::/80''. |
- | * ''vmlinuz-tema2'': imaginea kernel-ului compatibil cu QEMU; | + | * Aceeași ordine de mai sus (ca la IPv4): ''Router0'' va avea prima adresă asignabilă, apoi ''PCn'' sortate numeric. |
- | * ''launch-tema2.sh'': script de pornire QEMU (vedeți scheletul dat); | + | - Configurați conectivitate IPv6 între ''Router0'' și ''host'': |
- | * includeți și scripturile suplimentare necesare pentru rulare (e.g., simulatorul de senzori în Python); | + | * Folosiți spațiul ''FEC0:5017:$C:$D::/64''. |
- | * **NU INCLUDEȚI**: cache-ul de build al Buildroot / Yocto (poate avea ''6-20 GB''!), DOAR artefactele finale! | + | * Prima adresă asignabilă este pentru ''host'', a doua a lui ''Router0''. |
- | * Această arhivă nu ar trebui să depășească ''500MB'' ([[https://stackoverflow.com/questions/18855850/create-a-tar-xz-in-one-commandfolosiți tar.xz]] pentru rată de compresie bună). | + | - Configurați rutarea IPv6 pentru a permite comunicarea între toate sistemele cu adresă IPv6. |
+ | * Rețeaua ''Router-X -- PC-X'' **NU** va avea adresă IPv6 ;) | ||
- | **Arhiva cu fișierele sursă** (''.zip'' pls) OBLIGATORIU să conțină: | + | === Ex. 3 [5p] Hosts === |
- | * sursele aplicației (în orice limbaje ați ales), scripturi custom folosite pentru build și/sau overlay-ul copiat pe ''rootfs'' (orice ați inclus extra peste sistemul de bază -- de preferat, organizat într-o structură Unix-like: ''./etc/'', ''./usr/bin'', ''./opt/*'' etc.); **NU COPIAȚI ROOTFS-UL GENERAT!** | + | |
- | * fișierele de configurație (''.config'') ale kernel și/sau buildroot -- **obligatoriu** dacă unde e cazul! folosiți numele ''kernel_config'' și ''buildroot_config'' în arhiva cu sursele (în niciun caz nu le lăsați hidden!); | + | * Realizați configurațiile necesare astfel încât echipamentele să poată fi accesate prin numele lor (folosiți numele ''host'', ''Router0'', ''PC1'', ''PC2'', ''PC3'', ''Router-X'', ''PC-X'' - atenție la MAJUSCULE!). Adăugați intrări doar pentru adresele IPv4. |
- | * fișier ''README.txt'' cu explicații referitoare la modul de construire al imaginii, arhitectura soluției, configurații speciale de optimizare folosite etc. | + | |
- | * fișier ''url.txt'' cu URL către arhiva **.tar.*z** a binarelor **PE Sharepoint!**; | + | |
- | * fișier ''checksum.txt'' care să conțină hash-ul SHA256 al arhivei cu binarele (obținut cu ''sha256sum''); **ATENȚIE**: verificați și re-verificați (de încă 2 ori) conținutul fișierului la încărcare pe Moodle cu hash-ul real deoarece tema nu va fi punctată dacă diferă! | + | |
- | * **NU INCLUDEȚI**: fișiere sursă ale Buildroot / Yocto / biblioteci / frameworkuri / VirtualEnv descărcabile de pe Internet (menționați în Readme ce ați folosit); | + | |
- | * **Hint**: pentru a include un fișier la crearea automată a arhivei prin ''make source_archive'', pur și simplu copiați-l pe rădăcină (sau într-un director care nu este ignorat -- verificați Makefile-ul din schelet)! | + | |
- | * Această arhivă nu ar trebui să depășească ''1MB'' (aveți restricție pe Moodle). | + | |
<note> | <note> | ||
- | Folosiți Makefile-ul din scheletul temei pentru generarea acestor două arhive, însă este recomandată verificarea manuală a arhivelor după generare! | + | Fișierul ''/etc/hosts'' din containere este mai special (montat ca volum ''%%--%%bind'' de către Docker). |
+ | Acest lucru face ca orice modificare a acestuia să se piardă la fiecare restart al containerului (aka reboot al VM-ului sau restart al serviciului ''rl-topology''). | ||
+ | Dacă (și sigur) vreți să persiste, puteți să-l salvați în altă cale (e.g., ''/etc/hosts.orig'' și să-l restaurați mereu când pornește containerul printr-un hook de ''up'' în ''/etc/network/interfaces''). | ||
+ | Ah, și nu folosiți ''cp'', folosiți ''cat'' + redirectare bash (fiind volum, nu puteți șterge + recrea fișierul, trebuie trunchiat & suprascris), e.g.: <code> | ||
+ | iface <intf> | ||
+ | up cat /etc/hosts.orig >/etc/hosts | ||
+ | </code> | ||
</note> | </note> | ||
- | <note warning> | + | === Ex. 4 [5p] Internet connectivity === |
- | Nu vor fi punctate temele care nu au hash-ul SHA256 al arhivei încărcat pe Moodle sau cele al căror hash nu corespunde cu arhiva downloadată de pe platforma de hosting la momentul corectării (este folosit și pentru a verifica upload-ul după deadline)! | + | |
+ | * Realizați configurațiile necesare pentru ca cele 4 containere sa aibă acces la Internet: | ||
+ | * Configurați translatarea pe sistemul host astfel încât containerele să poată primi răspunsuri din Internet. | ||
+ | * Configurați cele 4 containere pentru a putea accesa resurse din Internet pe baza numelor de domeniu al acestora (DNS). | ||
+ | * **Atenție**: nu translatați orice pachet este rutat (e.g., cele între containere ar trebui să-și vadă IP-urile originale)! | ||
+ | |||
+ | <note> | ||
+ | Fișierul ''resolv.conf'' este gestionat ca volum de către Docker :( | ||
+ | ... aceeași poveste ca la exercițiul anterior => aceeași soluție (e.g., faceți un fișier ''/etc/resolv.conf.orig'' pe care îl veți suprascrie peste ''/etc/resolv.conf'' cu un hook pe ''up'' din interfaces). | ||
</note> | </note> | ||
- | ===== Notare ===== | + | === Ex. 5 [10p] Network Address Translation === |
- | Din 100p total, aveți: | + | * Configurați reguli de **NAT** pe sistemele ''host'' și ''Router0'' (după caz, ori unul ori ambele :P), astfel: |
- | * (30p) Imaginea și funcționalitățile de bază (trebuie să ruleze în qemu!); | + | * Conexiunile pe ''Router0'' la porturile ''(14000 + $E)'', ''(14000 + $F)'' și ''(14000 + $G)'' să conducă la conectarea ssh pe sistemele ''PC1'', ''PC2'' respectiv ''PC3''. |
- | * ''-10p'' depunctare pentru imagini rootfs ce depășesc 200MB (disk usage al partiției ''ext4''); | + | * Conectarea pe ''host'' la portul ''(6000 + $K)'' să conducă la conectarea pe tracker-ul de pe sistemul ''PC-X''. |
- | * (30p) Serviciul web de prezentare a; | + | * **Sfat**: aveți grijă cum testați: DNAT-ul va funcționa DOAR dacă veniți dintr-o rețea externă ruterului ;) |
- | * (30p) Daemonul care achiziționaează datele pe UART; | + | |
- | * (10p) Readme scris clar și care descrie complet arhitectura și implementarea funcționalităților cerute. | + | |
- | Bonus: | + | === Ex. 6 [10p] Filtrare pachete (iptables) === |
- | * (10p) Aspect / funcționalitate deosebită (e.g., grafice în timp ale datelor, implementări tehnice eficiente etc.); | + | |
- | * (10p) Optimizări deosebite de spațiu ale imaginii finale (cele mai mici 10 imagini primite, însă doar dintre cele care implementează toate task-urile!); | + | * Configurați **filtrarea** de pachete pe ''host'' și / sau ''Router0'' (după caz) astfel încât: |
+ | * conexiunile SMTP și SSH inițiate de pe sistemul ''PC3'' în afara rețelei lui să fie blocate //(inclusiv către alte rutere!)//; | ||
+ | * conexiunile către tracker-ul ce rulează pe sistemul ''PC-X'' **să nu** fie permise de la ''PC1, PC2, PC3''. | ||
+ | * blocați TOATE conexiunile externe (i.e., de pe IP-urile din afara stației) către ''PC2'', mai puțin protocoalele ''icmp'' și ''ssh''. | ||
+ | * **atenție**: NU blocați conexiunile inițiate de ''PC2'' **și nici răspunsurile** de la acestea! folosiți reguli **stateful** (i.e. connection tracking)! | ||
+ | |||
+ | === Ex. 7 [10p] Chei SSH === | ||
+ | |||
+ | * Configurați serviciul de **SSH** pe sistemele ''PC1'', ''PC2'', ''PC-X'' și ''host'' astfel încât autentificarea cu utilizatorul ''student'' de pe oricare sistem să fie permisă pe toate celelate sisteme (tot în cadrul utilizatorului ''student'') folosind chei publice; | ||
+ | * Folosind [[https://collectiveidea.com/blog/archives/2011/02/04/how-to-ssh-aliases/|alias-uri SSH]] să fie folosite comenzi simplificate pentru conectarea prin SSH între sistemele menționate mai sus: | ||
+ | * ''ssh pc1'' să ducă către sistemul ''PC1'' cu utilizatorul ''student''; | ||
+ | * ''ssh pc2'' să ducă către sistemul ''PC2'' cu utilizatorul ''student''; | ||
+ | * ''ssh pc-x'' să ducă către sistemul ''PC-X'' cu utilizatorul ''student''; | ||
+ | * ''ssh host'' să ducă către sistemul ''host'' cu utilizatorul ''student''; | ||
+ | * **Observație**: ''ssh-copy-id'' utilizează autentificare ssh pe bază de parolă pentru a copia cheia. Mașina virtuală pe OpenStack nu permite astfel de autentificare pe ''host'', așadar veți fi nevoiți să autorizați cheia publică manual in fișierul corespunzător! | ||
<note important> | <note important> | ||
- | Imaginile care nu au au fost construite de la zero sau nu rulează deloc (cu excepția unor greșeli minore) nu vor fi punctate! | + | **Atenție**: NU VĂ ȘTERGEȚI CHEIA DE LA OPENSTACK DIN FIȘIERUL DE AUTORIZAȚII! Vă veți pierde accesul la VM.. asigurați-vă când editați fișierul că nu modificați acea linie!! |
</note> | </note> | ||
- | ===== Precizări ===== | + | === Ex. 8 [10p] Căutare recursivă pe server HTTP cu autentificare === |
- | * Tema are deadline **HARD** (nu mai sunt admise soluții după expirare), așadar se recomandă să vă apucați din timp de rezolvarea acesteia! | + | * Creați, pe sistemul ''PC-X'' scriptul ''/home/student/scripts/pass'' care să caute recursiv prin paginile de la ''http://host/.secret/'' și să găsească fișierul ''password.txt'' (e.g., ''http://host/.secret/sub/cale/passwords.txt''). |
- | * :!: **ATENȚIE**: orice formă de plagiat nu va fi permisă și va duce la depunctare totală / restanță + //avertisment oficial la decanat//! | + | * Scriptul va trebui să afișeze DOAR conținutul fișierului găsit! |
- | * Pe Moodle găsiți și [[TODO|un forum]] ;) La fel pe Teams, avem un canal de discuții. | + | * Va trebui să vă autentificați prin HTTP cu credențialele: |
+ | * //username//: ''corina'' | ||
+ | * //password//: ''RL2023'' | ||
+ | * Desigur, trebuie mai întâi să descoperiți ce tip de autentificare să folosiți! | ||
- | ===== Resurse ===== | + | === Ex. 9 [10p] Descărcare / încărcare fișiere între servere === |
- | * [[:si:laboratoare:04]] | + | * Pe ''PC3'', realizați un script la ''/home/student/scripts/send-music'' care va prelua DOAR fișiere care conțin DOAR MAJUSCULE cu extensia ''.mp3'' (i.e. ''[A-Z]+\.mp3'', litere mici extensia!) din directorul curent (i.e.: ''$PWD'') și le va uploada pe ''PC1'', în destinația ''/home/fs/music''; folosiți credențialele ''fs:5$4l0m''. NU uitați să-l faceți executabil (+ shebang)! |
- | * [[:si:laboratoare:06]] | + | * Pe ''host'', creați script-ul ''/root/scripts/copy-firmware'' care, în primul rând, descarcă DOAR fișierele cu forma ''[a-zA-Z0-9]+\.bin'' (caractere alfa-numerice + extensia ''.bin'') de pe stația ''PC-X'' din ''/opt/my-firmware'' și le încarcă (uploadează) pe stația ''PC2'', în directorul ''/tmp/firmware-files/'' (va trebui să-l creați dacă nu există!). |
- | * [[:si:laboratoare:07]] | + | * Folosi un utilitar aplicabil protocolului (dintre ''ftp'' / ''wget'' / ''curl'' / ''scp'' / ''rsync''), după caz (recomandăm studierea tuturor înainte de a lua o decizie!)! |
- | * [[:si:laboratoare:08]] | + | * În toate cazurile, aveți de a face DOAR cu fișiere (i.e., transfer non-recursiv); nu le copiați în alte subdidrectoare (trebuie duse/preluate direct la/în calea menționată), altfel acestea nu vor fi văzute de către checker (+ rezolvare incorectă)! |
- | * [[:si:laboratoare:08]] | + | * **Atenție**: notația folosită în enunț este PCRE (Perl-Compatible Regular Expressions), însă acest format nu este obligatoriu implementat ca pattern de utilitarele folosite! Citiți documentația / man page-ul utilitarului înainte (atenție la glob vs regex -- au diferențe mari de sintaxă)! |
- | * [[https://buildroot.org/downloads/manual/manual.html|Buildroot manual]] | + | * Pentru testare, puteți ori să vă creați fișierele necesare într-un director temporar, ori să lăsați checkerul să facă acest lucru (automat), într-un director _temporar_ (va trebui să-l căutați, though, dar e evident unde îl va pune ;). |
+ | * Checkerul pentru acest task va refuza să ruleze dacă nu există scripturile / nu sunt executabile (va afișa pur și simplu eroarea ''skipped'')! | ||
+ | |||
+ | === Ex. 10 [Bonus - 10p] Wireguard tunnelling === | ||
+ | |||
+ | * Dorim să conectăm rețeaua ''VLAN10'' (cea cu ''PC1'' și ''PC3'', aka un site întreg) la stația ''PC-X'' (endpoint). | ||
+ | * Veți folosi 2 rețele noi: subnetați **OPTIM** spațiul IPv4 ''10.66.$J.0/28''; asignați prima subrețea către site-ul ''VLAN10'', iar pe cea de-a doua pentru capetele de tunel (''Router0'' și ''PC-X'') -- folosiți convențiile de ordinea ale IP-urilor de la primul exercițiu! | ||
+ | * Denumiți interfețele de tunel ''wg-rl'' la ambele capete. | ||
+ | * Pe stațiile vizate, toate pachetele destinate către ''10.66.$J.0/28'' trebuie trecute prin acest tunel! | ||
+ | * **Hint ^**: o interfață Linux poate avea mai multe adrese asignate ;) pur și simplu, adăugați mai multe intrări de tipul ''address'' în ''interfaces''. | ||
+ | * Tunelul wireguard trebuie să fie persistent! (folosiți hook-uri în ''interfaces''). | ||
+ | * //Hint//: nu uitați să activați rutarea la ameble capete de tunel (unul ar trebui să aibă deja, însă celălalt sigur nu)! | ||
+ | |||
+ | === Ex. 11 [Bonus - 15p] Advanced NAT === | ||
+ | |||
+ | * Pe stația ''PC3'' va fi pornit un serviciu special pe portul TCP ''999'' care va accepta DOAR pachete din rețeaua securizată prin wireguard creată la task-ul anterior (checkerul îl va porni automat; pentru testare puteți folosi ''nc'' cu argumentul ''-l'' și IP destinație de pe rețeaua WireGuard (+ desigur, portul), trebuie să puteți trimite mesaje bidirecționale prin portul forwardat). | ||
+ | * Configurați firewallul pe ''PC-X'' (aveți iptables instalat) pentru a realiza DNAT astfel încât conexiunile la ''PC-X'' portul ''666'' să ducă către acest serviciu ce rulează pe ''PC3''. | ||
+ | * Accesul la serviciu prin ''PC-X:666'' va trebui să fie funcțional din orice rețea (e.g., încercați să vă conectați de pe ''host'')! | ||
+ | * **Restricție:** este obligatoriu să folosiți DOAR iptables și/sau rutare (care ar trebui să fie deja configurată la ex. anterior) pentru a rezolva acest exercițiu, e.g., nu e voie să folosiți un serviciu auxiliar care să asculte pe portul ''666'' și să redirecționeze pachetele la ''PC3''! | ||
+ | * //Hint: <color #EEE>unvecva ang</color>// folosiți ''tcpdump'' cu încredere când nu funcționează ceva ;) | ||
- | </ifauth> | ||