* Publicare:
* Termen de predare:
Revizii:
t2check –save pe OpenStack (crăpa conexiunea SSH din cauza cloud-init-ului care, când repornea, repornea automat și serviciul networking chiar dacă era totul OK); ACUM MERGE SAVE-ul (doamne-ajută)!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 1.3 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
post-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 VM-ul denumit host (ce găzduiește toată infrastructura), apoi ruterele containerizate Italy, Romania și Napoli conectate toate la host; stațiile Dani și Ionut sunt conectate printr-un bridge virtual la Italy (în VLAN-ul VLAN10 – porturile sunt deja configurate pe un container-switch special); similar, ruterul Napoli este conectat tot la același bridge în VLAN6; stația Carabinieri este aflată în spatele ruterului Napoli, iar Jilava la Romania. Vedeți în topologie toate numele interfețelor virtuale pe Linux (urmează diferite tipare, e.g., to-* spre alte echipamente, port-* pentru bridge-uri, unele poartă denumiri mai unice).
Pentru a accesa un echipament, folosiți comanda de la laborator: go <Echipament> (atenție: numele este case-sensitive!). Hint: dați docker ps pentru a verifica corectitudinea pornirii VM-ului și a vedea denumirea containerelor (și eliminați prefixul mn. pentru a obține denumirea folosibilă prin go).
66.$A.128.0/18 pentru strict următoarele rețele + necesar adrese asignabile (adresele la rutere și alte echipamente auxiliare sunt deja incluse în calcul):VLAN6: $B echipamente; VLAN10: $C echipamente; Carabinieri: $D echipamente; Jilava: $E echipamente; 10.66.$B.32/28 pentru a obține rețelele dintre ruterele (alocate fix în această ordine):host și Italy;host și Napoli;host și Romania;host va avea mereu prima adresă asignabilă (în rețeaua cu celelalte rutere);VLAN10, ruterul (pe portul trunk al acestuia) va avea prima adresă, apoi Dani pe a doua iar Ionuț pe următoarea (ce-a de-a treia);VLAN6, Italy va deține prima adresă (fiind considerat ruterul master), apoi ce-a de-a doua atribuită lui Napoli;
<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 (deși există un daemon care vi-l restabilește, nu vă bazați că e foolproof)!
VLAN10 și VLAN6 (notă: considerați variabilele $A, $B etc. + $VLANID literal – adică le interpolați direct ca text, i.e. considerându-le ca fiind deja scrise în hexazecimale):2025:B3F3:$B:$A:$VLANID::/112.Italy și host:3F66:ABBA:$C:$D::/96.host, a doua a lui Italy.Carabinieri, Romania și Jilava NU vor avea adresă IPv6!host, Italy, Napoli, Romania, Dani, Ionut, Carabinieri și Jilava - 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 … din configurația interfaces).
telnet de la Dani și Ionut spre Carabinieri;Italy: blocați toate pachetele TCP + UDP pe porturile destinație 6000-7999 (trebuie să blocați atât pachetele destinate, cât și cele ce tranzitează ruterul!);6900 + $C!Jilava, mai puțin protocoalele icmp, ssh și smtp (vor fi necesare la alte exerciții);Jilava și nici răspunsurile serverelor la acestea ⇒ Folosiți reguli stateful (i.e. connection tracking)!Italy și host (după caz), astfel:host la portul (18000 + $H) să conducă la conectarea pe serverul web al sistemului Romania.Italy la portul (8000 + $J) să conducă la conectarea la ssh-ul pe sistemul Ionut, însă DOAR DE LA SISTEMUL Jilava.Carabinieri către trackerele (ascunse) ale stațiilor Dani și Ionut, IP-ul sursă al cererilor să fie ascuns/înlocuit (nu contează ruterul de pe care faceți asta). NU faceți translatare de sursă la alte porturi decât cele vizate (i.e., ale trackerelor)!student de pe echipamentele Dani și Ionut, astfel încât autentificarea acestora pe contul student@Jilava să se facă fără parolă;root@Carabinieri la root@Dani și root@Ionut să se facă cu chei publice, fără parolă!Dani și Ionut, din contul student al fiecăruia, comanda ssh facultate să ducă către student@Jilava;Carabinieri, ca root, ssh dani și ssh ionut să ducă către root@Dani, respectiv root@Ionut;
HOST! În mod normal, nu aveți nevoie să operați pe acest fișier la temă!
Jilava, un script: /root/scripts/request-extradition care, la rulare, trimită către polizia@Napoli câte un email (per rulare) de forma (aproximativă):From: admin@Jilava To: polizia@Napoli Subject: Richiesta di estradizione #<ID> Dear Carabinieri, You are kindly requested to deliver "il famoso interprete" and his brother back to us with the next available flight. We almost finished all preparations for their arrival. Regards, National Penitenciary Administration, Romania
<ID> să fie un număr random unic fiecărei rulări!! (e.g., #61).Dani, faceți un script, /root/scripts/mafia.sh, care citește și apoi șterge toate mailurile de pe sistemul Napoli și trimite reply cu subiectul Extradition request #<ID> blocked (păstrându-se ID-ul original!), iar în corpul mesajului, câte un link random de youtube, e.g.:Napoli, folosiți credențialele:polizia;Eu;nu$d4u$Anapoi! (caracterul dolar face parte din parolă, nu denotă o variabilă, semnul exclamării de la final la fel);/root, dar NU VĂ BAZAȚI PE EL!).Jilava: realizați un script la /home/student/scripts/auto-release-albums.sh care să sincronizeze automat fișiere noi, cu următoarele caracteristici:Jilava: /home/student/Music/;Italy:/var/www/export/!~/Music/mafia/sa_ma_feresc.mp3 să ajungă la /var/www/export/mafia/sa_ma_feresc.mp3 pe Italy);.) sau cele care conțin următoarele substring-uri în denumirea fișierului: garda, politia, cyka, salam (atât variante lower-case, cât și Capitalizate);Italy (http://Italy/export/…), folosiți un client HTTP în consolă pentru a testa lucrul acesta!Dani, Ionut și Romania împreună printr-un tunel Wireguard pentru a securiza comunicarea!10.$G.$H.0/29; ordinea adreselor va fi: Romania (prima), Dani (a 2-a) și Ionut (a treia);wg-rele pe toate containerele!interfaces ← recomandat / serviciu cu pornire automată, e.g., de systemd).Ionut va rula un serviciu securizat pe portul UDP 1800+$J care va asculta DOAR pe adresa wireguard creată la task-ul anterior; pentru testare, aveți un server UDP, live-dedications.py, în PATH (merge pornit sub orice utilizator). Cât despre client… vă descurcați ;)Romania astfel încât să poată primi conexiuni pe același port menționat mai sus, pe care să le forwardeze prin tunelul Wireguard către serviciul ce ascultă pe stația Ionut.Romania:1800+$J va trebui să fie funcțional din orice rețea (inclusiv Carabinieri și Jilava)!Ionut!tcpdump pentru a vedea de ce nu se întorc reply-urile ;))