Differences

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

Link to this comparison view

rl:teme:tema2 [2024/11/30 11:01]
florin.stancu
rl:teme:tema2 [2024/12/17 18:07] (current)
florin.stancu
Line 2: Line 2:
  
  * **Publicare**:​  * **Publicare**:​
-    * //​**2024-11-30 ​12:00**//+    * //​**2024-11-30 ​13:00**//
  
  * **Termen de predare**:  * **Termen de predare**:
-    * //​**2024-12-14 23:55 - <color red>​deadline HARD!</​color>​ **//+    * //​**2024-12-20 23:55 - <color red>​deadline HARD!</​color>​ **//
  
 <ifauth @rl> <ifauth @rl>
 +**Cine vede ce este mai jos este asistent ;)**
 +</​ifauth>​
 +
 **Revizii: ** **Revizii: **
-    * **//2023-12-yy hh:mm//:** Reparat ceva+    * **//2024-12-06 09:05//:** Lansat t2check ''​v2024.6'':​ fix la task 8 + unele erori erau ascunse :( ; 
 +    * **//​2024-12-05 22:30//:** Lansat t2check ''​v2024.5'':​ fix la task 1 (adresă pe Milano la anumite variabile) și punctajul la task 2; 
 +    * **//​2024-12-05 12:00//:** VM-ul local poate fi acum descărcat (VMware + VirtualBox);​ 
 +    * **//​2024-12-04 21:00//:** Lansat t2check ''​v2024.4'':​ rl-watchdog + dezactivat test rutare la IPv6; 
 +    * **//​2024-12-02 16:30//:** Lansat t2check ''​v2024.3''​ cu erori mai detaliate, mai ales la task-urile 6-8; 
 +    * **//​2024-12-01 22:50//:** Lansat t2check ''​v2024.2'',​ acum merge dat ''​t2check TASK_NR''​ pentru verificare individuală a task-urilor;​ 
 +    * **//​2024-11-30 14:00//:** Câteva clarificări prin enunț (la infra + checker)! 
 +    * **//​2024-11-30 13:00//:** Tema a fost lansată! //God help us//! 
 +<​hidden>​ 
 +    * **//2024-11-yy hh:mm//:** Reparat ceva 
 +</​hidden>​
  
-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).+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).
  
 ==== Notare ==== ==== Notare ====
Line 17: Line 30:
 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. 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ă.+Punctajul maxim care se poate obține pe întreaga temă este 100 de puncte ​(tot ce este peste se trunchiază strict, per temă). 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.+Există **și** exerciții bonus, cu ajutorul cărora puteți obține ​un total de 125 de puncte ​(remember: se trunchiază,​ dar pot fi folosite pentru a completa punctaj parțial la alte task-uri ne-esențiale -- vedeți mai jos).
  
 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). 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).
  
 ==== Mașina virtuală ==== ==== 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).   * 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]].+  * Notă: pe OpenStack, autentificarea cu username și parolă nu este posibilă! Folosiți autentificarea cu chei publice, [[:​rl:​info:​resurse:​vm-laborator|prezentată aici]] ​(ATENȚIE: cheile SSH utilizate la laborator rămân disponibile pe TOATE proiectele, deci aveți setupul deja făcut!).
   * Pentru autentificare pe VM local, utilizați credențialele **student/​student**.   * Pentru autentificare pe VM local, utilizați credențialele **student/​student**.
  
 === Pași pentru accesare OpenStack === === Pași pentru accesare OpenStack ===
  
-  * Urmăriți pașii [[:rl:labs:06|din laboratoare]].+  * Urmăriți pașii [[:isc:info:virtualmachine|de aici]].
   * Link dashboard: https://​cloud.grid.pub.ro/​   * 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''​); +  * Schimbați proiectul din dropdown-ul de stânga-sus al OpenStack, alegeți ''​rl_tema_prj''​ !! 
