* 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 ;)