* Publicare:
* Termen de predare:
Revizii:
v2024.6: fix la task 8 + unele erori erau ascunse :( ;v2024.5: fix la task 1 (adresă pe Milano la anumite variabile) și punctajul la task 2;v2024.4: rl-watchdog + dezactivat test rutare la IPv6;v2024.3 cu erori mai detaliate, mai ales la task-urile 6-8;v2024.2, acum merge dat t2check TASK_NR pentru verificare individuală a task-urilor;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).
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 (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 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).
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).rl_tema_prj !!rl_tema_prj (verificați!);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);
.vmx pentru VMware + .vbox).student:student) este activat, deoarece VM-ul rulează pe o rețea privată.t2*)!root@host$ t2update
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:
# 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
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
t2update
t2check
root@host:~# t2check task01 ......................... 10.0/10.0 task02 ......................... 10.0/10.0 task03 ......................... 10.0/10.0 task04 ......................... 10.0/10.0 ... root@host:~# t2check 10 task10 ......................... 0.0/10.0 mail not received
root@host$ t2check --save
(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)!)
$PWD).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ă).
Folosiți comanda reboot înainte să testați de-a întregul (checkerul local doar simulează ceva mai rapid).
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).
/etc, /home și /root (atât pe host, cât și pe containere). NU instalați alte pachete în plus!
Pentru a șterge și reseta configurația de pe un container, se folosiți secvența:
systemctl stop rl-topology && docker container rm <nume container> && systemctl restart rl-topology;
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!
Pentru configurație persistentă, atât host-ul, cât și containerele vin cu ifupdown-ng pre-instalat.
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)
⇒ 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):
iface <intf>
address A.B.C.D/xx
up ip route add X.Y.Z.T/yy via Q.W.E.R
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ță:
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!
ifdown -a pe host! VĂ VEȚI PIERDE CONECTIVITATEA PE eth0 (deci la mașina virtuală, dacă sunteți pe OpenStack) !!!
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.). SUB NICI O FORMĂ SĂ NU INSTALAȚI PACHETELE DESCRISE DIN TUTORIALE (mai ales ifupdown – vă strică VM-ul, aveți deja ifupdown-ng!!).
/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!
Toate discuțiile legate de probleme/întrebări/exerciții din tema de RL trebuie puse pe forumul temei. Reguli de utilizare ale acestui forum:
Este recomandat să citiți enunțul în întregime prima oară și de oricâte ori aveți întrebări!. Și, desigur, recitirea completă a task-ului următor de care vă apucați / după o pauză îndelungată de la rezolvarea acestuia.
Î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.
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).
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:VLAN4, asignare în ordinea: Roma, Romulus;VLAN5, asignare în ordinea: Roma, Milano, Remus;Milano și Leonardo (asignare în această ordine);Paris și Croissant (la fel, în această ordine);172.30.$C.240/28 + configurați echipamentele (host va avea mereu prima adresă asignabilă) astfel:host și Roma;host și Paris.
<intf>.<vlan_id> (cele cu port-<X> de pe switch sunt doar Layer 2 și pot fi ignorate). NU stricați VLAN ID-urile / redenumiți interfețele bridge-ului!
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!
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):2024:baba:$B:$A:$VLANID::/96.Roma și host:fdee:dada:$C:$D::/64.host, a doua a lui Roma.Leonardo, Paris și Croissant NU vor avea adresă IPv6!host, Roma, Milano, Paris, Romulus, Remus, Leonardo și Croissant - atenție la MAJUSCULE!). Adăugați intrări doar pentru adresele IPv4.
/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.d/rl.conf).
Ș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.:
iface <intf> up cat /etc/hosts.orig >/etc/hosts
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 cat … din fișierele interfaces).
Roma și/sau host (după caz), astfel:Roma la porturile (24000 + $E), (24000 + $F) și (24000 + $G) să conducă la conectarea ssh pe sistemele Romulus, Remus respectiv Leonardo.host la portul (9000 + $K) să conducă la conectarea pe tracker-ul de pe sistemul Milano.host sau Paris vs Roma)!Roma / Paris / Milano (după caz) astfel încât:Remus în afara rețelei lui să fie blocate (inclusiv către alte rutere!);Milano să nu fie permise de la Croissant.Leonardo, mai puțin protocoalele icmp și ssh.Leonardo și nici răspunsurile de la acestea! folosiți reguli stateful (i.e. connection tracking)!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;host pentru a vă putea conecta rapid folosind următoarele comenzi:ssh romu să ducă către sistemul Romulus cu utilizatorul student;ssh remu să ducă către sistemul Remus cu utilizatorul student;ssh leo să ducă către sistemul Leonardo cu utilizatorul student;
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:Hi, Your ticket named '<SUBJECT>' was registered as #<X>. Thank you for your patience!
<SUBJECT> să fie subiectul inițial, iar la <X> va fi interpolat un cod numeric unic (orice strategie se acceptă, e.g., nr. crescător începând cu #1).Milano cu credențialele:support;Pierdut$Cont1337 (caracterul dolar face parte din parolă, nu denotă o variabilă);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:/home/student/Documents/ (de pe Remus) către serverul+calea Roma:/var/remus-backup/!~/Documents/ceva/test să ajungă la /var/remus-backup/ceva/test);.) la sursă sau cele care conțin VIRUS în denumire;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);Milano-Leonardo și Paris-Croissant împreună printr-un tunel Wireguard:10.$H.$J.96/30; prima adresă asignabilă este a lui Milano, iar ce-a de-a doua a lui Paris;Leonardo și Croissant!wg-rl la ambele capete.interfaces).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).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.Paris:1000+$K va trebui să fie funcțional din orice rețea!1000+$K și să redirecționeze pachetele la Milano!tcpdump cu încredere când nu funcționează ceva ;)