-  * Nume imagine (de selectat la //​Sources//​):​ **RL Tema2 v2023.0**; +  * Ar trebui să aveți cheia publică deja importată pe ''​rl_tema_prj''​ (verificați!); 
-  * Tip instanță: **m1.small** (NU aveți nevoie de mai mult); +  * Nume imagine (de selectat la //​Sources//​):​ **RL Tema2 v2024.0**; 
-  * 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);+  * Tip instanță: **m1.small** (NU aveți nevoie de mai mult, iar celelalte vor fi șterse fără notificare); 
 +  * Puneți la VM nume cu prefixul ''​TEMA2_'' ​(OBLIGATORIU! Altfel riscați să vă fie ștearsă) ​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).   * **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 ;)   * **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 warning>​**Atenție!** **NU distrugeți instanța mașinii virtuale** până nu ați încărcat arhiva finală pe Moodle ​ș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>​
  
 === Rulare în VM local === === Rulare în VM local ===
  
-  * 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 green>​Imaginea locală este acum disponibilă!</​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. +  ​* Pentru a rula mașina virtuală a temei local, **o puteți descărca [[https://repository.grid.pub.ro/cs/rl/RL_Tema2_2024_LocalVM_cdc15e2d.7z|de la acest URL]]** (//7GB dezarhivat//​). 
-  * 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).+    * Va trebui să vă autentificați cu username + parola contului de la universitate! 
 +  * VM-ul este compatibil atât cu VirtualBox (testat cu 7.1), cât și VMWare (Workstation >= 17). Pe Linux, poate fi rulat și prin qemu+kvm. 
 +  * În arhivă sunt incluse ambele proiecte ce se pot deschide cu aplicația hipervizor ​(''​.vmx'' ​pentru VMware + ''​.vbox''​).
   * Accesul prin ssh cu parolă (''​student:​student''​) este activat, deoarece VM-ul rulează pe o rețea privată.   * 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!+  * **Atenție: Imaginea VM-ului diferă de cea a laboratorului**,​ asigurați-vă că îl folosiți pe cel corect ​(ar trebui să aveți scripturile cu ''​t2*''​)!
  
-==== Verificarea ​temei ====+==== Infrastructură temă ==== 
 + 
 +  * Înainte de a rula checkerul, se recomandă descărcarea ultimului update prin rularea: <​code>​root@host$ t2update</​code>​ 
 + 
 +=== Personalizarea ​temei === 
 + 
 +Rezolvările sunt particularizate pentru fiecare student (pe baza contului Moodle). 
 +Pentru aceasta, rulați pe mașina temei comanda ''​t2start USERNAME_MOODLE''​ cu numele utilizatorului de Moodle ca argument. 
 + 
 +După rulare, datele de particularizare vor fi regăsite în fişierul **''/​root/​assignment.txt''​ de pe host**. **Nu modificați aceste valori**, ele fiind verificate cu strictețe de către checker-ul de pe Moodle! 
 + 
 +Ca și exemplu de pornire: 
 +<​code>​ 
 +# asigurați-vă că aveți actualizat checkerul / infrastructura:​ 
 +t2update 
 +# inițializați-vă VM-ul: 
 +t2start alex.cutarescu1337 
 +# vedeți-vă variabilele:​ 
 +cat /​root/​assignment.txt 
 +</​code>​ 
 + 
 +Informațiile generate anterior vor fi folosite în enunțul temei cu următoarele notații: 
 + 
 +  * ''​$A''​ - valoarea variabilei A 
 +  * ''​$B''​ - valoarea variabilei B 
 +  * ''​$C''​ - valoarea variabilei C 
 +  * ... 
 + 
 +<​note>​ 
 +Datele acestea sunt generate determinist din utilizatorul vostru. Dacă doriți să porniți cu mașina virtuală de la zero, rulând scriptul anterior vă va furniza exact aceleași valori ale variabilelor (cu excepția cazului în care ați greșit numele!). 
 +</​note>​ 
 + 
 +=== Verificare (checker) ​===
  
   * Pentru verificarea temei este disponibil un checker local. Atenție: nu este substitut pentru depanare!   * Pentru verificarea temei este disponibil un checker local. Atenție: nu este substitut pentru depanare!
Line 58: Line 104:
     * 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).     * 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.     * 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.+    * Punctajul afișat ​în arhiva salvată și urcată pe Moodle ​va fi și cel acordat în catalog la final (dacă acesta dat de ultima versiune a checkerului local și DOAR dacă nu s-a constatat că se trișează).
  
   * 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.   * 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>​ 
  
   * Comenzile de mai jos pot fi rulate indiferent de directorul in care ne aflăm.   * 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 actualiza checker-ul ​+ alte elemente de infrastructură: <​code>​t2update</​code>​
   * Pentru a rula checkerul: <​code>​t2check</​code>​   * Pentru a rula checkerul: <​code>​t2check</​code>​
  
