This is an old revision of the document!
* 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).
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 2 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_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
(proiectul de laborator este diferit, rl_prj
);TEMA2_
apoi username-ul vostru de Moodle (dacă veți avea nevoie de ajutor din partea unui asistent, să vă găsim ușor);
vmdk
(căutați pe Google documentație, pașii diferă în funcție de programul de virtualizare folosit).student:student
) este activat, deoarece VM-ul rulează pe o rețea privată.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
$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 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 folosiți 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.
Atenție: 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ă)! Nu modificați 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:
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), Router0
(containerul are denumirea R0
) și Router-X
(sub ID-ul R-X
), PC1
, PC2
, PC3
conectate la SW
(switch – nu veți avea nimic de configurat la el) prin 2 VLAN-uri (10
și 20
) și PC-X
(rețea cu R-X
).
Atenție: din motive tehnice, identificatorii echipamentelor Router0
și Router-X
au fost prescurtate la R0
respectiv R-X
. Folosiți denumirile prescurtate DOAR ATUNCI când vă conectați la container (folosind comanda go
sau comenzi docker – dacă va fi cazul), în rest utilizați denumirea full pentru orice altceva (e.g., alias / hosts).
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
și /etc/network/interfaces.d/*
(⇒ 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! # ÎNSĂ: NU RULAȚI `ifdown -a` pe host! VĂ VEȚI PIERDE CONECTIVITATEA PE eth0 !!!
/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!
10.13.$A.0/24
; distribuiți prima subrețea către VLAN10
, iar cealaltă lui VLAN20
; atribuiți prima adresă asignabilă ruterului (Router0
), apoi următoarele în ordinea denumirilor stațiilor (i.e., Router0, PC1, PC3
respectiv Router0, PC2
)! Atenție: pe router aveți deja declarate VLAN-urile în fișierul din /etc/network/interfaces.d/
!host – Router0
și host – Router-X
, subnetați optim spațiul 10.11.$B.0/29
și distribuiți-le în ordinea mențiunii din enunț; host
trebuie să aibă, mereu, prima adresă asignabilă! Router-X – PC-X
: 172.18.$C.64/29
; ruterul va avea prima adresă asignabilă, iar stația PC-X
PE ULTIMA (atenție: nu broadcast!, cea dinaintea acestuia)!SW
(switch), altfel riscați să vă stricați infrastructura!
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!
VLAN10
și VLAN20
(notă: variabila $VLANID
va avea valoarea 10, respectiv 20):2023:E666:$B:$A:$VLANID::/80
.Router0
va avea prima adresă asignabilă, apoi PCn
sortate numeric.Router0
și host
:FEC0:5017:$C:$D::/64
.host
, a doua a lui Router0
.Router-X – PC-X
NU va avea adresă IPv6 ;)host
, Router0
, PC1
, PC2
, PC3
, Router-X
, PC-X
- 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
).
Ah, și nu folosiți cp
, folosiți cat
+ redirectare bash (fiind volum, nu puteți șterge + recrea fișierul, trebuie trunchiat & suprascris), 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 interfaces).
host
și Router0
(după caz, ori unul ori ambele :P), astfel:Router0
la porturile (14000 + $E)
, (14000 + $F)
și (14000 + $G)
să conducă la conectarea ssh pe sistemele PC1
, PC2
respectiv PC3
.host
la portul (6000 + $K)
să conducă la conectarea pe tracker-ul de pe sistemul PC-X
.host
și / sau Router0
(după caz) astfel încât:PC3
în afara rețelei lui să fie blocate (inclusiv către alte rutere!);PC-X
să nu fie permise de la PC1, PC2, PC3
.PC2
, mai puțin protocoalele icmp
și ssh
.PC2
și nici răspunsurile de la acestea! folosiți reguli stateful (i.e. connection tracking)!PC1
, PC2
, PC-X
ș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 host
să ducă către sistemul host
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!
PC-X
scriptul /home/student/scripts/pass
care să caute recursiv prin paginile de la http://host/.secret/
și să găsească fișierul password.txt
(e.g., http://host/.secret/sub/cale/passwords.txt
).corina
RL2023
PC3
, realizați un script la /home/student/scripts/send-music
care va prelua DOAR fișiere care conțin DOAR MAJUSCULE cu extensia .mp3
(i.e. [A-Z]+\.mp3
, litere mici extensia!) din directorul curent (i.e.: $PWD
) și le va uploada pe PC1
, în destinația /home/fs/music
; folosiți credențialele fs:5$4l0m
. NU uitați să-l faceți executabil (+ shebang)!host
, creați script-ul /root/scripts/copy-firmware
care, în primul rând, descarcă DOAR fișierele cu forma [a-zA-Z0-9]+\.bin
(caractere alfa-numerice + extensia .bin
) de pe stația PC-X
din /opt/my-firmware
și le încarcă (uploadează) pe stația PC2
, în directorul /tmp/firmware-files/
(va trebui să-l creați dacă nu există!).ftp
/ wget
/ curl
/ scp
/ rsync
), după caz (recomandăm studierea tuturor înainte de a lua o decizie!)!skipped
)!VLAN10
(cea cu PC1
și PC3
, aka un site întreg) la stația PC-X
(endpoint).10.66.$J.0/28
; asignați prima subrețea către site-ul VLAN10
, iar pe cea de-a doua pentru capetele de tunel (Router0
și PC-X
) – folosiți convențiile de ordinea ale IP-urilor de la primul exercițiu!wg-rl
la ambele capete.10.66.$J.0/28
trebuie trecute prin acest tunel!address
în interfaces
.interfaces
).PC3
va fi pornit un serviciu special pe portul TCP 999
care va accepta DOAR pachete din rețeaua securizată prin wireguard creată la task-ul anterior (checkerul îl va porni automat; pentru testare puteți folosi nc
cu argumentul -l
și IP destinație de pe rețeaua WireGuard (+ desigur, portul), 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 PC3
.PC-X:666
va trebui să fie funcțional din orice rețea (e.g., încercați să vă conectați de pe host
)!666
și să redirecționeze pachetele la PC3
!tcpdump
cu încredere când nu funcționează ceva ;)