Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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 & TTYpe 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 suslâ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ă, umiditateploaie ​-- datele vor fi emulate) ​și îi face disponibili pe o interfață web 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ț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 ​senzorilorce 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 checkerulse 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 josla 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ț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ă activealtfel 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 ș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 ​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 80pentru 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 serviciideci 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 webva trebui ​să dezvoltați un daemon ​de achiziție 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 întrebareincludeț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 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-topicde 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_NAMESENSOR_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 șva avea următoarele valori''​ext'' ​-- exterior (i.e., afară), ''​int''​ interior (i.e., în casă)+ifdown ​--force <​intf>;​ ifup <​intf>;​ ip a ship 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''​);​ +# hintfolosiț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 pornireputeț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ț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);​ +=== Ex1 [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 propriuputeț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 [15pAdresare 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ă (**obligatoriusă 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 ​permite comunicarea între toate sistemele cu adresă IPv6. 
 +    * Rețeaua ''​Router--- PC-X''​ **NU** va avea adresă IPv6 ;)
  
-**Arhiva cu fișierele sursă** (''​.zip''​ pls) OBLIGATORIU să conțină: +=== Ex3 [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 imaginiiarhitectura 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ă persisteputeț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''​. 
-  * (30pServiciul web de prezentare a; +  * **Sfat**: avețgrijă cum testați: DNAT-ul va funcționa DOAR dacă veniți dintr-o rețea externă ruterului ;)
-  * (30pDaemonul care achiziționaează datele ​pe UART; +
-  * (10p) Readme scris clar șcare descrie complet arhitectura șimplementarea ​funcționalităților cerute.+
  
-Bonus: +=== Ex. 6 [10p] Filtrare pachete (iptables) ​ === 
-  * (10pAspect / funcționalitate deosebită (e.g., grafice în timp ale datelorimplementări tehnice eficiente etc.); + 
-  * (10pOptimiză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ă cazastfel î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țipe 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ă ș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ț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 - 10pWireguard 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 noisubnetaț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 - 15pAdvanced 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 exanterior) 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>​ 
  
rl/teme/tema2.1702242070.txt.gz · Last modified: 2023/12/10 23:01 by florin.stancu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0