Line 80: Line 125:
 </​code>​ </​code>​
  
-  * 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]];+  * Dacă sunt probleme, puteți să postați un mesaj pe thread-ul aferent de pe [[https://​curs.upb.ro/​2024/​mod/​forum/​view.php?​f=8654|forum]];
  
-==== Predarea ​temei ====+=== Predarea ​(upload-ul) soluției ​===
  
   - 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>​)   - 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>​)
   - Rezultatul este o arhivă semnată în directorul în care invocați comanda (''​$PWD''​).   - Rezultatul este o arhivă semnată în directorul în care invocați comanda (''​$PWD''​).
-  - 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ă). +  - 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 ''​JumpHost'' ​(opțiunea ''​-J''​) ​a clientului ''​scp''​ pentru o conexiune directă). 
-  - Încărcați arhiva pe [[https://​curs.upb.ro/​2023/mod/lti/​view.php?​id=85310|RL Checker]] (Moodle).+  - Încărcați arhiva pe [[https://​curs.upb.ro/​2024/mod/assign/​view.php?​id=75143|Assignment Tema 2]] (Moodle).
  
 <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. <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.
Line 100: Line 145:
  
 <note warning> <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).+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 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>​ 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>​
  
 +=== Configurații persistente ===
  
-==== Personalizarea temei ====+<note warning>​ 
 +Toate configurațiile să fie **persistente**. Trebuie să fie active și după repornirea mașinii virtuale.
  
-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]].+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-ngGăsiți mențiuni adecvate la exercițiile unde va fi necesar să faceți asta! 
 +</​note>​
  
-**Atenție:** datele de particularizare afișate pe Moodle vor fi introduse şî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''​!+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.
  
-Informațiile generate anterior vor fi folosite în enunțul temei cu următoarele notații:+Pentru a începe să configurați, verificați fișierele existente la căile ''/​etc/​network/​interfaces*''​ (mai ales ''/​etc/​network/​interfaces.d/​rl.conf''​)  
 +=> [[https://​manpages.debian.org/​bookworm/​ifupdown-ng/​interfaces.5.en.html|RTFM here ;)]].
  
-  ​* ''​$A'' ​- valoarea variabilei ​+Pentru a configura persistent ​**rute adiționale** (și nu numai!), puteți folosi hook-ul ​''​up'' ​din sintaxa de configurare ''​interfaces''​. Exemplu (fragment): <​code>​ 
-  * ''​$B''​ - valoarea variabilei B +iface <​intf>​ 
-  ​* ​''​$C''​ - valoarea variabilei C +    address ​A.B.C.D/xx 
-  * ...+    up ip route add X.Y.Z.T/yy via Q.W.E.R 
 +</​code>​ 
 + 
 +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! 
 + 
 +Puteți folosi următorul oneliner pentru a verifica rapid o interfață:​ <code bash> 
 +ifdown ​--force <​intf>;​ ifup <​intf>;​ ip a sh; ip ro sh 
 +# hint: folosiți ifdown și ifup cu parametrul -a pentru a porni TOATE interfețele declarate! 
 +</​code>​ 
 + 
 +<note warning>​ 
 +NU RULAȚI ''​ifdown -a''​ pe host! VĂ VEȚI PIERDE CONECTIVITATEA PE ''​eth0''​ (deci la mașina virtuală, dacă sunteți pe OpenStack) !!! 
 +</​note>​ 
 + 
 +**Pentru a salva/​restaura regulile ''​iptables''​**,​ urmați pașii de aici: https://​devops.stackexchange.com/​questions/​11991/​how-to-save-and-restore-the-iptables-rule-and-configuration-from-file (pentru ''​iptables-restore'',​ 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>​. 
 + 
 +<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>​
  
 ==== Discuții legate de temă ==== ==== Discuții legate de temă ====
  
-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]].+Toate discuțiile legate de probleme/​întrebări/​exerciții din tema de RL trebuie puse pe [[https://​curs.upb.ro/​2024/​mod/​forum/​view.php?​f=8654|forumul temei]].
 Reguli de utilizare ale acestui forum: Reguli de utilizare ale acestui forum:
  
Line 142: Line 208:
 === Topologie & infrastructură === === Topologie & infrastructură ===
  
-Î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''​).+În topologie aveți ruterele ''​host''​ (fiind VM-ul care găzduiește toată infrastructura),​ ''​Roma''​''​Paris''​ și ''​Milano''​; stațiile ​''​Romulus'' ​și ''​Remus'' ​sunt conectate la ''​Roma'' ​printr-un bridge virtual pe router (în VLAN-urile ​''​VLAN4'' ​respectiv ​''​VLAN5''​ -- porturile sunt deja configurate);​ adițional, ruterul ''​Milano''​ este conectat tot la ''​VLAN5'' ​(deci partajează rețeaua cu ''​Remus''​)''​Leonardo'' ​este la ''​Milano'',​ iar ''​Croissant''​ la ''​Paris''​.
  
-**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).+Pentru a accesa un echipament, folosiți comanda de la laborator: ''​go NUME_ECHIPAMENT'' ​(atenție: numele este case-sensitive!). Dați ''​docker ps'' ​pentru a vedea denumirea containerelor (și eliminați prefixul ​''​mn.'' ​pentru a obține denumirea folosibilă prin ''​go''​).
  
