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

Mașina virtuală

Utilizare

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 RL Checker ș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

Verificarea temei

Predarea temei

  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 ProxyCommand a clientului ssh pentru o conexiune directă).
  4. Încărcați arhiva pe RL Checker (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;

Personalizarea temei

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:

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

Fapt divers: VLAN9 se numește rețeaua de pe OpenStack, dacă rulați local, acolo va fi rețeaua hivervizorului (VMWare / VirtualBox) cu mașina fizică.

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!

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

Pentru a salva regulile iptables, urmați pașii de aici: https://www.serveracademy.com/courses/linux-fundamentals/how-to-save-iptables-rules-permanently/ (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!

Ex. 1 [25p] Adresare + rutare IPv4

  1. Configurați cu adrese IPv4 toate legăturile din topologie, astfel:
    • Subnetați în două rețele fixe (de dimensiuni egale) spațiul 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/!
    • Pentru rețelele 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ă!
    • Pentru rețeaua 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)!
    • Recomandare: nu modificați nimic pe containerul SW (switch), altfel riscați să vă stricați infrastructura!
  2. Configurați rutarea IPv4 (atât default gateways, cât și rute statice!) astfel încât toate stațiile să se poată accesa unele pe altele prin adresă IP!

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 VLAN10 și VLAN20 (notă: variabila $VLANID va avea valoarea 10, respectiv 20):
    • Folosiți spațiul 2023:E666:$B:$A:$VLANID::/80.
    • Aceeași ordine de mai sus (ca la IPv4): Router0 va avea prima adresă asignabilă, apoi PCn sortate numeric.
  2. Configurați conectivitate IPv6 între Router0 și host:
    • Folosiți spațiul FEC0:5017:$C:$D::/64.
    • Prima adresă asignabilă este pentru host, a doua a lui Router0.
  3. Configurați rutarea IPv6 pentru a permite comunicarea între toate sistemele cu adresă IPv6.
    • Rețeaua Router-X – PC-X NU va 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). 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

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 din 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 DE LA OPENSTACK DIN FIȘIERUL DE AUTORIZAȚII! Vă veți pierde accesul la VM.. asigurați-vă când editați fișierul că nu modificați acea linie!!

Ex. 8 [10p] Căutare recursivă pe server HTTP cu autentificare

Ex. 9 [10p] Descărcare / încărcare fișiere între servere

Ex. 10 [Bonus - 10p] Wireguard tunnelling

Ex. 11 [Bonus - 15p] Advanced NAT