Table of Contents

Tema 2

* Publicare:

* Termen de predare:

Revizii:

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

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).

Mașina virtuală

Pași pentru accesare OpenStack

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).

Rulare în VM local

Infrastructură temă

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:

# 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:

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!).

Verificare (checker)

Predarea (upload-ul) soluției

  1. Pentru împachetarea soluției, rulați:
    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)!)

  2. Rezultatul este o arhivă semnată în directorul în care invocați comanda ($PWD).
  3. 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ă).
  4. Încărcați arhiva pe Assignment Tema 2 (Moodle).

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.

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).

Pentru a rezolva tema este suficient să prelucrați fișiere doar din căile /etc, /home și /root (atât pe host, cât și pe containere). NU instalați alte pachete în plus!

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:

systemctl stop rl-topology && docker container rm <nume container> && systemctl restart rl-topology;

Configurații persistente

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!

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!

NU RULAȚI 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!!).

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!

Discuții legate de temă

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:

Subiecte

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.

Topologie & infrastructură

Î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).

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!

Ex. 1 [25p] Adresare + rutare IPv4

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!

  1. Subnetați FIX (i.e., dimensiuni egale, maximizare nr. de 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;
    • a doua subrețea alocată va fi VLAN5, asignare în ordinea: Roma, Milano, Remus;
    • 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);
  2. Subnetați OPTIM spațiul 172.30.$C.240/28 + configurați echipamentele (host va avea mereu prima adresă asignabilă) astfel:
    • o rețea între host și Roma;
    • cealaltă (ultima rămasă): host și Paris.
  3. 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!

Denumirea interfețelor pe Linux este similară ca în toplogia de mai sus, cu 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 și pot fi ignorate). NU stricați VLAN ID-urile / redenumiți interfețele bridge-ului!

Atenție mare: 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!

Ex. 2 [15p] Adresare IPv6

  1. 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 2024:baba:$B:$A:$VLANID::/96.
    • Aceeași ordine de asignare ca la IPv4.
  2. Configurați conectivitate IPv6 între Roma și host:
    • Folosiți spațiul fdee:dada:$C:$D::/64.
    • Prima adresă asignabilă este pentru host, a doua a lui Roma.
  3. Configurați rutarea IPv6 pentru a permite comunicarea între toate sistemele cu adresă IPv6.
  4. Atenție: echipamentele Leonardo, Paris și Croissant NU vor avea adresă IPv6!

Ex. 3 [5p] Hosts

Fișierul /etc/hosts din containere este mai special (montat ca volum --bind de către Docker). Acest lucru face ca orice modificare a acestuia să se piardă la fiecare restart al containerului (aka reboot al VM-ului sau restart al serviciului rl-topology). Dacă (și sigur) vreți să persiste, puteți să-l salvați în altă cale (e.g., /etc/hosts.orig și să-l restaurați mereu când pornește containerul printr-un hook de up în /etc/network/interfaces.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

Ex. 4 [5p] Internet connectivity

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 cat … din fișierele interfaces).

Ex. 5 [10p] Network Address Translation

Ex. 6 [10p] Filtrare pachete (iptables)

Ex. 7 [10p] Chei SSH

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ă!

Ex. 8 [10p] Support ticketing

Ex. 9 [10p] Serviciu de sincronizare automată

Ex. 10 [Bonus - 10p] Wireguard tunnel

Ex. 11 [Bonus - 15p] Pin your hair