* Publicare:
* Termen de predare:
Revizii:
v2022.2.0
, ce rezolvă niște mesaje de eroare la ex. 8 și 9; este posibil ca la 8 să nu vă mai dea punctele (și așa și trebuie :P) dacă aveți eroarea cu codul incorect!v2022.2.1
+ modificare enunț (acum se acceptă și fără și cu cifre după minus, la download).v2022.2.0
ce definitivează verificările la taskurile 11-12 + modificări în enunț la task 12 (vedeți notița de la final, plus: portul este TCP v4 nu v6).v2022.1.0
: implementat verificarea ex. 10.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ă 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. Acest punctaj este echivalent cu 1.8 puncte din nota finală.
Există și exerciții bonus, cu ajutorul cărora puteți obține 125 de puncte.
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_tema2_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_tema2_prj
(proiectul de laborator este diferit, rl_prj
);
vmdk
(căutați pe Google documentație, pașii diferă în funcție de programul de virtualizare folosit).vmdk
.root@host$ t2update
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
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ă).
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 recomandă secvența:
systemctl stop rl-topology && docker container rm <nume container> && systemctl restart rl-topology;
Rezolvările sunt particularizate pentru fiecare student (pe baza contului Moodle). Pentru a obține aceste date, accesați link-ul Moodle RL Checker.
Datele de particularizare afișate pe Moodle vor fi introduse şi î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ă)! Atenție: nu puteți personaliza aceste valori, ele fiind verificate cu strictețe de către checker-ul online! Includeți ȘI variabila USERNAME
!
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 CToate discuțiile legate de probleme/întrebări/exerciții din tema de RL trebuie puse pe forumul temei. Reguli de utilizare ale acestui forum:
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. Găsiți mențiuni adecvate la exercițiile unde va fi necesar să faceți asta.
/root/scripts/make-juju.py
în loc de ./make-juju.py
pentru a nu se baza pe directorul actual de lucru (working directory
).
Se recomandă citirea întregului set de exerciții înainte de rezolvarea temei. În mod asemănător, la rezolvarea unui exercițiu se recomandă citirea întregului subset de exerciții.
Router0, PC1, PC2
: 10.11.$A.0/28
, unde Router0
va avea prima adresă asignabilă, apoi PC1
, apoi PC2
(fix în această ordine!); ATENȚIE: pe Router0
aveți bridge-ul declarat în /etc/network/interfaces.d
.host - PC-X
: 172.18.$B.8/29
host - Router0
: 172.18.$B.16/30
host
-ul (PC1
și PC2
îl vor folosi ca intermediar pe Router0
, iar restul containerelor îl vor avea ca ruter implicit pe host
).eth0
a sistemului host
este asignată dinamic de către hipervizor, prin DHCP; NU vă atingeți de această interfață, altfel riscați să vă pierdeți accesul la VM!
up
în /etc/network/interfaces
(RTFM here).
Router0, PC1, PC2
:2022:12:$A:$B::/64
Router0
va avea prima adresă asignabilă, apoi PC1
apoi PC2
.Router0
și host
:FEC0:1234:$B:$D::/64
;host
, a doua a lui Router0
.PC-X
NU are adresă IPv6 ;)
/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 o configurație inet static
cu o comandă ”up ip ro add invalid route…
” și pe rândurile următoare aveți declarații cu ”inet6
”, acestea nu vor mai ajunge să fie aplicate!
Puteți folosi următorul oneliner pentru a verifica rapid o interfață:
ifdown --force <intf>; ifup --force <intf>; ip a sh; ip ro sh;
host
, Router0
, PC1
, PC2
, PC-X
- atenție la MaJuScUlE!). Adăugați intrări de hosts 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
).
RTFM aici ;)
Ah, și nu folosiți cp
, folosiți cat
+ redirectare bash (fiind volum, nu puteți șterge + recrea fișierul, trebuie suprascris)!
resolv.conf
este gestionat de către Docker :(
Aveți aceiași poveste cu Docker ca la exercițiul anterior ⇒ aceiași soluție :D
host
și Router0
(după caz, ori unul ori ambele :P), astfel:Router0
la porturile (21000 + $G)
și (22000 + $H)
să conducă la conectarea ssh pe sistemele PC1
respectiv PC2
.host
la portul (12300 + $K)
să conducă la conectarea pe tracker-ul de pe sistemul PC-X
host
și / sau Router0
(după caz) astfel încât:PC1
să fie blocate (inclusiv către host!);PC-X
să nu fie permise de pe PC2
.PC1/PC2
, mai puțin protocoalele icmp
, ssh
și ftp
.PC1/PC2
sau răspunsurile de la acestea! folosiți reguli stateful;PC*
ș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;ssh pc1
să ducă către sistemul PC1
cu utilizatorul student
;ssh pc2
să ducă către sistemul PC2
cu utilizatorul student
;ssh pc-x
să ducă către sistemul PC-X
cu utilizatorul student
;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!
PC1
scriptul /home/student/scripts/whereswaldo
care să caute recursiv prin paginile de la http://host/.X/
și să găsească fișierul waldo.txt
(e.g., http://host/.X/sub/cale/waldo.txt
).ana
face_ReLe
host
:/root/scripts/file-upload
care uploadează DOAR fișierele de forma this([XYZ])_([0-9]{1,5})\.txt
(text fix this
urmat de unul din caracterele X
, Y
sau Z
, apoi un underscore (_
) urmat de orice număr de 1-5 cifre (va fi între 0-10000
), și, în final, extensia .txt
) din directorul curent la URL-ul către subdirectorul /home/fs/upload
de pe PC1
, autentificarea făcându-se cu parola 3TaLeNt1337
./root/scripts/file-download
care descarcă DOAR fișierele cu forma ([0-9]+)-([a-zA-Z0-9]+)\.tar\.gz
(adică orice număr, urmat de separatorul minus ('-'), un șir format din litere mici/mari (din cauza unui bug: acum se acceptă și cifre), apoi extensia .tar.gz
) de pe stația PC-X
, din directorul /home/student/download-this/
, cu destinația în directorul curent (la momentul rulării scriptului).ftp
/ rsync
/ scp
), dar atenție: trebuie să filtrați cu grijă (și regex :P) fișierele!host
este configurat un server de e-mail (SMTP).PC2
, creați scriptul /root/scripts/ssh-keys-backup
care să trimită un mesaj către contact@host
ce va conține:SSH Keys Backup
ssh-keys.tar.gz
care să conțină un backup făcut pe loc la PC2:/home/student/.ssh/*
;.tar.gz
astfel creat va trebui să păstreze permisiunile originale ale fișierelor!sha256
al atașamentului.
Hint: scriptul nu trebuie să fie obligatoriu în bash, puteți folosi orice interpretor instalat în container ;)
PC2
și PC-X
.wg-rl
pe ambele capete. 10.99.$C.0/24
pentru capetele tunelului (PC-X
va avea a prima adresă IP asignabilă, PC2
pe cea de-a doua).PC2
va fi pornit un serviciu special pe portul TCP 16661
care va asculta DOAR pe capătul de tunel wireguard creat anterior (checkerul îl va porni automat; pentru testare puteți folosi nc
cu argumentul -s
, trebuie să puteți trimite mesaje bidirecționale prin portul forwardat).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 PC2
.PC-X:666
va trebui să fie funcțional din orice rețea (e.g., încercați să vă conectați de pe host
sau Router0
)!iptables
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 PC2
!tcpdump
cu încredere peste tot ;)
CT-X
(necesar pentru ultimul bonus).
⇒ instalați-l manual ;) nu uitați să dați apt update
înainte (containerele au listele de pachete șterse).