-{{:rl:teme:tema2_topology_2023.png?600}} +{{:rl:teme:tema2_topology_2024.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>​ <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 ​==+=== Ex. 1 [25p] Adresare + rutare IPv4 ===
  
-<​note ​warning+<​note ​tip
-Toate configurațiile să fie **persistente**. Trebuie să fie active și după repornirea mașinii virtuale. +Recomandăm citirea primelor 4 cerințe în întregime înainte de a vă apuca de lucru efectiv! 
- +De asemenea, v-ar fi [extrem de] util să re-citiți TOATE instrucțiunile de mai sus!
-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>​ </​note>​
  
-Pentru configurație persistentăatât host-ulcât și containerele vin cu [[https://​github.com/​ifupdown-ng/​ifupdown-ng|ifupdown-ng]] pre-instalat. +  - Subnetați FIX (i.e.dimensiuni egalemaximizare nrde stații) spațiul ''​10.$A.$B.0/​24''​ și configurați ​cu adrese IPv4 toate legăturile din topologie în ordinea cerută (începând cu PRIMA adresă asignabilă)astfel: 
- +    * prima subrețea alocată va fi ''​VLAN4''​, asignare în ordinea: ​''​Roma'',​ ''​Romulus'';​ 
-Pentru a începe să configurați, ​verificați fișierele existente la căile ''​/​etc/​network/​interfaces'' ​și ''​/​etc/​network/​interfaces.d/​*'' ​ +    ​* ​doua subrețea alocată va fi ''​VLAN5''​asignare în ordinea: ​''​Roma''​''​Milano''​, ''​Remus'';​ 
-(=> [[https://​github.com/​ifupdown-ng/​ifupdown-ng/​blob/​main/​doc/​ADMIN-GUIDE.md|RTFM here ;)]]). +    ​* a treia subrețea alocată va fi cea dintre ​''​Milano''​ și ''​Leonardo'' ​(asignare în această ordine); 
- +    * a patra subrețea alocată va fi cea dintre ​''​Paris'' ​și ''​Croissant'' ​(la felîn această ordine); 
-Pentru ​configura persistent **rute adiționale** (și nu numai!)puteți folosi hook-ul ​''​up'' ​din sintaxa de configurare ​''​interfaces''​. Exemplu (fragment): <​code>​ +  Subnetați OPTIM spațiul ''​172.30.$C.240/​28'' ​+ configurați echipamentele ​(''​host'' ​va avea mereu prima adresă asignabilă) astfel: 
-iface <​intf>​ +    * rețea între ​''​host'' ​și ''​Roma''​; 
-    ​address A.B.C.D/​xx +    * cealaltă (ultima rămasă): ''​host'' ​și ''​Paris''​. 
-    up ip route add X.Y.Z.T/yy via Q.W.E.R +  - Configurați rutarea IPv4 (default GWs și/sau rute statice) astfel încât toate stațiile ​să se poată accesa unele pe altele prin adresă IP!
-</​code>​ +
- +
-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țiiacestea nu vor mai ajunge să fie aplicate! +
- +
-Puteți folosi următorul oneliner pentru a verifica rapid o interfață:​ <​code>​ +
-ifdown ​--force <​intf>;​ ifup <​intf>;​ ip a sh; ip ro sh +
-# hint: folosiți ifdown și ifup cu parametrul -a pentru a porni TOATE interfețele declarate! +
-# ÎNSĂ: NU RULAȚI `ifdown -a` pe host! VĂ VEȚI PIERDE CONECTIVITATEA PE eth0 !!! +
-</​code>​ +
- +
-**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 interfață etc.). <color red>SUB NICI O FORMĂ SĂ NU INSTALAȚI PACHETELE DESCRISE DIN TUTORIALE (mai ales ''​ifupdown'' ​-- vă strică VM-ul, avețdeja ''​ifupdown-ng''​!!)</​color>​. +
- +
-<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>​ +
- +
-=== Ex. 1 [25p] Adresare + rutare IPv4 ===+
  
-  - Configurați cu adrese IPv4 toate legăturile din topologieastfel: +<​note>​Denumirea interfețelor pe Linux este similară ca în toplogia de mai suscu precizarea că sub-interfețele de pe router ce trebuiesc configurate au forma ''​<​intf>​.<​vlan_id>​'' ​(cele cu ''​port-<​X>​'' ​de pe switch sunt doar Layer 2 șpot fi ignorate). NU stricați VLAN ID-urile / redenumiți interfețele bridge-ului!</note>
-    * 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ț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''​ ș''​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!+
  
 <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>​ <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>​
Line 199: Line 239:
 === Ex. 2 [15p] Adresare IPv6 === === Ex. 2 [15p] Adresare IPv6 ===
  
-  - Configurați adrese IPv6 pentru rețeaua ''​VLAN10''​ și ''​VLAN20''​ (notă: variabila ''​$VLANID''​ va avea valoarea ​10, respectiv ​20): +  - Configurați adrese IPv6 pentru rețeaua ''​VLAN4''​ și ''​VLAN5''​ (notă: variabila ''​$VLANID''​ va avea valoarea ​4, respectiv ​5, cu zero-uri în față până la completarea segmentului de 16 biți): 
-    * Folosiți spațiul ''​2023:E666:​$B:​$A:​$VLANID::/​80''​. +    * Folosiți spațiul ''​2024:baba:​$B:​$A:​$VLANID::/​96''​. 
-    * Aceeași ordine de mai sus (ca la IPv4): ''​Router0''​ va avea prima adresă asignabilă,​ apoi ''​PCn''​ sortate numeric+    * Aceeași ordine de asignare ​ca la IPv4. 
-  - Configurați conectivitate IPv6 între ''​Router0''​ și ''​host'':​ +  - Configurați conectivitate IPv6 între ''​Roma''​ și ''​host'':​ 
-    * Folosiți spațiul ''​FEC0:5017:​$C:​$D::/​64''​. +    * Folosiți spațiul ''​fdee:dada:​$C:​$D::/​64''​. 
-    * Prima adresă asignabilă este pentru ''​host'',​ a doua a lui ''​Router0''​.+    * Prima adresă asignabilă este pentru ''​host'',​ a doua a lui ''​Roma''​.
   - Configurați rutarea IPv6 pentru a permite comunicarea între toate sistemele cu adresă IPv6.   - 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 ;)+  - //Atenție//: echipamentele ​''​Leonardo'',​ ''​Paris''​ și ''​Croissant''​ **NU** ​vor avea adresă IPv6!
  
 === Ex. 3 [5p] Hosts === === Ex. 3 [5p] Hosts ===
  
-  * 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.+  * Realizați configurațiile necesare astfel încât echipamentele să poată fi accesate prin numele lor (folosiți numele ''​host'',​ ''​Roma'',​ ''​Milano'',​ ''​Paris'',​ ''​Romulus'',​ ''​Remus'',​ ''​Leonardo''​ și ''​Croissant''​ - atenție la MAJUSCULE!). Adăugați intrări doar pentru adresele IPv4.
  
 <​note>​ <​note>​
 Fișierul ''/​etc/​hosts''​ din containere este mai special (montat ca volum ''​%%--%%bind''​ de către Docker). 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''​). 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''​).  +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.d/rl.conf''​).  
-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>​+Și nu folosiți ''​cp ​-f'' ​(acesta vrea să șteargă fișierul și nu puteți face asta cu un volum montat), folosiți ''​cat''​ + redirectare ​simplă în bash (va trunchia ​suprascrie corect), e.g.: <​code>​
 iface <​intf>​ iface <​intf>​
  up cat /​etc/​hosts.orig >/​etc/​hosts  up cat /​etc/​hosts.orig >/​etc/​hosts
Line 224: Line 264:
 === Ex. 4 [5p] Internet connectivity === === Ex. 4 [5p] Internet connectivity ===
  
-  * Realizați configurațiile necesare pentru ca cele 4 containere ​sa aibă acces la Internet:+  * Realizați configurațiile necesare pentru ca cele 7 echipamente ​sa aibă acces la Internet:
     * Configurați translatarea pe sistemul host astfel încât containerele să poată primi răspunsuri din 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).+    * Configurați ​containerele ​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)!     * **Atenție**:​ nu translatați orice pachet este rutat (e.g., cele între containere ar trebui să-și vadă IP-urile originale)!
  
 <​note>​ <​note>​
 Fișierul ''​resolv.conf''​ este gestionat ca volum de către Docker :( 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).+... 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 ​cat ...''​ din fișierele ​interfaces).
 </​note>​ </​note>​
  
 === Ex. 5 [10p] Network Address Translation === === Ex. 5 [10p] Network Address Translation ===
  
