diff --git a/chapters/net/browser.rst b/chapters/net/browser.rst index 92a57fb..9f62067 100644 --- a/chapters/net/browser.rst +++ b/chapters/net/browser.rst @@ -1,57 +1,94 @@ -Folosirea eficientă a browser-ului +.. _network_browser: + +Folosirea eficientă a browserului ================================== -1) Scurtături de tastatură --------------------------- +Pentru instrucțiuni despre folosirea scurtăturilor în browser urmăriți secțiunea +:ref:`basic_use_browser`. + +.. _network_browser_adblocker: + +Instalarea şi folosirea unui ad blocker +--------------------------------------- + +Atunci când navigăm pe Internet, găsim foarte multe informații utile, dar și foarte multe reclame. +Recomandăm instalarea unui **ad blocker** [#ad_blocker]_ pentru a filtra reclamele care apar pe paginile web pe care le deschidem. +În această subsecțiune vom instala ad blockerul `AdBlock Plus `_ care vine sub forma unui **plug-in** (*o extensie*) pentru browerul web, care elimină (pe cât posibil) reclamele de pe paginile web pe care le deschidem. +Pentru a instala ad blockerul *AdBlock Plus* urmăm pașii enumerați mai jos, prezenți și în GIF. Acești pași se aplică pentru browserul Mozilla Firefox. + +.. figure:: ./gifs/firefox-install-adblock-plus.gif + :alt: Instalarea AdBlock Plus + +.. _network_browser_adblocker_install: + +Pașii instalării unui ad blocker +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +#. Apăsăm pe meniul browserului din dreapta sus +#. Apăsăm pe butonul *Add-ons* +#. Ne aflăm în secțiunea *Extensions*. + În bara de căutare din partea de sus a ecranului scriem *adblock plus* și apăsăm tasta ``Enter``. + Se deschide un nou tab. +#. Apăsăm pe primul link apărut pe care scrie *AdBlock Plus*. +#. Apăsăm pe butonul *Add to Firefox*. +#. O fereastră de tip pop-up apare și apăsăm pe butonul *Add*. +#. O altă fereastră de tip pop-up apare și apăsăm pe butonul *Okay, Got it*. + +.. _network_browser_bookmarks: + +Folosirea bookmarkurilor +------------------------ + +Atunci când navigăm pe Internet putem să găsim, voluntar sau nu, pagini interesante pe care vrem să le revizităm cândva în viitor. +Ca să nu pierdem aceste pagini, folosim **bookmarkuri**. +În această sub-subsecțiune vom adăuga bookmarkuri noi pentru rețetele cele mai bune de prăjituri găsite pe Internet. +Deschidem din nou browserul Firefox, accesăm pagina **www.google.com** și căutăm *Best cake recipes* ca în imaginea de mai jos: + +.. figure:: ./gifs/firefox-best-cake-recipes.gif + :alt: Căutarea cele mai bune rețete de tort pe Google + +Putem să adăugăm un nou bookmark în mai multe moduri: -.. ditaa:: +* Folosind meniul din dreapta sus al browserului ca în imaginea de mai jos: - +--------+ +-------+ +-------+ - | | --+ ditaa +--> | | - | Text | +-------+ |diagram| - |Document| |!magic!| | | - | {d}| | | | | - +---+----+ +-------+ +-------+ - : = - | Lots of work | - +-------------------------+ +.. figure:: ./gifs/firefox-bookmark-page-long.gif + :alt: Adăugarea unei pagini la Bookmarks folosind meniul browserului -.. figure:: ./img/browser.png - :scale: 45% - :alt: Alternative text + Pașii pentru această variantă sunt: - Firefox browser + #. Click pe butonul meniu (*burger button*) + #. Click pe butonul *Library* + #. Click pe butonul *Bookmarks* + #. Click pe butonul *Bookmark This Page*. + #. Click pe butonul *Done* -.. caution:: Don't use too many tabs +* Apăsând pe butonul în formă de stea din browser din dreapta sus și apăsarea butonului *Done* ca în imaginea de mai jos: - Using too many tabs kills the RAM + .. figure:: ./gifs/firefox-bookmark-page-short.gif + :alt: Adăugarea unei pagini la Bookmarks folosind butonul stea -a. Deschiderea taburilor -^^^^^^^^^^^^^^^^^^^^^^^^^ +* Folosind combinația de taste ``Ctrl+d`` și apăsarea butonului *Done* ca în modurile de mai sus. -Îi punem să deschidă mai multe taburi, iniţial îi lăsăm de capul lor, după le -arătăm Ctrl+t pentru a face taburi noi. +Putem vizualiza toate bookmarkurile pe care le-am creat în mai multe moduri: -b. Modificarea adresei web accesate -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* Folosind meniul din dreapta sus a browserului ca în imaginea de mai jos: -Îi punem să acceseze adrese noi, pentru asta le arătăm Ctrl+l. + .. figure:: ./gifs/firefox-view-bookmarks.gif + :alt: Vizualizarea bookmarkurilor din browser -c. Navigarea taburilor deschise -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* Folosind combinația de taste ``Ctrl+Shift+o``. -Îi punem să navigheze între mai multe taburi şi le arătăm de Alt+cifră; +Exerciții +^^^^^^^^^ -2) Instalarea şi folosirea unui ad blocker ------------------------------------------- +#. Deschideți pagina **youtube.com** într-un tab nou. +#. Căutați primele 3 melodii preferate ale voastre și deschideți-le în taburi noi. +#. Salvați câte un bookmark pentru fiecare melodie. +#. Vizualizați toate bookmarkurile folosind combinația de taste ``Ctrl+Shift+o``. -Îi punem pe un site cu aduri multe şi le arătăm cât de prost merge browserul - şi după îi punem să îşi instaleze un adblocker şi să -vadă diferenţa de performantă +.. rubric:: Notă de subsol -3) Folosirea bookmarkurilor ----------------------------- +.. [#ad_blocker] -Le arătăm cum se adaugă bookmarkuri şi cum se organizează pe directoare şi îi -punem să adauge 3 site-uri într-un director de bookmarkuri, după îi punem să le -acceseze din adress bar + https://en.wikipedia.org/wiki/Ad_blocking + https://www.monetizemore.com/blog/what-is-an-ad-blocker/ diff --git a/chapters/net/connection.rst b/chapters/net/connection.rst new file mode 100644 index 0000000..1557c6b --- /dev/null +++ b/chapters/net/connection.rst @@ -0,0 +1,637 @@ +.. _network_connection: + +Conectarea la rețea și la Internet +================================== + +.. note:: + Pentru a parcurge această secțiune este recomandat să descărcați ultima + versiune a respository-ului laboratorului. Pentru a descărca ultima versiune + a repository-ului rulați comanda ``git pull`` în directorul + ``~/uso-lab/labs/03-user/lab-containers/``. + + Infrastructura laboratorului este bazată pe containere docker ale căror + imagini vor fi generate pe propriul calculator. Dacă nu veți deja instalat + Docker Engine pe sistem, scriptul + ``~/uso-lab/labs/03-user/lab-containers/lab_prepare.sh`` vă va instala aplicația. + + După ce ați terminat de lucrat vă recomandăm să opriți containerele rulând + comanda ``./lab-prepare.sh delete`` în directorul + ``~/uso-lab/labs/03-user/lab-containers/``. + +În cadrul acestei secțiuni vom învăța cum să reparăm problemele de conectivitate +la rețea (sau, informal, rezolvarea problemei "nu-mi merge Internetul"). Pentru +a face asta este necesar să parcurgem toate nivelurile de rețea prin care trec +datele pentru a fi trimise în Internet. În continuare vom prezenta pașii pe care +îi urmăm ca să verificăm funcționalitatea nivelului de rețea și cum putem să îl +configurăm sumar. + +.. _network_connection_phys: + +Interacţiunea cu nivelul fizic +------------------------------ + +Primul nivel cu care noi interacționăm este nivelul fizic. Nivelul fizic este +reprezentat de cablul UTP pentru o rețea cu fir, sau de undele +radio ale unei rețele wireless. Acestea sunt mediul prin care informația este +transferată. + +.. image:: img/utp.png + :align: center + :alt: Cablu UTP + +O altă componentă a nivelului fizic este placa de rețea a sistemului. Aceasta +va trimite mesaje prin mediu de transmisie, fie acesta cablu de cupru, fibră sau +unde radio. + +Majoritatea timpului problemele de conexiune la Internet vin de la faptul că nu +este cablul de Internet conectat la placa de rețea, sau de la faptul că avem +conexiune slabă la rețeaua wireless. + +La nivel fizic, putem verifica conexiunea și funcționalitatea unei plăci de +rețea uitându-ne la ledurile care reprezintă conexiunea la mediul fizic. +Observăm în GIF-ul de mai jos cum arată ledurile unei plăci de rețea funcționale. +Dacă acestea nu sunt aprinse, atunci nu vom avea conectivitate la rețea. + +.. figure:: ./gifs/nic.gif + :alt: Conexiunea la o rețea + +.. _network_connection_phys_show: + +Investigarea nivelului fizic al rețelei +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. note:: + + În general, în Linux fiecare placă de rețea are asociată câte o interfață de + rețea. + +La nivelul sistemului de operare putem verifica dacă o placă de rețea este +activă folosind comanda următoare: + +.. note:: + + Pentru rularea acestui demo rulați în directorul + ``~/uso.git/labs/03-user/lab-containers/`` comanda ``./lab_prepare.sh install fizic``. + Pentru a ne conecta la infrastructura pentru această secțiune vom folosi + comanda ``./lab_prepare.sh connect fizic`` + +.. code-block:: + + root@fizic:~# ip link show + 1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + 99: eth0@if100: mtu 1500 qdisc noqueue state UP mode DEFAULT group default + link/ether 02:42:0a:0a:0a:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0 + 113: eth1@if114: mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default + link/ether 02:42:0b:0b:0b:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0 + 115: eth2@if116: mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default + link/ether 02:42:0c:0c:0c:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0 + + +Starea fiecărei interfețe de rețea este reprezentată pe câte o linie împreună cu +parametrii săi de rulare. Majoritatea informațiilor afișate de comanda de mai +sus nu sunt relevante pentru noi. O opțiune relevantă este valoarea +``state``, urmată de starea interfeței de rețea, care poate să fie ``UP``, +``DOWN`` sau ``UNKNOWN``. + +.. note:: + + Formatul pentru numele interfețelor diferă de la o distribuție la alta. În + cadrul infrastructurii de laborator folosim containere de tip Docker în + cadrul cărora numele interfețelor este de forma ``ethX``, unde X este un + număr. În funcție de distribuția pe care rulăm numele interfețelor poate să + se fie într-un format diferit. + +Observăm că interfața de rețea cu numele ``eth0`` este pornită, deoarece linia +asociată interfeței conține șirul de caractere ``state UP``. În același timp +observăm că interfața de rețea ``eth1`` nu este activă deoarece pe linia sa +observăm șirul de caractere ``state DOWN``. + +Pentru a porni interfața ``eth1`` vom folosi următoarea comandă: + +.. code-block:: + + root@uso:~# ip link set up dev eth1 + +Mereu, după ce rulăm o comandă, trebuie să verificăm că s-a efectuat cu succes, +folosind o metodă de verificare. În cazul de față vom folosi tot comanda ``ip +link show``: + +.. code-block:: + + root@fizic:~# ip link show + 1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + 99: eth0@if100: mtu 1500 qdisc noqueue state UP mode DEFAULT group default + link/ether 02:42:0a:0a:0a:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0 + 113: eth1@if114: mtu 1500 qdisc noqueue state UP mode DEFAULT group default + link/ether 02:42:0b:0b:0b:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0 + 115: eth2@if116: mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default + link/ether 02:42:0c:0c:0c:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0 + + +Exercițiu - Pornirea unei interfețe +""""""""""""""""""""""""""""""""""" + +Porniți interfața de rețea ``eth2``. + + +.. _network_connection_internet: + +Configurarea nivelului Internet +------------------------------- + +.. _network_connection_internet_show: + +Identificarea adresei de Internet +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. note:: + + Pentru rularea acestui demo rulați în directorul + ``~/uso.git/labs/03-user/lab-containers/`` comanda ``./lab_prepare.sh install internet``. + Pentru a ne conecta la infrastructura pentru această secțiune vom folosi + comanda ``./lab_prepare.sh connect internet`` + +Pentru comunicare între două stații din Internet, trebuie ca cele două stații să +fie conectate la Internet. Și apoi cele două stații să se poată adresa una +alteia. Adică fiecare stație are nevoie de un identificator, o adresă. Cum +fiecare casă din lume are o adresă cu care poate fi identificată unic, similar +este necesar pentru un calculator. + +Pentru identificarea stațiilor folosim o adresă numită adresa IP (*Internet +Protocol*). Fiecare interfață de rețea are nevoie de o adresă IP să fie +configurată. + +Pentru a vedea adresele IP configurate pe interfețele de rețea folosim +următoarea comandă: + +.. code-block:: + + root@internet:~# ip address show + 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + inet 127.0.0.1/8 scope host lo + valid_lft forever preferred_lft forever + 195: eth0@if196: mtu 1500 qdisc noqueue state UP group default + link/ether 02:42:0a:0a:0a:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 + inet 10.10.10.2/24 brd 10.10.10.255 scope global eth0 + valid_lft forever preferred_lft forever + 199: eth1@if200: mtu 1500 qdisc noqueue state DOWN group default + link/ether 02:42:0b:0b:0b:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 + 203: eth2@if204: mtu 1500 qdisc noqueue state DOWN group default + link/ether 02:42:0c:0c:0c:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 + + +Există două tipuri de adrese IP (IPv4 și IPv6), dar în cadrul acestui laborator +vom lucra numai cu adrese de tip IPv4. Adresele IP ale interfețelor sunt scrise +pe liniile care conțin ``inet``. Adresele IPv4 sunt de forma ``A.B.C.D``, unde +A, B, C și D sunt numere cu valori între 1 si 255. + +Pentru detalii despre adresele de tip IPv6 folosiți urmăriți această [#ipv6]_ +explicație. + +.. _network_connection_internet_config: + +Configurarea unei adrese IP +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Există două metode pentru configurarea unei adrese IP pe o interfață: + +* configurare statică, prin care noi configurăm manual adresa IP pe interfața de + rețea, implică să cunoaștem din ce rețea face parte interfața + pe care vrem să o configurăm și ce adrese IP sunt libere; + +* configurare dinamică, obținută automat, care nu presupune cunoașterea + informațiilor despre rețea, deoarece acestea vor fi primite automat de pe + rețea. + +Vom insista pe configurarea dinamică, deoarece este mai simplă. În plus, nu avem +cum să aflăm informațiile despre rețea înainte de a configura interfața de +rețea. + +Recapitulare - Pornirea interfețelor de rețea +""""""""""""""""""""""""""""""""""""""""""""" + +Faceți modificările necesare astfel încât interfața ``eth1`` să fie în starea +``UP``. + +Configurarea IP-ului în mod dinamic +""""""""""""""""""""""""""""""""""" + +Pentru a obține o adresă IP în mod dinamic pe o interfață +folosim comanda ``dhclient``: + +.. code-block:: + + root@internet:~# dhclient eth1 + mv: cannot move '/etc/resolv.conf.dhclient-new.35' to '/etc/resolv.conf': Device or resource busy + +.. admonition:: Observație: + + Linia ``mv: cannot move '/etc/resolv.conf.dhclient-new.35' to + '/etc/resolv.conf': Device or resource busy`` apare mereu în containerele + docker atunci când încercăm să obținem o adresă IP folosind comanda + ``dhclient``. Nu este o problemă dacă aceasta apare. + +Mai sus am rulat comanda pentru a obține o adresă IP pentru interfața ``eth1``. + +Comanda ``dhclient`` este bazată pe protocolul DHCP (*Dynamic Host Configuration +Protocol*). Acesta presupune că există un server pe rețea care cunoaște ce IP-uri +sunt folosite pe rețea și care poate să ofere adrese IP calculatoarelor care fac +cereri pe rețea. ``dhclient`` face o cerere de rezervare a unei adrese IP către +serverul DHCP de pe rețea. + +Recapitulare - Afișarea adreselor IP configurate pe interfețele de rețea +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +Afișați adresele IP de pe toate interfețele. + +Observați că am obținut o adresă IP pe interfața ``eth1``. + +Exercițiu - Configurarea dinamică a unei adrese IP +"""""""""""""""""""""""""""""""""""""""""""""""""" + +Configurați adresa IP pe interfața ``eth2``. + +Ștergerea unei configurații de rețea de pe o interfață +"""""""""""""""""""""""""""""""""""""""""""""""""""""" + +Pentru șterge o adresă IP de pe o interfața folosim comanda ``ip address flush`` în felul următor: + +.. code-block:: + + root@internet:~# ip address flush eth1 + root@internet:~# ip address show eth1 + 199: eth1@if200: mtu 1500 qdisc noqueue state UP group default + link/ether 02:42:0b:0b:0b:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 + +.. admonition:: Observație: + + Putem să afișăm configurația unei singure interfețe de rețea + folosind numele interfeței ca parametru pentru comanda ``ip address show`` + +Exercițiu - Ștergerea configurației de rețea +"""""""""""""""""""""""""""""""""""""""""""" + +Ștergeți configurația de rețea de pe interfețele ``eth1`` și ``eth2``. + +.. _network_connection_internet_ping: + +Verificarea conectivității la o altă stație +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. note:: + + Pentru rularea acestui demo, comenzile vor fi rulate în cadrul mașinii + virtuale USO. + +Pentru a verifica conexiunea dintre două stații folosim comanda ``ping``. Această +comandă trimite mesaje către o stație și așteaptă un răspuns de la ea. + +Atunci când testăm conexiunea la internet, vrem să verificăm câteva aspecte, +odată ce am obținut o adresă IP de la serverul DHCP: + +* verificăm dacă putem să ne conectăm la alte calculatoare din aceeași rețea + +* verificăm dacă putem să comunicăm cu stații din afara rețelei + +De exemplu, dacă vrem să verificăm conectivitatea la serverul ``8.8.8.8`` (un +server public din Internet), folosim comanda: + +.. code-block:: + + student@uso:~$ ping -c 4 8.8.8.8 + PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. + 64 bytes from 8.8.8.8: icmp_seq=1 ttl=61 time=23.0 ms + 64 bytes from 8.8.8.8: icmp_seq=2 ttl=61 time=25.7 ms + 64 bytes from 8.8.8.8: icmp_seq=3 ttl=61 time=24.8 ms + 64 bytes from 8.8.8.8: icmp_seq=4 ttl=61 time=25.2 ms + + --- 8.8.8.8 ping statistics --- + 4 packets transmitted, 4 received, 0% packet loss, time 3092ms + rtt min/avg/max/mdev = 23.051/24.731/25.707/1.020 ms + +Comportamentul implicit al comenzii ``ping`` este să trimită pachete la infinit. +Am folosit opțiunea ``-c 4`` în exemplul de mai sus pentru a reduce numărul de +pachete trimise la 4. + +Atunci când nu pot fi trimise mesaje către stația identificată prin adresa IP, +mesajul de eroare va arăta în felul următor: + +.. code-block:: + + student@uso:~$ ping 10.10.10.10 + PING 10.10.10.10 (10.10.10.10) 56(84) bytes of data. + From 10.10.10.3 icmp_seq=1 Destination Host Unreachable + From 10.10.10.3 icmp_seq=2 Destination Host Unreachable + From 10.10.10.3 icmp_seq=3 Destination Host Unreachable + From 10.10.10.3 icmp_seq=4 Destination Host Unreachable + ^C + --- 10.10.10.10 ping statistics --- + 4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3074ms + +Pentru verificarea conectivității în interiorul rețelei trebuie să verificăm că +putem să trimitem mesaje folosind utilitarul ``ping`` unui calculator din rețea. + +În mod implicit comanda ``ping`` trimite mesaje de verificare a conexiunii la +infinit. De data aceasta, în loc să rulăm comanda ``ping`` folosind opțiunea +``-c 4``, am oprit rularea comenzii folosind combinația de taste ``Ctrl+c``. + +O țintă bună de testare pentru trimiterea mesajelor în rețea este (default) +gateway-ul. Un gateway este un dispozitiv de rețea care se ocupă de +interconectarea rețelelor și care primește mesaje de la toate stațiile din +rețea pentru a le trimite în Internet. + +Gateway-ul este configurat static sau dinamic, cum este configurată și adresa IP a unei interfețe. + +Pentru a identifica gateway-ul, folosim comanda ``ip route show`` în felul următor: + +.. code-block:: + + student@uso:~$ ip route show + 10.0.2.0/24 dev enp0s3 proto kernel scope link src 10.0.2.15 metric 100 + 169.254.0.0/16 dev enp0s3 scope link metric 1000 + 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown + 192.168.56.0/24 dev enp0s8 proto kernel scope link src 192.168.56.4 metric 101 + + +Observăm că adresa IP a default gateway-ului este ``10.0.2.2``, deoarece +acesta se află pe linia care conține șirul de caractere ``default``. + +Recapitulare - Afișarea adresei IP configurată pe o interfață +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +Aflați adresa de rețea de pe interfața ``enp0s3``. + +.. admonition:: Observație: + + Adresa IP a gateway-ului și adresa IP a interfeței ``enp0s3`` sunt foarte + similare. Acest lucru se întâmplă deoarece stațiile se află în aceeași + rețea. + +Exercițiu - Verificarea conectivității cu gateway-ul +"""""""""""""""""""""""""""""""""""""""""""""""""""" + +Verificați conexiunea cu gateway-ul folosind comanda ``ping``. + +Pentru verificarea conexiunii la Internet este bine să verificăm cu o adresă +consacrată, care avem încredere că nu va avea probleme tehnice. Un astfel de +exemplu este serverul oferit de Google de la adresa IP ``1.1.1.1``. + +Exercițiu - Verificarea conectivității la Internet +"""""""""""""""""""""""""""""""""""""""""""""""""" + +Verificați conexiunea la serverul ``8.8.8.8`` oferit de Google folosind comanda +``ping``. + +.. _network_connection_internet_dns: + +Investigarea serviciului DNS +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +După cum ați observat, până acum am lucrat numai cu adrese IP, dar noi lucrăm +în viața de zi cu zi cu numele site-urilor, deoarece ne este mai ușor să +reținem nume decât adrese IP. + +Pentru a rezolva această necesitate folosim serviciul DNS. Acesta este oferit de +un server către care noi trimitem cereri de *lookup* pentru o adresa +*hostname* cum ar fi ``www.google.com``. Serverul DNS va răspunde cu adresa IP +asociată cu adresa cerută. + +Ne dorim să avem un serviciu DNS funcțional în permanență pe sistemul pe care lucrăm. + +În mod implicit serviciul DNS este configurat prin DHCP. + +Identificarea serviciului DNS folosit implicit +"""""""""""""""""""""""""""""""""""""""""""""" + +Serviciul DNS poate fi configurat în multe moduri care depind de platforma pe +care o folosim. Pentru mașina virtuala folosită de noi ne putem folosi de +utilitarul ``nmcli`` pentru a identifica serverul DNS folosit. Comanda ``grep`` +identifică din rezultatul unei comenzi doar linia care conține șirul de +caractere ``DNS``. + +.. code-block:: + + student@uso:~$ nmcli dev show | grep DNS + IP4.DNS[1]: 10.0.2.3 + +Conform cu outputul comenzii, serverul DNS către care sunt trimise comenzi este +``10.0.2.3``. + +Efectuarea cererilor DNS +"""""""""""""""""""""""" + +Pentru a verifica funcționalitatea serviciului DNS, putem să facem o cerere DNS +folosind comanda ``host`` în felul următor: + +.. code-block:: + + student@uso:~$ host elf.cs.pub.ro + elf.cs.pub.ro has address 141.85.227.116 + elf.cs.pub.ro mail is handled by 10 elf.cs.pub.ro. + +Rezultatul rulării comenzii ``host`` este o lista cu servicii și adrese care pot +fi identificate prin numele ``elf.cs.pub.ro``. Pe linia care conține șirul de +caractere ``address`` se află adresa IPv4 asociată numelui. Observăm că serverul +``elf.cs.pub.ro`` găzduiește și un server de mail. Acest lucru este evidențiat +de linia care conține parametrul ``mail``. + +Exemplu - Efectuarea cererilor DNS în mod implicit +"""""""""""""""""""""""""""""""""""""""""""""""""" + +Cererile DNS nu trebuie să fie făcute direct de noi atunci când încercăm să +accesăm o resursă din Internet folosind un nume, deoarece aplicațiile fac cereri +în mod implicit. + +.. code-block:: + + student@uso:~$ ping google.com + PING google.com (216.58.214.238) 56(84) bytes of data. + 64 bytes from bud02s24-in-f14.1e100.net (216.58.214.238): icmp_seq=1 ttl=63 time=19.5 ms + 64 bytes from bud02s24-in-f14.1e100.net (216.58.214.238): icmp_seq=2 ttl=63 time=21.6 ms + 64 bytes from bud02s24-in-f14.1e100.net (216.58.214.238): icmp_seq=3 ttl=63 time=21.3 ms + 64 bytes from bud02s24-in-f14.1e100.net (216.58.214.238): icmp_seq=4 ttl=63 time=19.4 ms + ^C + --- google.com ping statistics --- + 4 packets transmitted, 4 received, 0% packet loss, time 3006ms + rtt min/avg/max/mdev = 19.377/20.426/21.588/1.009 ms + +Observați că utilitarul ``ping`` a aflat de unul singur care este adresa IP +asociată numelui ``google.com`` și a făcut cererea în fundal și a verificat +conexiunea cu serverul de la adresa IP ``216.58.214.238``. + +Reconfigurarea temporară a serviciului DNS +"""""""""""""""""""""""""""""""""""""""""" + +În caz că vrem să schimbăm temporar serverul DNS pe care îl folosim trebuie să +modificăm fișierul ``/etc/resolv.conf``. Acest fișier specifică DNS-ul care va +fi folosit pentru cereri pe linia care conține cuvântul nameserver, după cum +puteți vedea mai jos. + +.. code-block:: + + student@uso:~$ cat /etc/resolv.conf + student@uso:~$ cat /etc/resolv.conf + <...> + nameserver 127.0.0.53 + options edns0 + +Dacă schimbăm adresa serverului DNS cu altă adresă, cum ar fi cea a serverului DNS +oferit de Google, putem să vedem o schimbare în răspunsurile de la serverul DNS +pentru unele site-uri. + + +.. code-block:: + + student@uso:~$ host google.com + google.com has address 172.217.20.14 + google.com has IPv6 address 2a00:1450:400d:803::200e + <...> + student@uso:~$ cat /etc/resolv.conf + nameserver 8.8.8.8 + options edns0 + student@uso:~$ host google.com + google.com has address 172.217.18.78 + google.com has IPv6 address 2a00:1450:400d:809::200e + <...> + +.. admonition:: Atenție: + + Acestea sunt modificări temporare folosite pentru depanarea problemelor cu + serviciul DNS. + +Exercițiu - Schimbarea serverului DNS folosit +""""""""""""""""""""""""""""""""""""""""""""" + +* Realizați modificările necesare astfel încât cererile de tip DNS să fie trimise + către serverul de DNS oferit de CloudFlare de la adresa ``1.1.1.1``; + +* Afișați cu ce adresă răspunde noul server DNS pentru numele ``google.com``. + +.. _network_connection_transport: + +Configurarea nivelului Transport +-------------------------------- + +Atunci când folosim Internetul, ce facem de fapt este că ne conectăm la +aplicații care rulează pe servere în Internet și noi pornim la rândul nostru +aplicații pe calculatorul nostru care așteaptă conexiuni din Internet. + +Pentru a distinge aplicațiile și destinația mesajelor, folosim conceptul de +porturi. Astfel, fiecare aplicație deschide un port pentru a comunica cu exteriorul. + +Portul este o adresă locală unei stații. Dacă adresa IP identifică stația, +portul identifică aplicația de rețea de pe stație. Astfel putem avea mai multe +aplicații rețea pe o stație. + +Există două tipuri de porturi care pot fi deschise, în funcție de protocolul folosit: + +* porturi TCP (*Transmission Control Protocol*), folosite de aplicații care + depind de trimiterea corectă și în ordine a informației, cum ar fi servere + web; + +* porturi UDP (*User Datagram Protocol*), folosite de aplicații care trebuie să + trimită informație repede și care sunt rezistente la greșeli de trimitere ale + pachetelor, cum ar fi aplicații de video streaming + +.. _network_connection_transport_show: + +Conectivitatea între aplicații de rețea folosind porturi +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Pentru afișarea porturilor deschise, pe care comunică o aplicație, folosim +comanda ``netstat``: + +.. code-block:: + + student@uso:~$ sudo netstat -tlpn + Active Internet connections (only servers) + Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name + tcp 0 0 127.0.0.1:5939 0.0.0.0:* LISTEN 794/teamviewerd + tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 530/systemd-resolve + tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 693/sshd: /usr/sbin + tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 572/cupsd + tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 2630/sshd: student@ + tcp6 0 0 :::22 :::* LISTEN 693/sshd: /usr/sbin + tcp6 0 0 ::1:631 :::* LISTEN 572/cupsd + tcp6 0 0 ::1:6010 :::* LISTEN 2630/sshd: student@ + + +Pentru comanda de mai sus folosim următoarele opțiuni pentru filtrarea afișării: + +* ``-t`` afișează doar porturile TCP deschise + +* ``-l`` afișează doar porturile deschise care ascultă mesaje, nu și cele deschide pentru trimiterea mesajelor + +* ``-p`` afișează programul care a deschis portul [#netstat_sudo]_ + +* ``-n`` afișează IP-ul pe care se ascultă după conexiuni + +Exercițiu - afișarea porturilor UDP deschise +"""""""""""""""""""""""""""""""""""""""""""" + +Afișați porturile UDP deschise pe stația pe care lucrați. + +.. hint:: + + Având în vedere că opțiunea ``-t`` se referă la porturile TCP, care credeți + ca va fi opțiunea necesară pentru identificarea porturilor UDP? + +.. _network_connection_transport_connect: + +Conectarea TCP la o aplicație +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Vrem să observăm cum răspunde serverul HTTP la mesaje. De regulă un server HTTP răspunde printr-un mesaj în format HTML. + +Pentru a trimite mesaje, indiferent de tipul aplicației care primește mesajul folosim comanda ``nc`` în felul următor + +.. code-block:: + + student@uso:~$ nc google.com 80 + test + HTTP/1.0 400 Bad Request + Content-Type: text/html; charset=UTF-8 + Referrer-Policy: no-referrer + Content-Length: 1555 + Date: Tue, 20 Oct 2020 19:48:04 GMT + + + + + + Error 400 (Bad Request)!!1 + + +

400. That’s an error. +

Your client has issued a malformed or illegal request. That’s all we know. + + +Am rulat comanda ``nc`` iar apoi am scris mesajul ``test`` și am apăsat tasta +``Enter``. Mesajul primit este un răspuns de tipul ``Bad Request``, deoarece +am trimis un mesaj care nu este în formatul așteptat de serverul HTTP. + +Exercițiu - Testarea conexiunii la aplicații +"""""""""""""""""""""""""""""""""""""""""""" + +* Trimiteți un mesaj către programul care ascultă pe portul 22 pe sistemul local + (cu IP-ul ``127.0.0.1``). + +* Trimiteți un mesaj către programul care ascultă pe portul 80 de la adresa + identificată prin numele ``elf.cs.pub.ro``. + + +.. rubric:: Note de subsol + +.. [#netstat_sudo] + Am folosit comanda ``sudo`` pentru a permite afișarea numelor programelor + care ascultă pe portul deschis. Comanda ``netstat`` trebuie executată de un + utilizatot privilegiat pentru această funcționalitate oferită de opțiunea + ``-p``. + +.. [#ipv6] + https://en.wikipedia.org/wiki/IP_address#IPv6_addresses diff --git a/chapters/net/extra.rst b/chapters/net/extra.rst index 8b3d207..bea8f9e 100644 --- a/chapters/net/extra.rst +++ b/chapters/net/extra.rst @@ -1,64 +1,271 @@ +.. _network_extra: + Funcţionalităţi suplimentare de reţelistică =========================================== -Aceste exerciţii sunt menite să abordeze lucruri care nu sunt neapărat necesare -pentru utilizarea şi înţelegerea conceptelor din acest capitol, dar oferă bune -practici şi cunoştinţe extra despre conectarea calculatorului la internet şi -funcţionarea serviciilor în internet. +Aceste exerciții și tutoriale sunt menite să abordeze lucruri care nu sunt +neapărat necesare pentru utilizarea și înțelegerea conceptelor din acest +capitol, dar oferă bune practici și cunoștințe extra despre conectarea +calculatorului la Internet și funcționarea serviciilor în Internet. + +.. _network_extra_proxy: + +Folosirea proxy-urilor HTTP +--------------------------- + +Din unele motive, anumite site-uri nu permit accesul utilizatorilor din unele +țări la ele. Acest lucru se întâmplă din motive logistice, legislative (cu +precădere la politicile de colectare a datelor interzise în anumite țări) sau +securitate. Presupunem că ne aflăm într-o astfel de situație, în care nu ne +putem conecta la un site din locul / rețeaua în care ne aflăm. Sau vrem să +ascundem poziția noastră. Putem identifica din ce țară apare calculatorul nostru +folosind site-ul `WhatsMyIP `_ în felul următor: + +.. image:: img/proxy_ip_ro.png + :align: center + :alt: WhatsMyIP neprotejat + +Până acum am explorat cum putem să apărem în Internet ca o stație care provine +dintr-o altă adresă folosind un VPN. + +Proxy-ul HTTP este o alternativă a VPN care în loc să tuneleze tot traficul +în Internet, o va face doar pentru traficul HTTP. Putem să folosim un serviciu +online de proxy-ing. + +Proxy-ul se bazează pe faptul că există un sistem undeva care va primi +mesajele noastre și le va trimite mai departe. Există servere proxy libere în +Internet care oferă serviciul de proxy-ing gratis. Putem să obținem o listă cu +astfel de servere gratis. Putem obține o listă cu astfel de servere de `aici +`_. + +Pentru a folosi aceste servere în siguranță, fără ca acestea să poată vedea +traficul nostru, trebuie să identificăm servere care folosesc protocolul HTTPS. + +Odată selectat un server, trebuie să îl configurăm în browser. Pentru aceasta +accesăm meniul de preferințe `Preferences `_, apoi căutăm +după cuvântul cheie ``proxy`` în setările browserului: + +.. image:: img/proxy_serach.png + :align: center + :alt: Meniul proxy-urilor în Mozilla Firefox + +În imaginea de mai jos se găsește configurația implicită: + +.. image:: img/proxy_settings.png + :align: center + :alt: Setările implicite pentru proxy-uri + +Odată ajunși la setările pentru proxy, vom selecta setarea manuală a +proxy-urilor și vom introduce adresa proxy-ului selectat împreună cu portul +acestuia. + +.. image:: img/proxy_final.png + :align: center + :alt: Setările proxy-ului dorit + +.. admonition:: Atenție! + + Selectăm opțiunea ``Also use this proxy fot FTP and HTTPS`` pentru a + folosi proxy-ul pentru tot traficul. + +Folosind site-ul `WhatsMyIP `_ vedem că adresa noastră nu +mai apare ca cea inițială ci apare ca fiind dintr-o altă țară. + +.. image:: img/proxy_ip_us.png + :align: center + :alt: WhatsMyIP în proxy + +.. _network_extra_paywall: + +Evitarea paywall-urilor pe site-uri web +--------------------------------------- + +Exista anumite site-uri, cum ar fi cele de știri, sau articole științifice care +ne limitează accesul la un număr de articole pe zi. Funcționalitatea de blocare +a conținutului de pe un site până la plata unei sume se numește un *paywall*. +*Paywall*-urile sunt foarte agasante atunci când încercăm să găsim mai multe +surse pentru știri, sau când vrem să parcurgem mai multe articole de pe același +site. + +.. image:: img/browser_paywall.png + :align: center + :alt: NY Times folosind paywall + +*Paywall*-urile se reduc la elemente HTML care pot fi șterse din pagină +pentru a afișa conținutul complet al unui articol. Elementele web pot fi șterse +manual, sau automat, folosind un add-on de browser. + +Pentru ștergerea automată a blocajelor putem folosi `acest +`_ add-on de browser care +funcționează atât pe Google Chrome cât și pe Mozilla Firefox, care poate fi +descărcat și instalat în browser de `aici +`_. + +.. image:: img/browser_nopaywall.png + :align: center + :alt: NY Times folosind add-onul + +Observăm cum după instalarea și activarea add-onului putem vedea conținutul +paginii web nerestricționat. + +.. _network_extra_ssh: + +Configurarea avansată pentru SSH +-------------------------------- + +.. _network_extra_ssh_shortcuts: + +Configurarea scurtăturilor SSH +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. note:: + + Pentru rularea acestui demo rulați în directorul + ``~/uso.git/labs/03-user/lab-containers/`` comanda ``./lab_prepare.sh install ssh``. + Pentru a ne conecta la infrastructura pentru această secțiune vom folosi + comanda ``./lab_prepare.sh connect ssh`` + +Aplicația SSH permite configurarea scurtăturilor pentru destinații la care vrem +să ne conectăm prin SSH. + +Pentru a ne conecta în mod normal la stația ``10.10.10.3``, ca utilizatorul +``root`` folosind opțiunea ``-X``, ar fi nevoie să rulăm comanda: + +.. code-block:: + + student@uso:~$ ssh -X root@10.10.10.3 + +Introducerea acestei comenzi pentru fiecare conexiune succesivă este ineficientă și +există alternative pentru a reduce timpul de scriere al comenzii. + +Vom configura o scurtătura pentru utilitarul ``ssh`` folosit de utilizatorul +``student``. Fișierul de configurare se regăsește la calea ``~/.ssh/config``. +Pentru adăugarea unei scurtături vrem să scriem în fișier o intrare de felul +următor: + +.. code-block:: + + student@uso:~$ cat ~/.ssh/config + Host remote + HostName 10.10.10.4 + User root + ForwardX11 yes + +Folosindu-ne de intrarea de mai sus, putem să ne conectăm la stația menționată +folosind comanda următoare: + +.. code-block:: + + student@uso:~$ ssh remote + Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 5.4.0-51-generic x86_64) + + * Documentation: https://help.ubuntu.com + * Management: https://landscape.canonical.com + * Support: https://ubuntu.com/advantage + This system has been minimized by removing packages and content that are + not required on a system that users do not log into. + + To restore this content, you can run the 'unminimize' command. + root@ssh:~# + +Exercițiu - Configurarea scurtăturilor SSH +"""""""""""""""""""""""""""""""""""""""""" + +Realizați configurările necesare astfel încât să va puteți conecta la stația +``10.10.10.3`` ca utilizatorul ``student``, folosind opțiunea de X forwarding cu +scurtătura ``remote-stud``. + +.. _network_extra_ssh_keys: + +Configurarea accesului prin chei SSH +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +După cum am observat în secțiunea , ca să propagăm cheia publică pe o +stație este necesar să cunoaștem parola utilizatorului drept care vrem să ne +autentificăm. + +Însă există situații în care nu cunoaștem parola utilizatorului, dar avem acces +fizic sau printr-un protocol de comunicare la stație. + +În această situație, putem să configurăm cheia publică folosindu-ne de fișierele +de configurare ale serverului SSH. + +Pentru autentificarea utilizatorilor folosind chei publice-private, serverul SSH +verifică fișierul ``~/.ssh/authorized_keys``. Acest fișier conține o listă a +tuturor cheilor publice care au voie să se conecteze la server. + +.. code-block:: + + student@uso:~$ ssh root@10.10.10.3 cat .ssh/authorized_keys + ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDdLi3SmYI1EvpacxU9qapNwqR2p2OX2GyUXPJsyJcF73kpCqT2qjoeAgHUR6fJkCotCpsusF4AXfK+GCCnLbTuVDZxnTZo85izUaRMQNbvylo+e9fj7+IRvtID6wLMSk4RdLJRFgwwej5WFAS4egdeuGPvrcvT123oZNE/lvW2V/LN9U61SUo0d+X5a8m0XL4pPLfG2/hzuSIlSjUo8iktU7mqfQelCKCeNlxxS1w65buut+dSRtH2WDzCWM/7C78f6aa6swML0zQwfHVRdMyVP2llMbgXaaGR+YJIqm091nKGze9pFFIT68lBrMKTuplhZVvrqP5292hwU376hhdaloHaph3iTtGk5cshCOpDmZPyj5BvSsdhk9hVvgsvPohK4sRoxpCxv/Xm0gLHGBiP39ZUOuGTSCrSO7IvLxgq7k6JZrMtGVoiHJUFur6tFJ0aZ020Ror6czw3CUBXyHk05bQMziuMKJGn/jjHpWUfZ4y1n16E8Gael1+7melI/v0= student@uso + + +Pentru adăugarea unei alte chei SSH pentru verificarea identității clienților, +este suficient să scriem cheia SSH a utilizatorului pe o linie nouă a fișierului +``authorized_keys``. + +TODO infra + +.. _network_extra_nmcli: -1) Folosirea proxy-urilor HTTP ------------------------------- +Gestiunea avansată a conexiunilor la rețea +------------------------------------------ -Proxy-ul HTTP este o alternativă a VPN care în loc să îţi tuneleze tot traficul -în internet, o va face doar pentru traficul HTTP. Putem să folosim un serviciu -online de proxying, ca sa nu ne ia cu capul când facem infrastructura. +Pentru a ușura configurarea conexiunii la Internet pentru utilizatorii Linux, a +fost adoptat ca serviciu standard pentru gestionarea conexiunilor la Internet: +serviciul ``NetworkManager``. Acesta permite utilizatorilor să configureze din +mediul grafic parametrii de funcționare a rețelei, cum ar fi serviciul DNS +folosit. -2) Evitarea elementelor de tip paywall --------------------------------------- +``NetworkManager`` oferă și funcționalități în linie de comandă, cu scopul de a +face mai ușoară depanarea problemelor de rețea. Utilitarul pe care îl vom +folosi se numește ``nmcli``, iar acesta ne oferă funcționalități pentru +gestionarea configurărilor. -a. Ştergerea elementelor din pagina web -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Din punctul de vedere al serviciului ``NetworkManager``, există interfețe pe care +acesta le configurează și există conexiuni, care rețin configurările. -Îi putem pune să se conecteze pe un site cu paywall şi să le arătăm cum să -scoată paywallul folosind inspect element şi să şteargă elementul din pagină ca -să vadă conţinutul. Aici putem folosi un site care oferă cărţi. +.. _network_extra_nmcli_connecition: -b. Instalarea add-on-urilor de tip paywall bypass -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Configurarea conexiunilor folosind ``nmcli`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Le arătăm că pot să îşi instaleze pluginuri ca să şteargă paywalluri de la -site-uri cum ar fi cele de research, sau ştiri. +Pentru interfețe conectate prin cablu există doar o singură conexiune în mod +normal. -3) Configurarea avansată pentru SSH ------------------------------------ +Pentru a vizualiza parametrii de funcționare ai unei conexiuni rulăm comanda: -a. Configurarea scurtăturilor SSH -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. code-block:: -Le vom arăta cum să facă “scurtături” pentru conectarea şi configurarea -conexiunilor SSH la anumite host-uri folosind fişierul de configurare pentru -SSH. + student@uso:~$ nmcli connection show "Wired connection 1" | less + connection.id: Wired connection 1 + connection.uuid: eb564cd4-e37e-3d00-a94a-6596698ef4e3 + connection.stable-id: -- + connection.type: 802-3-ethernet + connection.interface-name: enp0s3 + <...> -b. Configurarea accesului prin chei SSH -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Observăm că sunt afișate lucruri cum ar fi ruta implicită, adresa IP configurată +pe interfață, serverul de DNS folosit, și modul prin care a fost configurată +interfața (prin DHCP sau în mod static). -Pentru conectarea remote la calculatoare fără parolă, le putem arăta ca -alternativa la ssh-copy-id cum să adauge “de mână” cheia SSH în fişierul -authorized_keys. +Pentru modificarea unui atribut al conexiunii folosim comanda ``nmcli`` în felul +următor: -4) Gestiunea avansată a conexiunilor la rețea ---------------------------------------------- +.. code-block:: -a. Configurarea conexiunilor folosind `nmcli` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + student@uso:~$ nmcli connection modify "Wired connection 1" ignore-auto-dns yes + student@uso:~$ nmcli connection modify "Wired connection 1" ipv4.dns 1.1.1.1 + student@uso:~$ sudo systemctl restart network-manager.service -Aici propun să le arătăm cum să se conecteze la reţele folosind `nmcli` şi să le -arătăm cum pot să vadă într-un singur loc toate conexiunile pe care le are un -calculator şi cum sa le configureze. Aici putem să le arătăm cum să schimbe -DNS-ul; +Pentru a folosi un sever DNS dorit de noi, în loc de cel primit prin DHCP este +nevoie să setăm parametrul ``ignore-audo-dns`` la valoarea ``yes``. Atributul +``ipv4.dns`` reține date despre serverul DNS care va fi folosit în cadrul +conexiunii. Pentru a schimba serverul DNS folosit am setat acest parametru la +adresa IP ``1.1.1.1``. -b. Conectarea la reţelele wireless -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Exercițiu - Setarea serverului DNS permanent folosind ``nmcli`` +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -Dacă avem infrastructura, mi se pare că ar fi foarte fain dacă le-am arăta cum -să se conecteze la un wifi folosind `nmcli`. +Faceți modificările necesare folosind comanda ``nmcli`` astfel încât conexiunea +``Wired Connection 1`` să folosească serverul DNS ``8.8.8.8``. diff --git a/chapters/net/gifs/firefox-best-cake-recipes.gif b/chapters/net/gifs/firefox-best-cake-recipes.gif new file mode 100644 index 0000000..9fe879b Binary files /dev/null and b/chapters/net/gifs/firefox-best-cake-recipes.gif differ diff --git a/chapters/net/gifs/firefox-bookmark-page-long.gif b/chapters/net/gifs/firefox-bookmark-page-long.gif new file mode 100644 index 0000000..3128623 Binary files /dev/null and b/chapters/net/gifs/firefox-bookmark-page-long.gif differ diff --git a/chapters/net/gifs/firefox-bookmark-page-short.gif b/chapters/net/gifs/firefox-bookmark-page-short.gif new file mode 100644 index 0000000..a55b225 Binary files /dev/null and b/chapters/net/gifs/firefox-bookmark-page-short.gif differ diff --git a/chapters/net/gifs/firefox-install-adblock-plus.gif b/chapters/net/gifs/firefox-install-adblock-plus.gif new file mode 100644 index 0000000..2317bc6 Binary files /dev/null and b/chapters/net/gifs/firefox-install-adblock-plus.gif differ diff --git a/chapters/net/gifs/firefox-view-bookmarks.gif b/chapters/net/gifs/firefox-view-bookmarks.gif new file mode 100644 index 0000000..45aa906 Binary files /dev/null and b/chapters/net/gifs/firefox-view-bookmarks.gif differ diff --git a/chapters/net/gifs/nic.gif b/chapters/net/gifs/nic.gif new file mode 100644 index 0000000..863176b Binary files /dev/null and b/chapters/net/gifs/nic.gif differ diff --git a/chapters/net/img/browser_nopaywall.png b/chapters/net/img/browser_nopaywall.png new file mode 100644 index 0000000..9ebe5b9 Binary files /dev/null and b/chapters/net/img/browser_nopaywall.png differ diff --git a/chapters/net/img/browser_paywall.png b/chapters/net/img/browser_paywall.png new file mode 100644 index 0000000..6e9e9fd Binary files /dev/null and b/chapters/net/img/browser_paywall.png differ diff --git a/chapters/net/img/client-server.png b/chapters/net/img/client-server.png new file mode 100644 index 0000000..b471bdd Binary files /dev/null and b/chapters/net/img/client-server.png differ diff --git a/chapters/net/img/proxy_final.png b/chapters/net/img/proxy_final.png new file mode 100644 index 0000000..9470567 Binary files /dev/null and b/chapters/net/img/proxy_final.png differ diff --git a/chapters/net/img/proxy_ip_ro.png b/chapters/net/img/proxy_ip_ro.png new file mode 100644 index 0000000..f8abf87 Binary files /dev/null and b/chapters/net/img/proxy_ip_ro.png differ diff --git a/chapters/net/img/proxy_ip_us.png b/chapters/net/img/proxy_ip_us.png new file mode 100644 index 0000000..8244904 Binary files /dev/null and b/chapters/net/img/proxy_ip_us.png differ diff --git a/chapters/net/img/proxy_serach.png b/chapters/net/img/proxy_serach.png new file mode 100644 index 0000000..cef812b Binary files /dev/null and b/chapters/net/img/proxy_serach.png differ diff --git a/chapters/net/img/proxy_settings.png b/chapters/net/img/proxy_settings.png new file mode 100644 index 0000000..9c6caf1 Binary files /dev/null and b/chapters/net/img/proxy_settings.png differ diff --git a/chapters/net/img/teamviewer_connection.png b/chapters/net/img/teamviewer_connection.png new file mode 100644 index 0000000..bffab67 Binary files /dev/null and b/chapters/net/img/teamviewer_connection.png differ diff --git a/chapters/net/img/teamviewer_id.png b/chapters/net/img/teamviewer_id.png new file mode 100644 index 0000000..74822e9 Binary files /dev/null and b/chapters/net/img/teamviewer_id.png differ diff --git a/chapters/net/img/teamviewer_pass.png b/chapters/net/img/teamviewer_pass.png new file mode 100644 index 0000000..674d724 Binary files /dev/null and b/chapters/net/img/teamviewer_pass.png differ diff --git a/chapters/net/img/teamviewer_start.png b/chapters/net/img/teamviewer_start.png new file mode 100644 index 0000000..bfef35a Binary files /dev/null and b/chapters/net/img/teamviewer_start.png differ diff --git a/chapters/net/img/utp.png b/chapters/net/img/utp.png new file mode 100644 index 0000000..23ce860 Binary files /dev/null and b/chapters/net/img/utp.png differ diff --git a/chapters/net/img/xforwarding.png b/chapters/net/img/xforwarding.png new file mode 100644 index 0000000..137f169 Binary files /dev/null and b/chapters/net/img/xforwarding.png differ diff --git a/chapters/net/services.rst b/chapters/net/services.rst index 33b45d7..144493c 100644 --- a/chapters/net/services.rst +++ b/chapters/net/services.rst @@ -1,77 +1,688 @@ -Servicii şi clienţi de reţea +.. _network_services: + +Servicii și clienți de rețea ============================ -1) Clienţi web în linia de comandă ------------------------------------ +Dispozitivele pe care le folosim noi devin din ce în ce mai mici, mai eficiente +și ieftine. Asta se întâmplă deoarece multe dintre aplicațiile care până nu de +curând rulau pe calculatorul propriu s-au mutat în spațiu online. De exemplu, în +loc să descărcăm filme și să le urmărim de pe calculator, folosim o aplicație +cum ar fi Netflix pentru a transmite prin Internet filmul pe care vrem să îl +urmărim. Un alt exemplu relevant este Google Drive, care ne permite să stocăm, +să replicăm și să edităm documente într-o interfață web, în loc să le păstrăm +local pe calculatorul pe care îl folosim. Toată puterea de procesare și tot +spațiul de stocare s-a mutat de pe calculatorul propriu pe servere aflate în +Internet. + +Vom numi aceste aplicații care rulează în Internet **servicii**. + +Un serviciu este o aplicație care oferă o funcționalitate utilizatorilor care +apelează la ele. Serviciile în domeniul calculatoarelor lucrează folosind +paradigma server-client. Un avantaj major al acestei abordări este că reduce +puterea de calcul necesară pentru rularea aplicațiilor de către utilizatori. +Aceștia au nevoie doar de o aplicație client care știe să comunice cu serverul. +Astfel, aplicația client trimite o cerere către aplicația server, serverul +primește cererea, procesează cererea și servește răspunsul aplicației client +care a făcut cererea. + +Această paradigmă poate fi observată în schema următoare: + +.. image:: img/client-server.png + :align: center + :alt: Arhitectura client-server + +Atunci când noi vrem să urmărim un film pe Netflix aplicația client Netflix de +pe calculator sau smart TV va trimite o cerere de descărcare a filmului de pe +serverul Netflix aflat la distanță. + +.. _network_services_clients: + +Clienţi web în linia de comandă +-------------------------------- + +În viață de zi cu zi aplicația pe care o folosim cel mai mult este browserul +web, deoarece majoritatea aplicațiilor pe care le folosim au fost transformate +în pagini web cu care noi interacționăm. Browserul web este o aplicație care +execută o cerere HTTP către un server web, identificat printr-o adresă, un link, +prin care face o acțiune și primește un răspuns. De exemplu, când accesăm pagina +``www.facebook.com`` se trimite o cerere către serverul HTTP, iar acesta trimite +un răspuns către browser sub forma unei pagini web, în formatul HTML, pe care +browserul o afișează. + +Pentru interacțiunea cu serverele web putem folosi și clienți web în linie de +comandă. Clienții web folosiți în linie de comandă sunt folositori atunci când +nu avem acces la o interfață GUI, sau când încercăm să automatizăm un proces. De +exemplu, pentru a verifica automat starea unui site avem nevoie să descărcăm +pagina site-ului. + +Există mai multe implementări de clienți web în linie de comandă. Vom folosi +comanda ``wget`` pentru descărcarea unei pagini web. + +.. code-block:: + + student@uso:~$ wget elf.cs.pub.ro + --2020-10-20 23:01:02-- http://elf.cs.pub.ro/ + Resolving elf.cs.pub.ro (elf.cs.pub.ro)... 141.85.227.116 + Connecting to elf.cs.pub.ro (elf.cs.pub.ro)|141.85.227.116|:80... connected. + HTTP request sent, awaiting response... 200 OK + Length: 168 [text/html] + Saving to: ‘index.html’ + + index.html 100%[===========================================================>] 168 --.-KB/s in 0s + + 2020-10-20 23:01:02 (7,61 MB/s) - ‘index.html’ saved [168/168] + + student@uso:~$ cat index.html + + + + + + +

It works!

+ + + +Comanda ``wget`` primește ca parametru link-ul către pagina pe care vrem să o +descărcăm. + +Am folosit comanda ``cat`` pentru afișarea conținutului fișierului +``index.html``. Fișierul ``index.html`` este fișierul descărcat în mod +implicit, dacă nu descărcăm o pagină specifică. + +Exercițiu - Descărcarea paginilor web +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* Deschideți într-un editor de text pagina web descărcată pentru a vedea + conținutul HTML. + +* Descărcați pagina web de la adresa ``www.facebook.com``. Afișați conținutul + fișierului descărcat. + +.. admonition:: Observație: + + Clienții web nu sunt folosiți doar pentru accesarea paginilor web. Putem + folosi clienți web pentru a descărca fișiere indiferent de tipul acestora. + +* Descărcați pagina web de la adresa ``http://wttr.in/``. Afișați conținutul + fișierului descărcat. + +* Descărcați fișierul ``http://elf.cs.pub.ro/uso/res/final/07-feb/heroes.csv``. + Ce tip de fișier este acesta? + +.. _network_services_remotecli: + +Accesul la distanţă în linie de comandă +--------------------------------------- + +.. note:: + + Pentru rularea acestui demo rulați în directorul + ``~/uso.git/labs/03-user/lab-containers/`` comanda ``./lab_prepare.sh install ssh``. + Pentru a ne conecta la infrastructura pentru această secțiune vom folosi + comanda ``./lab_prepare.sh connect ssh`` + +În multe situații atunci când lucrăm cu sisteme, este necesar să rulăm aplicații +pe alte stații în afara calculatorului nostru fără să avem acces fizic la +stații. + +Protocolul cel mai folosit pentru accesul la stații la distanță este protocolul +SSH. SSH permite autentificarea la o stație pe care rulează un server SSH. +Când ne conecta la o stație, trebuie să precizăm utilizatorul cu care vrem să +ne logăm. Pentru autentificare introducem parola utilizatorului, sau +folosim o cheie de acces la stație. + +.. _network_services_remotecli_pass: + +Conectarea folosind autentificare cu parolă +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Pentru a rula comenzi pe o altă stație putem folosi programul SSH (*Secure +Shell*) pentru a ne conecta la acesta în felul următor: + +.. code-block:: + + student@uso:~$ hostname + uso + student@uso:~$ ssh root@10.10.10.3 + The authenticity of host '10.10.10.3 (10.10.10.3)' can't be established. + ECDSA key fingerprint is SHA256:I3Ybkkk7nF2FjwVHMzjkyujDnhlRlnSwPRVwUKm6OCM. + Are you sure you want to continue connecting (yes/no/[fingerprint])? yes + Warning: Permanently added '10.10.10.3' (ECDSA) to the list of known hosts. + root@10.10.10.3's password: + Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 5.4.0-51-generic x86_64) + + * Documentation: https://help.ubuntu.com + * Management: https://landscape.canonical.com + * Support: https://ubuntu.com/advantage + This system has been minimized by removing packages and content that are + not required on a system that users do not log into. + + To restore this content, you can run the 'unminimize' command. -Pentru accesarea unui site le arătăm că putem să descărca site-ul folosind un -client cum ar fi `wget`, sau `curl` şi le arătăm că se descarcă un fişier HTML -şi le vom explica că asta face şi browser-ul, dar are un motor care -interpretează textul şi îl afişează. + The programs included with the Ubuntu system are free software; + the exact distribution terms for each program are described in the + individual files in /usr/share/doc/\*/copyright. -2) Accesul la distanţă în linie de comandă ------------------------------------------- + Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by + applicable law. + root@ssh:~# ls / + bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var + root@ssh:~# hostname + ssh -Pentru accesarea unui calculator de la distanţă prin shell, le arătăm cum se pot -conecta la un alt calculator şi să ruleze pe el comenzi folosind SSH. -Aici le vom arăta că există două moduri de autentificare, folosind parolă şi -folosind chei. +Unde ``root`` este numele utilizatorului și ``10.10.10.3`` este adresa IP, sau +hostname-ul stației la care vrem să ne conectăm. -a. Conectarea folosind autentificare cu parolă -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Atunci când ne conectăm la o stație, clientul SSH va încerca să autentifice +stația la care ne-am conectat. Dacă ne conectăm pentru prima oară la un sistem +trebuie să spunem clientului că am verificat datele clientului la care ne-am +conectat. -b. Conectarea folosind autentificare cu chei -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +În mod implicit protocolul SSH va folosi autentificarea cu parolă. Parola +introdusă în exemplul de mai sus este parola ``root``. -b'. Generarea unei perechi de chei +Odată ce ne-am conectat la calculator, avem acces la un shell în care rulăm +comenzi ca mai sus. Putem observa că ne-am autentificat pe un calculator diferit +deoarece s-a schimbat promptul terminalului de la ``student@uso:~$`` la +``root@ssh:~#`` și s-a afișat un mesaj numit *Message of the Day*. + +În exemplul de mai sus am rulat comanda ``hostname`` care afișează numele +stației la care ne-am conectat pentru a ne asigura că ne-am conectat pe un nou +calculator. Putem observa numele stației și din prompt. + +Exercițiu - Conectarea la distanță """""""""""""""""""""""""""""""""" -Îi punem să îşi genereze cheia şi să o copieze pe o altă staţie, apoi să vadă că -nu mai trebuie tastată parola. +* Autentificați-vă la stația cu adresa IP ``11.11.11.3`` folosind utilizatorul + ``root`` și parola ``root``. + +* Autentificați-vă la stația cu adresa IP ``12.12.12.3`` folosind utilizatorul + ``student`` și parola ``student``. + +.. admonition:: Observație: + + Atunci când ne conectăm la o stație folosind protocolul SSH este necesar să + precizăm un nume de utilizator valid. Dacă utilizatorul nu există, serverul + nu va preciza faptul că utilizatorul nu există pe sistem, ci va cere parola + utilizatorului, dar nu va permite autentificarea la stație. De ce serverul SSH + nu specifică dacă utilizatorul exista sau nu? + +.. _network_services_remotecli_cmd: + +Rularea unei singure comenzi prin SSH +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Atunci când ne conectăm la o stație avem acces la un shell pe care putem să îl +folosim, dar dacă nu este necesar putem să rulăm mai multe comenzi, sau vrem să +automatizăm rularea comenzilor pe alte stații putem folosi comanda SSH în felul +următor: + +.. code-block:: + + student@uso:~$ ssh root@10.10.10.3 ip address show + root@10.10.10.3's password: + 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + inet 127.0.0.1/8 scope host lo + valid_lft forever preferred_lft forever + 544: eth0@if545: mtu 1500 qdisc noqueue state UP group default + link/ether 02:42:0a:0a:0a:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0 + inet 10.10.10.3/24 brd 10.10.10.255 scope global eth0 + valid_lft forever preferred_lft forever + 546: eth1@if547: mtu 1500 qdisc noqueue state UP group default + link/ether 02:42:0b:0b:0b:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0 + inet 11.11.11.3/24 brd 11.11.11.255 scope global eth1 + valid_lft forever preferred_lft forever + 550: eth2@if551: mtu 1500 qdisc noqueue state UP group default + link/ether 02:42:0c:0c:0c:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0 + inet 12.12.12.3/24 brd 12.12.12.255 scope global eth2 + valid_lft forever preferred_lft forever -c. Conectarea între două calculatoare aflate în rețele private diferite -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Am rulat comanda ``ip address show`` pentru a afișa setările de rețea pe +stația de la adresa IP ``10.10.10.3``, autentificându-ne ca utilizatorul +``root``. - +Execițiu - Rularea unei singure comenzi prin SSH +"""""""""""""""""""""""""""""""""""""""""""""""" -Pentru a demonstra principiul tunelării, ne vom folosi iar de netcat pentru a -realiza o conexiune între două staţii. Ei se vor conecta la localhost:2222 şi -vor accesa o altă maşină virtuală remote. Le vom arăta cum se face tunelul. +Rulați comanda ``cat /etc/passwd`` pe stația de la IP-ul ``10.10.10.3`` fără să +intrați în interfața în linia de comandă de pe stații. Vă veți autentifica +folosind utilizatorul ``root`` și parola ``root``. -d. Transferul datelor la distanţă +.. _network_services_remotecli_scp: + +Transferul fișierelor la distanţă ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Pentru a transfera fişiere la distanţă îi punem să folosească `scp` pentru a -trimite un director şi un fişier către o staţie remote, iar apoi îi pune, să -copieze şi invers, de pe staţia remote pe local. +Pentru a transfera fișiere la distanță folosim ``scp``. Comanda ``scp`` +se folosește de protocolul SSH pentru transferul de date între stații, astfel +ne putem folosi de modelul de autentificare de la SSH, ca în comanda de mai jos: + +.. code-block:: + + student@uso:~$ scp /bin/bash student@10.10.10.3:~/ + student@10.10.10.3's password: + bash 100% 1156KB 30.5MB/s 00:00 + student@uso:~$ ssh student@10.10.10.3 ls ~ + student@10.10.10.3's password: + bash + +Fișierul ``/bin/bash`` a fost copiat de pe stația ``uso`` pe stația de la adresa IP +``10.10.10.3`` în directorul home al utilizatorului ``student``. Am rulat +comanda ``ls ~`` prin SSH pentru a verifica că s-a efectuat copierea cu succes. + +Trimiterea fișierelor poate fi realizată în orice direcție: + +* încărcarea fișierelor de la client la server + +* descărcarea fișierelor de la server la client + +Pentru descărcarea fișierelor de pe un server folosim comanda ``scp``: + +.. code-block:: + + student@uso:~$ scp root@10.10.10.3:/etc/resolv.conf . + root@10.10.10.3's password: + resolv.conf 100% 38 19.3KB/s 00:00 + student@uso:~$ cat resolv.conf + nameserver 127.0.0.11 + options ndots:0 + student@uso:~$ ssh root@10.10.10.3 cat /etc/resolv.conf + root@10.10.10.3's password: + nameserver 127.0.0.11 + options ndots:0 + + + +Comanda rulată anterior a descărcat fișierul ``resolv.conf`` din directorul +``/etc/`` de pe stația ``10.10.10.3`` în directorul curent (``.``). + +Exercițiu - Copierea fișierelor la distanță +""""""""""""""""""""""""""""""""""""""""""" + +Descărcați fișierul ``/etc/passwd`` de la adresa ``10.10.10.3`` folosind +utilizatorul ``student`` și parola ``student`` în directorul +``/home/student/Downloads``. + +Copierea directoarelor la distanță +"""""""""""""""""""""""""""""""""" + +Pentru copierea unui director folosim opțiunea ``-r``: + +.. code-block:: + + student@uso:~$ scp -r ./Downloads/ root@10.10.10.3:~/ + root@10.10.10.3's password: + macos.txt 100% 18 4.2KB/s 00:00 + index.html 100% 168 168.4KB/s 00:00 + teamviewer_15.10.5_amd64.deb 100% 14MB 48.1MB/s 00:00 + +Comanda anterioară a copiat directorul ``Downloads`` și conținutul său din +directorul curent în directorul home al utilizatorului ``root`` de la adresa +``10.10.10.3``. + +Exercițiu - Copierea directoarelor la distanță +"""""""""""""""""""""""""""""""""""""""""""""" + +Copiați directorul ``/usr`` de pe stația de la adresa ``10.10.10.3`` în +directorul home al utilizatorului curent. Vă veți autentifica pe stația de la +distanță folosind utilizatorul ``root`` și parola ``root``. + +.. _network_services_remotecli_key: + +Conectarea folosind autentificare cu chei +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +În anumite scenarii ne dorim să evităm introducerea parolei pentru +autentificarea la o stație la distanță. De exemplu, ne dorim să rulăm aceeași +comandă pe 10 stații. Dacă am folosi autentificare bazată pe parolă ar fi nevoie +să scriem într-un fișier în clar parola. Aceasta este o problema de securitate, +deoarece dacă păstrăm o cheie în format text aceasta poate fi furată de cineva. +O alternativă ineficientă este să scriem parola de 10 ori de mână. + +Pentru a trece de această problemă putem să folosim mecanismul de autentificare +cu chei. Autentificarea cu chei presupune existență a două chei pereche: + +* **cheia privată**: este o cheie secretă care este folosită de un client SSH + pentru a se autentifica +* **cheia publică**, este o cheie care este copiată pe stația unde este rulat + serverul SSH. Cheia este folosită pentru identificarea clienților SSH care se + conectează la server. + +Cele două chei sunt legate matematic, iar posesorul cheii private să se poată +autentifica pe orice sistem unde este disponibilă cheia publică. Câtă vreme +posesorul cheii private este singurul care are acces la cheie, nimeni nu se va +mai putea autentifica în locul său. + +Pentru generarea unei perechi de chei folosim comanda ``ssh-keygen``: + +.. code-block:: + + student@uso:~$ ssh-keygen + Generating public/private rsa key pair. + Enter file in which to save the key (/home/student/.ssh/id_rsa): + Enter passphrase (empty for no passphrase): + Enter same passphrase again: + Your identification has been saved in /home/student/.ssh/id_rsa + Your public key has been saved in /home/student/.ssh/id_rsa.pub + The key fingerprint is: + SHA256:mN9IlWoU6bmSA1vvKBSAfAB/Rg9GwTaAhqZ1Kc0vfHM student@uso + The key's randomart image is: + +---[RSA 3072]----+ + |=+o**o .. | + |+=++Oo .. . | + |+.o*oo....o | + |. o= =+Eo | + | Bo=S. | + | o ++oo | + | . =o . | + | . . . | + | . | + +----[SHA256]-----+ + + +În procesul de generare a cheilor ni se cere și un passphrase +pentru a asigura securitatea cheii private în cazul în care este pierdută, +furată sau altcineva are acces accidental la ea. Desigur, uitarea +passphrase-ului face cheia nefolosibilă. Așa că passphrase-ul trebuie reținut +(și protejat) ca orice altă parolă. Este indicat să nu protejați cheia printr-un +passphrase deoarece prezintă aceleași probleme ca folosirea unei parole. + +Pentru copierea cheii publice pe o stație folosim comanda ``ssh-copy-id``: + +.. code-block:: + + student@uso:~$ ssh-copy-id root@10.10.10.3 + /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/student/.ssh/id_rsa.pub" + /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed + /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys + root@10.10.10.3's password: + + Number of key(s) added: 1 + + Now try logging into the machine, with: "ssh 'root@10.10.10.3'" + and check to make sure that only the key(s) you wanted were added. + + +Este necesar să cunoaștem parola utilizatorului pentru copierea cheii publice. + +Atunci când copiem cheia publică, aceasta va fi copiată pentru un singur +utilizator. Dacă vrem să ne autentificăm pe același sistem ca utilizatori +diferiți fără parola, este necesar să copiem cheia publică pentru fiecare +utilizator. + +Exercițiu - Utilizarea cheilor SSH +"""""""""""""""""""""""""""""""""" + +* Generați o nouă cheie SSH de tip RSA cu passphrase-ul ``mere``. + +* Efectuați modificările necesare astfel încât să vă puteți autentifica drept + utilizatorul ``student`` de pe stația ``10.10.10.3`` fără parolă. + +.. _network_services_remotegui: + +Controlul la distanță în mediul grafic +-------------------------------------- + +Există anumite tipuri de aplicații care funcționează în mod implicit în mediul +grafic și aceste aplicații nu pot fi rulate în interfața în linie de comandă. De +exemplu, installer-ul unui joc nu poate să fie rulat din linie de comandă. + +Controlul acestor aplicații se poate reduce la două probleme: + +* controlul întregului desktop; + +* controlul unei singure aplicații. + +.. _network_services_remotegui_dekstop: + +Controlul desktopului la distanţă +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Pentru control complet al unei sesiuni desktop grafice există o mai multe +soluții, cum ar fi VNC, sau FreeRDP, dar noi ne vom concentra pe soluția numită +TeamViewer, deoarece oferă suport pentru toate sistemele convenționale. + +TeamViewer poate fi descărcat de la `această +`_ adresă și permite +autentificarea la o mașină folosind un ID și o parolă generate de aplicația +server. + +.. image:: img/teamviewer_start.png + :align: center + :alt: Aplicația TeamViewer + +Recapitulare - Instalarea aplicației TeamViewer +""""""""""""""""""""""""""""""""""""""""""""""" + +Descărcați și instalați aplicația TeamViewer pe mașina virtuală ``USO`` și pe +stația voastră fizică. + +Folosirea TeamViewer +"""""""""""""""""""" + +Pentru a ne conecta la o mașină la distanță avem nevoie de ID-ul mașinii și +parola conexiunii. Aceste informații se găsesc în primul ecran al aplicației +TeamViewer, cum se vede mai jos. + +Vom scrie ID-ul stației la care vrem să ne conectăm în câmpul ``Partner ID`` de +pe calculatorul de pe care vrem să ne conectăm (stația client). + +.. image:: img/teamviewer_id.png + :align: center + :alt: ID în TeamViewer + +După ce apăsăm tasta ``Enter`` apare promptul pentru parolă, unde completăm +parola stației la care vrem să ne conectăm. + +.. image:: img/teamviewer_pass.png + :align: center + :alt: Parola în TeamViewer + +După ce am introdus parola a apărut pe ecran desktop-ul mașinii la care am vrut +să mă conectez. În cazul de față este vorba de un sistem MacOS pe care am rulat +TeamViewer. + +.. image:: img/teamviewer_connection.png + :align: center + :alt: Controlul calculatorului de la distanță + +Deasupra cadrului în care apare desktop-ul de la distanță apar butoane ce ne +permit să închidem conexiunea, sau să trimitem acțiuni și fișiere către +calculatorul server. + +Exercițiu - Conectarea la distanță folosind TeamViewer +""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +Conectați-vă la mașina virtuală USO de pe stația voastră fizică. + +.. _network_services_remotegui_window: + +Controlul unei ferestre la distanţă +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Pentru controlul unei ferestre în Linux putem să folosim protocolul SSH pentru +transferul datelor care ar fi afișate pe stația pe care funcționează aplicația +grafică pe stația pe care este lansat clientul SSH. + +Acest mod de transfer nu este rapid, deoarece transferul se face printr-un +protocol care nu este menit pentru aplicații care au nevoie să fie responsive, +cum sunt ferestrele interactive, dar pot fi folosite pentru aplicații cum ar fi +kituri de instalare ale programelor. + +Pentru a porni o aplicație grafică pe un calculator la distanță trebuie să ne +conectăm la această stație folosind opțiunea ``-X`` a comenzii ``ssh``. + +.. image:: img/xforwarding.png + :align: center + :alt: Controlul ferestrelor prin SSH + +Pentru a rula browserul ``firefox`` pe stația de la adresa ``10.10.10.3``, ne-am +conectat la aceasta folosind comanda ``ssh`` cu opțiunea ``-X`` și am pornit +aplicația ca și când am porni-o local. + +.. admonition:: Observație: + + Nu putem să preluăm controlul unei aplicații dacă aceasta a fost pornită + deja pe stația de la distanță, deoarece putem doar sa primim semnalul + video pentru aplicații nou pornite. + +Exercițiu - Controlul une ferestre la distanță +"""""""""""""""""""""""""""""""""""""""""""""" + +Deschideți aplicația grafică ``qbittorrent`` ca utilizatorul ``student`` pe +stația ``10.10.10.3``. + +.. _network_services_vpn: + +Securizarea conexiunii la Internet folosind un VPN +-------------------------------------------------- + +.. note:: + + Pentru rularea acestui demo rulați în directorul + ``~/uso.git/labs/03-user/lab-containers/`` comanda ``./lab_prepare.sh install vpn``. + Pentru a ne conecta la infrastructura necesară acestei secțiuni, vom folosi + comanda ``./lab_prepare.sh connect openvpn-client1`` pentru stația + ``openvpn-client1`` și ``./lab_prepare.sh connect openvpn-client2`` pentru a vă + conecta la stația ``openvpn-client2``. + +O aplicație de tip VPN (*Virtual Private Network*) este o aplicație care permite +crearea rețelelor de calculatoare în Internet fără ca acestea să fie neapărat în +aceeași rețea fizică. + +Funcționalitatea unui VPN este încapsularea datelor trimise de către un +calculator, criptarea și trimiterea lor către un server care le va trimite +mai departe către destinație. + +Primul avantaj al folosirii unui VPN este "ascunderea" traficului între client, +adică stația de pe care se trimit datele și serverul VPN-ului. Astfel, acestea nu +mai pot fi văzute de alte entități până când ajung la serverul VPN. + +Al doilea avantaj al VPN-urilor este interconectarea facilă între calculatoare +care se află în rețele private diferite. De exemplu, pentru a juca un joc în +LAN, putem folosi un VPN, cum ar fi Hamachi [#Hamachi]_ , la care se conectează doi +utilizatori. Serverul de VPN va primi datele de la clienți și le va trimite +mai departe dintr-o rețea privată în alta. + + + +Recapitulare - Identificarea adreselor IP ale interfețelor +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Identificați adresele IP configurate pe interfețele stațiilor +``openvpn-client1`` și ``openvpn-client2``. + +Recapitulare - Verificarea conexiunii între două stații +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Verificați conectivitatea între cele două stații folosind adresele IP +identificate mai sus. + +.. admonition:: Observație: + + Nu există conectivitate între cele două stații, deoarece acestea se află în + rețele private diferite. + +Pentru a porni VPN-ul, vom folosi comanda ``openvpn``. Rulați următoarea comandă +pe ambele stații pentru a porni clientul de VPN: + +.. code-block:: + + root@openvpn-client1:~# openvpn --config ./openvpn-client1.ovpn --daemon + root@openvpn-client1:~# ip address show + 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + inet 127.0.0.1/8 scope host lo + valid_lft forever preferred_lft forever + 3: tun0: mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100 + link/none + inet 192.168.255.6 peer 192.168.255.5/32 scope global tun0 + valid_lft forever preferred_lft forever + 45: eth0@if46: mtu 1500 qdisc noqueue state UP group default + link/ether 02:42:0a:0a:0a:0f brd ff:ff:ff:ff:ff:ff link-netnsid 0 + inet 10.10.10.15/24 brd 10.10.10.255 scope global eth0 + valid_lft forever preferred_lft forever + + root@openvpn-client2:~# openvpn --config ./openvpn-client2.ovpn --daemon + root@openvpn-client2:~# ip address show + 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + inet 127.0.0.1/8 scope host lo + valid_lft forever preferred_lft forever + 2: tun0: mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100 + link/none + inet 192.168.255.10 peer 192.168.255.9/32 scope global tun0 + valid_lft forever preferred_lft forever + 47: eth0@if48: mtu 1500 qdisc noqueue state UP group default + link/ether 02:42:0b:0b:0b:0f brd ff:ff:ff:ff:ff:ff link-netnsid 0 + inet 11.11.11.15/24 brd 11.11.11.255 scope global eth0 + valid_lft forever preferred_lft forever + + +Observăm că a apărut o nouă interfață de rețea în sistem care nu are o componentă +fizică. Adresa IP setată pe această interfață este adresa care identifică +stațiile în rețeaua VPN-ului. Observați că ambele adrese de pe interfețele +``tun0`` sunt foarte similare. Asta înseamnă că cele două stații sunt acum în +aceeași rețea virtuală + +Recapitulare - Verificarea conexiunii între două stații +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Testați conectivitatea de pe stația ``openvpn-client1`` cu stația +``openvpn-client2``. Folosiți adresele IP configurate pe interfețele ``tun0`` de +pe fiecare stație. + +Modificarea drumului prin care trec datele +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Pentru a valida că datele chiar trec prin VPN, rulăm comanda +``traceroute 8.8.8.8`` și observăm că mesajele spre Internet nu trec prin +interfața ``eth0``. Mesajele trec prin interfața ``tun0``, ajung la serverul VPN +identifiat prin adresa ``192.168.255.1`` în pasul 1, iar abia apoi sunt lansate +mai departe spre Internet. -3) Controlul la distanță în mediul grafic ------------------------------------------ +.. code-block:: -Pentru controlul la distanţă în mod vizual le vom da doua exemple. + root@openvpn-client1:~# traceroute 8.8.8.8 + traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets + 1 192.168.255.1 (192.168.255.1) 6.033 ms 6.031 ms 5.881 ms + 2 10.10.10.253 (10.10.10.253) 8.582 ms 8.447 ms 8.306 ms + 3 10.0.2.2 (10.0.2.2) 8.165 ms 8.031 ms 7.808 ms + 4 * * * + 5 * * * + 6 r-c3550-l3-vlan11.bucharest.roedu.net (141.85.0.65) 8.308 ms 5.578 ms 4.876 ms + 7 172.31.255.93 (172.31.255.93) 4.681 ms 6.882 ms 6.855 ms + 8 po-23.acc1.buc.roedu.net (37.128.225.225) 16.711 ms 16.151 ms 16.751 ms + 9 bu-13.core2.buc.roedu.net (37.128.232.177) 9.248 ms 9.268 ms 9.232 ms + 10 hu-0-0-0-0.core3.nat.roedu.net (37.128.239.101) 8.510 ms 8.466 ms 6.542 ms + 11 te-0-6-0-1.peers1.nat.roedu.net (37.128.239.42) 6.347 ms 5.894 ms 5.987 ms + 12 google.interlan.ro (86.104.125.129) 31.665 ms 31.614 ms 31.529 ms + 13 108.170.252.65 (108.170.252.65) 31.506 ms 108.170.251.193 (108.170.251.193) 31.146 ms 108.170.252.1 (108.170.252.1) 31.591 ms + 14 172.253.73.153 (172.253.73.153) 31.795 ms 74.125.37.197 (74.125.37.197) 30.256 ms 74.125.37.167 (74.125.37.167) 30.068 ms + 15 dns.google (8.8.8.8) 29.710 ms 34.122 ms 30.538 ms -a. Controlul unei ferestre la distanţă -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Control folosind GUI host-at remote vor porni un browser pe o staţie remote. Le -vom arăta de X forwarding. +Astfel, datele care se vor îndrepta spre o destinație pot să depășească +anumite filtre bazate pe locație, deoarece locația de unde provin va +fi înlocuită de serverul VPN. -b. Controlul desktopului la distanţă -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Aceasta a fost o demonstrație a modului de lucru folosind ``openvpn`` în linie +de comandă pentru configurarea unui VPN folosind fișiere de configurare. Aceasta +nu este singura metodă de conectare la VPN, există implementări diferite, cum ar +fi WireGuard [#WireGuard]_ sau Cisco AnyConnect[#AnyConnect]_ care oferă același +serviciu dar implementat în mod diferit, oferind interfață grafică sau un mod +facil de configurare. -Pentru control complet al sesiunii le vom arăta să folosească TeamViewer. +.. rubric:: Notă de subsol -4) Securizarea conexiunii la Internet folosind un VPN ------------------------------------------------------ +.. [#Hamachi] + https://www.vpn.net/ -Pentru demonstrarea funcționalității de VPN le vom da 3 maşini virtuale, două -care nu se pot conecta între ele şi una care să fie un server de VPN şi le vom -arăta cum să se conecteze la VPN şi să observe că a apărut o nouă interfaţă şi -să încerce să dea ping între maşini şi să vadă că funcţionează acum. Aici putem -sa le dăm şi exemplu cu Hamachi. +.. [#WireGuard] + https://www.wireguard.com/ -Aici vom puncta şi faptul că tunelul în loc sa fie folosit ca o reţea privată -între mai multe calculatoare, poate fi folosit pentru a ieşi prin altă cale în -internet. Putem face asta cu “What’s my IP”, sau un serviciu similar. Este de -cugetat aici la nivel de infrastructură cum am putea face asta. +.. [#AnyConnect] + https://www.cisco.com/c/en/us/products/security/anyconnect-secure-mobility-client/index.html diff --git a/chapters/net/troubleshoot.rst b/chapters/net/troubleshoot.rst deleted file mode 100644 index 0594b4f..0000000 --- a/chapters/net/troubleshoot.rst +++ /dev/null @@ -1,104 +0,0 @@ -Verificarea conectivităţii la reţea -=================================== - -Vom descompune fiecare nivel din stiva TCP/IP (implicit, nu le vom spune -efectiv ce face tot stiva) şi le vom arăta cum arată ea la nivelul sistemului -de operare, respectiv cum se verifică dacă funcţionează corespunzător nivelul -respectiv. - -1) Interacţiunea cu nivelul fizic ---------------------------------- - -a. Investigarea nivelului fizic al rețelei -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Pentru primul nivel, nivelul fizic, le vom arăta, folosind poze, cum arată un -cablu de net, unde trebuie băgat, respectiv cum îţi dai seama că acel cablu -băgat are uplink. - -b. Configurarea reţelei în mediul grafic -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Le vom arăta cum să se conecteze la o reţea folosind interfaţa vizuală a unui -Desktop Environment, probabil GNOME - -c. Configurarea interfeţelor de reţea -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Le vom arăta output-ul comenzii `ip a s` şi le vom explica se înseamna fiecare -intrare de interfaţă şi ce înseamnă că o interfaţă este up. - -Îi punem sa dea `ip link set up` şi să vadă ce se schimbă la output-ul lui `ip a -s` şi să vadă că acum le merge netul. - -2) Configurarea nivelului Internet ----------------------------------- - -a. Configurarea unei adrese IP -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Le dăm o maşină care are interfaţa pornită, dar le arătăm ca nu are IP pe -interfaţă. Le arătăm comanda `dhclient ` pentru a obţine adresa IP şi -le arătăm că pot să dea ping la un calculator, dar nu se pot da ping la anumite -adrese IP. - -b. Inspectarea rutelor din sistem -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Le explicăm ce înseamnă o reţea de calculatoare şi de ce nu le merge să iasă din -reţeaua lor, că nu este setat un default gateway. Îi punem să dea `traceroute` -înainte şi după ce adaugă o rută de mână (sau putem să îi punem sa dea iar -dhclient, dar pe o altă maşină pe care este configurat dhclient să dea gateway) -şi îi punem să dea a doua oară traceroute, ca să vadă că iese din reţea acum. - -c. Configurarea gateway-ului -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Le explicăm ce înseamnă o reţea de calculatoare şi de ce nu le merge să iasă din -reţeaua lor, că nu este setat un default gateway. Îi punem să dea `traceroute` -înainte şi după ce adaugă o rută de mână (sau putem să îi punem sa dea iar -dhclient, dar pe o altă maşină pe care este configurat dhclient să dea gateway) -şi îi punem să dea a doua oară traceroute, ca să vadă că iese din reţea acum; - -d. Verificarea conectivității la o altă stație -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Le vom arăta cum să folosească comanda `ping` pentru a verifica conexiunea cu -diverse stații. - -Pentru a face troubleshooting facil este necesar să porniţi de la primul nivel -al stivei de reţea şi să verificaţi folosind comenzile de verificare de mai sus -(`ip address show`, `ip route show`, `traceroute`, `ping `, `ping -`) pentru a verifica funcţionalitatea fiecărui nivel. - -d. Investigarea serviciului DNS -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Le vom arăta cu o imagine cum funcţionează DNS-ul şi le vom arăta că poate fi -configurat temporar din /etc/resolv.conf, pentru a testa alte servere de DNS. - -Le vom arăta cum se foloseşte comanda `dig`, pentru a verifica răspunsurile de -la diverse DNS-uri, gen Google şi CloudFlare. - -3) Configurarea nivelului Transport ------------------------------------ - -a. Conectivitatea între aplicații de rețea folosind porturi -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Le arătăm că fiecare aplicaţie care vrea să răspundă la cereri se foloseşte de -porturi. Pentru asta vom folosi `netcat` pentru a deschide un port, iar apoi -vom folosi `netstat` pentru a vedea ca a fost deschis portul. - -b. Pornirea unei aplicaţii care folosește porturi -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Studenţii se vor conecta la portul deschis folosind `netcat`, şi vor scrie la -tastatura ceva pentru a apărea pe server. - -c. Conectarea TCP la o aplicație -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Vom pune studenţii sa se conecteze la portul 80 al unui site (cum ar fi -elf.cs.pub.ro) şi să vadă ce apare la terminal. Astfel, le vom explica ca -server-ele deschid un port la care se conectează serviciile client. diff --git a/index.rst b/index.rst index fb17517..37eb357 100644 --- a/index.rst +++ b/index.rst @@ -54,7 +54,7 @@ USO lab book :caption: Conectarea la Internet chapters/net/browser.rst - chapters/net/troubleshoot.rst + chapters/net/connection.rst chapters/net/services.rst chapters/net/extra.rst