-  * Configurați reguli de **NAT** pe sistemele ''​host''​ și ''​Router0''​ (după caz, ori unul ori ambele :P), astfel: +  * Configurați reguli de **DNAT** pe sistemele ''​Roma''​ și/sau ''​host''​ (după caz), astfel: 
-    * Conexiunile pe ''​Router0''​ la porturile ​ ''​(14000 + $E)'',​ ''​(14000 + $F)''​ și ''​(14000 + $G)''​ să conducă la conectarea ssh pe sistemele ''​PC1'',​ ''​PC2''​ respectiv ''​PC3''​. +    * Conexiunile pe ''​Roma''​ la porturile ​ ''​(24000 + $E)'',​ ''​(24000 + $F)''​ și ''​(24000 + $G)''​ să conducă la conectarea ssh pe sistemele ''​Romulus'',​ ''​Remus''​ respectiv ''​Leonardo''​. 
-    * Conectarea pe ''​host''​ la portul ''​(6000 + $K)''​ să conducă la conectarea pe tracker-ul de pe sistemul ''​PC-X''​. +    * Conectarea pe ''​host''​ la portul ''​(9000 + $K)''​ să conducă la conectarea pe tracker-ul de pe sistemul ''​Milano''​. 
-  * **Sfat**: aveți grijă cum testați: DNAT-ul va funcționa DOAR dacă veniți dintr-o rețea externă ruterului ​;)+  * **Sfat**: aveți grijă cum testați: DNAT-ul va funcționa DOAR dacă veniți dintr-o rețea externă ruterului ​(e.g., ''​host''​ sau ''​Paris''​ vs ''​Roma''​)!
  
 === Ex. 6 [10p] Filtrare pachete (iptables) ​ === === Ex. 6 [10p] Filtrare pachete (iptables) ​ ===
  
-  * Configurați **filtrarea** de pachete pe ''​host'' ​și sau ''​Router0''​ (după caz) astfel încât: +  * Configurați **filtrarea** de pachete pe ''​Roma''​ / ''​Paris''​ / ''​Milano''​ (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 SMTP și Telnet ​inițiate de pe sistemul ''​Remus''​ î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''​. +    * conexiunile către tracker-ul ce rulează pe sistemul ''​Milano''​ **să nu** fie permise de la ''​Croissant''​. 
-    * 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''​. +    * blocați TOATE conexiunile externe (i.e., de pe IP-urile din afara stației) către ''​Leonardo'',​ 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)!+    * **atenție**:​ NU blocați conexiunile inițiate de ''​Leonardo''​ **și nici răspunsurile** de la acestea! folosiți reguli **stateful** (i.e. connection tracking)!
  
 === Ex. 7 [10p] Chei SSH === === 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; +  * Configurați serviciul de **SSH** pe sistemele ''​Romulus'',​ ''​Remus'',​ ''​Leonardo''​ ș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: +  * Folosind [[https://​collectiveidea.com/​blog/​archives/​2011/​02/​04/​how-to-ssh-aliases/​|alias-uri SSH]], configurați ​SSH-ul pe ''​host'' ​pentru a vă putea conecta rapid folosind următoarele comenzi: 
-    * ''​ssh pc1'' ​să ducă către sistemul ''​PC1''​ cu utilizatorul ''​student'';​ +    * ''​ssh ​romu''​ să ducă către sistemul ''​Romulus''​ cu utilizatorul ''​student'';​ 
-    * ''​ssh ​pc2''​ să ducă către sistemul ''​PC2''​ cu utilizatorul ''​student'';​ +    * ''​ssh ​remu''​ să ducă către sistemul ''​Remus''​ cu utilizatorul ''​student'';​ 
-    * ''​ssh ​pc-x''​ să ducă către sistemul ''​PC-X''​ cu utilizatorul ''​student'';​ +    * ''​ssh ​leo''​ să ducă către sistemul ''​Leonardo''​ 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>​
-**Atenție**:​ NU VĂ ȘTERGEȚI CHEIA DE LA OPENSTACK ​DIN FIȘIERUL DE AUTORIZAȚIIVă veți pierde accesul la VM.. asigurați-vă când editați fișierul că nu modificați acea linie!!+**Atenție**:​ NU VĂ ȘTERGEȚI CHEIA AUTORIZATĂ ​DE LA OPENSTACK ​PE HOSTÎn mod normal, nu aveți nevoie să operați pe acest fișier la temă!
 </​note>​ </​note>​
  
-=== Ex. 8 [10p] Căutare recursivă pe server HTTP cu autentificare ​===+=== Ex. 8 [10p] Support ticketing ​===
  
-  * 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''​). +  * Creați, pe sistemul ''​Romulus''​scriptul ''/​home/​student/​scan-support-tickets''​ care să scanane ​și preia de pe serverul de IMAP al ''​Milano'' ​toate mesajele ce conțin ​''​Support Ticket'' ​în subiect și să le trimită înapoi un reply (de pe același server, către mailul sender-ului!) de forma:<​code>​ 
-  * Scriptul va trebui ​să afișeze DOAR conținutul fișierului găsit! +Hi,
-  * Va trebui să vă autentificați prin HTTP cu credențialele+
-    * //​username//:​ ''​corina''​ +
-    * //​password//:​ ''​RL2023''​ +
-  * Desigurtrebuie mai întâi să descoperiți ce tip de autentificare să folosiți!+
  
-=== Ex9 [10p] Descărcare / încărcare fișiere între servere ===+Your ticket named '<​SUBJECT>'​ was registered as #<X>.
  
-    ​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)+Thank you for your patience! 
-    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ă!). +</​code>​ 
-  * Folosi un utilitar aplicabil protocolului ​(dintre ​''​ftp''​ / ''​wget'' ​''​curl'' ​/ ''​scp''​ / ''​rsync''​), după caz (recomandăm studierea tuturor înainte de a lua o decizie!)! +  ​Unde în locul lui ''​<​SUBJECT>​'' ​să fie subiectul inițial, iar la ''​<X>''​ va fi interpolat un cod numeric unic (orice strategie se acceptă, ​e.g., nrcrescător începând cu ''​#1''​)
-  * Î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ă)+    * Mesajul poate fi în orice formăatâta timp cât conține informațiile cerute
-  * **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ă)! +  Scriptul poate fi realizat ​în orice limbaj ​de scripting e instalat ​pe stație, însă va trebui să fie executabil direct ​(e.g., prin shebang). De asemeneascriptul va fi rulat din checker cu working directory necunoscut ​(deci nu vă bazați pe el!). 
-  * 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 ;). +  * Va trebui să vă autentificați pe serverul de mail (atât IMAP cât și SMTP) de pe ''​Milano'' ​cu credențialele:​ 
-  * Checkerul pentru acest task va refuza să ruleze dacă nu există scripturile / nu sunt executabile (va afișa pur și simplu eroarea ''​skipped''​)!+    * //username//: ''​support''​
 +    * //password//: ​''​Pierdut$Cont1337''​ (caracterul dolar face parte din parolă, nu denotă o variabilă);
  
-=== Ex. 10 [Bonus - 10p] Wireguard tunnelling ​===+=== Ex. [10p] Serviciu de sincronizare automată ​===
  
-  * Dorim să conectăm rețeaua ​''​VLAN10''​ (cea cu ''​PC1'' ​și ''​PC3'', ​aka un site întreg) la stația ''​PC-X''​ (endpoint). +  * Pe ''​Remus'',​ realizați un script la ''/​home/​student/​scripts/​auto-backup''​ care să sincronizeze automat fișiere locale către remote, cu următorii parametri:​ 
-    * 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!+    * recursiv, din directorul ​''​/​home/​student/​Documents/​''​ (de pe ''​Remus''​) către serverul+calea ''​Roma:/​var/​remus-backup/''​! 
 +    * a se păstra structura directoarelor,​ începând ​cu rădăcina (e.g., ​''​~/​Documents/​ceva/​test'' ​să ajungă la ''​/​var/​remus-backup/​ceva/​test''​); 
 +    * ignorați (i.e.nu copiați!) fișierele ascunse (cele cu ''​.''​) la sursă sau cele care conțin ''​VIRUS'' ​în denumire; 
 +    * NU aveți voie să modificați ownerul/​permisiunile directorului destinație ​(verificați-le înainte pentru a vedea cum trebuie să ajungă)
 +    * NU aveți parola de autentificare a utilizatorului țintă (defapt, nici nu are), dar tot trebuie să faceți ceva în această privință (i.e., să vă autentificați cu succes!)... 
 +  * Folosi un utilitar eficient! un fișier nou apărut ar trebui să se sincronizeze în max. 3 secunde! 
 +  * Scriptul va trebui să stea pornit până la primirea SIGINT/​SIGKILL. La testare manuală, să îl porniți / opriți manual..
 +    * //​Comportament checker//: dacă checkerul vede că procesul ''​auto-backup''​ este deja pornit, nu va mai face lucrul acesta, însă NU va acorda punctajul (însă va face sincronizarea și verificarea,​ lăsându-vă să depanați scriptul vostru cu stdout/​stderr);​ 
 +    * Dacă folosiți un infinite loop, ar trebui să vă faceți scriptul să iasă la primirea SIGTERM / SIGINT și să nu rămână agățat! 
 +  ​Convenția de apel a scriptului (de către checker) este similară cu cea descrisă în exercițiul anterior. 
 + 
 +=== Ex. 10 [Bonus - 10p] Wireguard tunnel === 
 + 
 +  ​Dorim să conectăm rețelele ''​Milano-Leonardo''​ și ''​Paris-Croissant''​ împreună printr-un tunel Wireguard:​ 
 +    ​Pentru rețeaua din tunel, folosiți ​spațiul ''​10.$H.$J.96/30'';​ prima adresă asignabilă este a lui Milano, iar ce-a de-a doua a lui ''​Paris'';​ 
 +    * Va trebui să puteți accesa adresele IP ale capetelor ​de tunel și de pe ''​Leonardo''​ și ''​Croissant''​!
     * Denumiți interfețele de tunel ''​wg-rl''​ la ambele capete.     * 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''​).     * 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 ===+=== Ex. 11 [Bonus - 15p] Pin your hair === 
 + 
 +  * Pe stația ''​Milano''​ va rula un serviciu securizat pe portul TCP ''​1000+$K''​ care va asculta DOAR pe adresa wireguard creată la task-ul anterior (checkerul îl va porni automat; pentru testare puteți folosi ''​nc''​ cu argumentul ''​-l''​ și IP-ul WireGuard (+ desigur, portul), trebuie să puteți trimite mesaje bidirecționale prin portul forwardat). 
 +  * Configurați DNAT pe ''​Paris''​ astfel încât să poată primi conexiuni pe portul ''​1000+$K''​ și să le forwardeze prin tunelul Wireguard către ''​Milano'',​ același port. 
 +    * Accesul la serviciu prin ''​Paris:​1000+$K''​ va trebui să fie funcțional din orice rețea! 
 +  * **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 ''​1000+$K''​ și să redirecționeze pachetele la ''​Milano''​! 
 +  * //Hint: folosiți ''​tcpdump''​ cu încredere când nu funcționează ceva ;)
  
-  * 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>​ 
rl/teme/tema2.1732957291.txt.gz · Last modified: 2024/11/30 11: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