This is an old revision of the document!


Laborator 07 - Servicii de rețea

Suport laborator

Resurse laborator

Pentru rezolvarea exercițiilor aveți nevoie de mașina virtuală puccini.

În sala EG306, mașina virtuală se află pe partiția de 10 GB.

În sala EG106, imaginea de mașină virtuală se află la /mnt/unfrozen/uso/mv/puccini-lab7.ova.

Credențialele de autentificare în cadrul mașinii virtuale sunt:

  • nume de utilizator: student
  • parola: student

Verificați existența lor pe mașina de lucru. Dacă nu există, chemați asistentul sau descărcați-o chiar voi pe parcursul demo-ului.

Demo

Stațiile în Internet se pot identifica după adresă IP sau după nume de domeniu (rezolvabil la o adresă IP prin DNS). Despre aceasta vom afla mai multe în laboratorul următor. Până atunci, acestea sunt pentru noi doar niște identificatori ai stațiilor.

1. Conexiune la distanță

Telnet

Telnet (TELetype NETwork) este un serviciu de tip client-server. In mod implicit nu există nicio diferență între resursele disponibile unui utilizator ce rulează un interpretor local și unul ce rulează prin telnet. Pentru a iniția o conexiune folosim comanda telnet trebuie să specificăm adresa stației unde dorim să ne conectăm și pe această stație trebuie să ruleze un server de telnet.

Pentru a folosi serviciul Telnet pe masina virtuala, rulati in prealabil sudo apt-get install telnetd pe masina virtuala.

La mașina virtuală puccini ne conectăm folosind IP-ul 192.168.56.101. Pe ea rulează un server de telnet

student@uso:~$ telnet 192.168.56.101 -l student
Trying 192.168.56.101...
Connected to 192.168.56.101.
Escape character is '^]'.
 
Ubuntu 14.04.1 LTS
 
puccini login: student
Password: 
Last login: Sun Aug  2 13:45:53 EEST 2015 from 192.168.56.1 on pts/1
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-39-generic i686)
 
 * Documentation:  https://help.ubuntu.com/
student@puccini:~$ 
student@puccini:~$ 
student@puccini:~$ pwd
/home/student

Telnet nu criptează datele! Asta înseamnă că toate parolele transmise prin telenet sunt transmise în clar, și toată comunicația poate fi foarte ușor interceptată. Din această cauză utilizarea telnet-ului este descurajată.

SSH

SSH (Secure Shell) este un serviciu de acces la distață securizat. Funcționează similar cu telnet dar, spre deosebire de acesta, toată comunicația este criptată. Din această cauză este serviciul pe care îl veți folosi cel mai des atunci când va trebui să lucrați pe o stație la distanță. Comanda pentru a iniția o conexiune este ssh. Ea primeste un argument de forma user@host, unde user este numele utilizatorului drept care dorim să ne autentificăm și host este adresa stației pe care dorim să ne autentificăm.

student@uso:~$ ssh student@192.168.56.101
student@192.168.56.101's password: 
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-39-generic i686)

 * Documentation:  https://help.ubuntu.com/
Last login: Sun Aug  2 14:01:44 2015 from 192.168.56.1
student@puccini:~$ 
student@puccini:~$ 
student@puccini:~$ pwd
/home/student
student@puccini:~$ 

Netcat

Deși nu este un serviciu de conexiune la distanță vom începe cu netcat. Acest serviciu permite crearea de conexiuni între două mașini. Prin aceste conexiuni pot apoi circula date, aceste date fiind o conversație, rezultatul unei comenzi sau conținutul unui fișier. Pentru a folosi netcat pentru a crea o conexiune între două mașini vom rula comanda nc pe ambele mașini. Serviciul este unul de tip client-server deci una dintre mașini va avea rolul de client (va transmite date) iar cealaltă de server (va asculta după conexiuni și date noi).

Pentru a porni netcat în modul de transmisie vom rula o comandă de tipul nc 192.168.0.1 1234, unde 192.168.0.1 este adresa IP a mașini căreia dorim să îi transmitem date, iar 1234 este portul pe care să transmită (poate fi orice număr dar unele porturi sunt deja folosite, și nu pot fi folosite și de netcat). Comanda va prelua date la intrarea standard si le va transmite destinației pe portul specificat până când întâlnește simbolul EOF (end-of-file, poate fi generat prin combinația de taste CTRL+d).

Rețineți, cum am învățat in laboratorul 6, că puteți să redirectați intrarea comenzii să provină dintr-un fișier (folosind operatorul <) sau rezultatul altei comenzi (printr-un pipe, |).

Pentru a porni netcat în modul de ascultare vom rula o comandă de tipul nc -l 1234, unde argumentul -l specifică pornirea în starea de ascultare iar 1234 este portul pe care să asculte. Comanda va asculta pe portul respectiv până la întâlnirea simbolului EOF.

Pentru a funcționa comunicarea între doua mașini trebuie să rulăm netcat cu același port pe ambele mașini.

Să vedem un exemplu de comunicație între mașina gazdă (calculatorul din EG306/EG106) și mașina virtuală puccini.

Pe puccini vom porni un server de netcat:

student@puccini:~$ netcat -l 4444

Deși nu pare că face nimic, puccini ascultă pe portul 4444 după mesaje. Să îi trimitem unul:

student@eg306:~$ nc 192.168.56.101 4444
tosca
 
[CTRL+d]

Mergem din nou pe terminalul deschis din puccini și observăm că am primit tosca. Puteam face și direct trimiterea, folosind pipe-uri:

student@eg306:~$ echo "tosca" | nc 192.168.56.101 4444

Prin netcat putem transfera conținutul unor fișiere text tot folosind pipe-uri:

student@puccini:~$ netcat -l 4444
student@eg306:~$ cat song.txt 
nessun dorma
student@eg306:~$ cat song.txt | nc 192.168.56.101 4444
student@puccini:~$ netcat -l 4444
nessun dorma

2. Transfer de fișiere

Până acum am folosit servicii de rețea pentru a transforma informații sub formă de mesaje, comenzi sau rezultatul acestora. Putem să le folosim și pentru a transfera fișiere. Probabil cel mai cunoscut dintre aceste servicii este BitTorrent (există și transmission-cli pentru download torrente în linia de comandă).

Utilitarul wget

Acest utilitar ofera suport pentru a descărca pagini și fișiere folosind două protocoale foarte comune, HTTP (HyperText Transfer Protocol) și FTP (File Transfer Protocol). Comanda pentru a-l folosi este wget, căreia îi vom transmite ca argument URL-ul (Universal Resource Locator) resursei pe care dorim să o descărcăm.

student@uso:~$ wget http://ocw.cs.pub.ro/courses//res/sigla_uso.png
[...]
100%[=============================>] 44.091      --.-K/s   in 0,08s   

2014-11-18 01:29:52 (524 KB/s) - ‘sigla_uso.png’ saved [44091/44091]

student@uso:~$ wget ftp://swarm.cs.pub.ro/exec.zip
[...]

100%[=============================>] 13.961.705   636KB/s   in 21s    

2014-11-18 01:32:33 (635 KB/s) - ‘exec.zip’ saved [13961705]

Descărcarea are loc în mod neinteractiv ceea ce face ca acest utilitar să poată fi folosit eficient în script-uri.

Utilitarul scp

SCP (Secure CoPy) este un utilitar ce permite transferul de fișiere între stațiile din rețea. El folosește ssh pentru a transfera datele deoarece acesta oferă deja suport pentru autentificare și criptare. Pentru a putea fi folosit pe stația remote trebuie să ruleze un server ssh.

Comanda pentru a folosi acest utilitar este scp. Sintaxa este asemănătoare comenzii cp: scp sursă destinație. Diferența este că oricare sau ambele dintre sursă și destinație pot referi fișiere sau directoare ce se află pe o altă stație decât cea pe care introducem comanda. În cazul în care vrem să referim un fișier de pe o altă statie trebuie să prefixăm calea către acel fișier cu user@host:, unde, la fel ca în cazul lui ssh, user este numele utilizatorului drept care dorim să ne autentificăm și host este adresa IP a stației pe care dorim să ne autentificăm.

Atenție la user@host: versus user@host (fără 2 puncte la final). Dacă folosim ca destinație a doua nu se va face nici un transfer remote, ci va fi creat un fișier cu numele user@host.

Exemple:

  • Copierea unui fișier local către o destinație remote
student@uso:~$ scp ~/foo.txt student@192.168.56.101:~/
student@192.168.0.114's password: 
foo.txt                                       100%    0     0.0KB/s   00:00    
  • Copierea unui fișier de pe o stație remote pe stația locală
student@uso:~$ scp student@192.168.56.101:~/bar.txt .
student@192.168.0.114's password: 
bar.txt                                       100%    0     0.0KB/s   00:00    

Exerciții

Deschideți un teminal nou folosind combinația de taste Alt+Ctrl+t. Montati sistemul de fișiere unfrozen folosind comanda:

student@uso:~$ sudo mount /dev/sda7 /mnt/unfrozen

La fiecare exercițiu citiți cu atenție care parte a exercițiului trebuie rezolvată pe sistemul fizic și care trebuie rezolvată pe mașina virtuală.

Sistemul fizic se referă la sistemul fizic din sala de laborator (rulând Ubuntu GNOME 16.04), în vreme ce mașina virtuală se referă la mașina virtuală puccini pornită prin VirtualBox.

0. Pregătire setup (1p)

De rezolvarea acestui exercițiu depind toate celelalte. Chemați asistentul de fiecare dată când întâmpinați probleme majore.

Deschideți VirtualBox și importați fișierul puccini-lab7.ova.

Pentru a deschide mașina virtuală urmați pașii:

  • Porniți virtualbox. Fie folosiți Alt+F2 și tastați virtualbox. Fie porniți virtualbox de pe Desktop. Fie folosiți comanda virtualbox în linia de comandă.
  • Folosiți opțiunea File -> Import Appliance pentru a ajunge la interfața de import.
  • În interfața de import navigați în root filesystem în calea unde menținută imagina de mașină virtuală.

Atenție: când importați mașina în VirtualBox, să bifați opțiunea Reinitialize the MAC address of all network cards!

Avem nevoie de o interfață host-only. E posibil ca atunci când importâm mașina virtuală să primim eroarea Invalid settings detected. Soluția este că trebuie să adăugăm o interfață virtuală de rețea care să conecteze sistemul fizic de mașina virtuală. Aceasta se face astfel:

Din VirtualBox mergem la File –> Preferences –> Network. Mergem la tab-ul Host-only Networks și apăsăm butonul de add. Urmăriți detalii în poza de mai jos:

Observați că s-a adăugat o nouă interfață vboxnet0.

1. Conectarea la fep.grid.pub.ro (1p)

Vrem să ne conectăm la un sistem la distanță; alegem sistemul fep.grid.pub.ro.

Conectați-vă de pe sistemul fizic prin SSH la stația fep.grid.pub.ro. Numele utilizatorului pe care trebuie să îl folosiți este numele utilizator vostru pe cs.curs.pub.ro. Spre exemplu, dacă numele utilizatorul de pe cs.curs.pub.ro ar fi ion.popescu atunci comanda ar fi ssh ion.popescu@fep.grid.pub.ro.

Anunțați asistentul în cazul în care aveți probleme cu autentificarea. Acest pas va fi necesar în cadrul examenului de mid-term și final.

În cazul unei conectări reușite prompt-ul se va schimba într-un prompt de forma:

[ion.ionescu@fep-62-1 ~]

După ce v-ați conectat pe sistemul fep.grid.pub.ro deconectați-vă folosind comanda exit sau combinația de taste Ctrl+d.

După rularea comenzii promtp-ul va reveni la valoarea cunoscută, specifică mașinii fizice, adică va avea forma:

student@asgard:~$

2. Acces prin SSH la mașina virtuală (2p)

Exercițiul se desfășoară folosind mașina virtuală puccini

Înainte de a începe rezolvarea acestui exercitiu, rulați în mașina virtuală următoarea comandă:

student@puccini:~$ echo 127.0.0.1 puccini | sudo tee -a /etc/hosts

Pentru a lucra mai ușor, dorim să ne conectăm prin SSH la mașina virtuală.

Pentru început, faceți configurările necesare pe mașina virtuală astfel încât să vă puteți conecta prin SSH de pe sistemul fizic.

Rețineți că pentru a putea să vă conectați prin SSH la o mașină pe aceasta trebuie să ruleze un server de SSH.

Pentru a verifica dacă serviciul SSH rulează folosi comanda

sudo service ssh status

Pentru a opri, porni și reporni seriviciul de SSH folosiți comenzile

sudo service ssh stop
sudo service ssh start
sudo service ssh restart

În mod generic, folosiți comenzi de forma

sudo service <service-name> status
sudo service <service-name> stop
sudo service <service-name> start
sudo service <service-name> restart

pentru a afla informații despre, sau pentru a opri, porni sau reporni serviciul identificat de <service-name>. Exemple sunt ssh, postfix, apache2, cron și altele, depinzând ce servicii sunt instalate și configurate pe sistemul vostru.

Acum, cu serverul SSH pornit pe mașina virtuală, conectați-vă la mașina virtuală.

Pentru a afla adresa IP a mașinii virtuale unde trebuie să faceți SSH folosiți, în interfața VirtualBox a mașinii virtuale, comanda:

ip address show dev eth1

Dacă a reușit conectarea prin SSH prompt-ul va fi schimbat într-un prompt de forma

student@puccini:~$

După ce vă conectați prin SSH la mașina virtuală deconectați-vă folosind comanda exit sau combinația de taste Ctrl+d.

3. Autentificare prin SSH fără parolă. Chei publice/private (1.5p)

3.1. Generarea unei perechi de chei SSH (0.75p)

Acum că avem acces prin SSH la mașina virtuală, dorim să nu mai trebuiască să ne introducem parola atunci când deschidem o noua conexiune. Pentru aceasta va trebui să stabilim o autentificare bazată pe chei. Primul pas este să generăm o pereche de chei SSH pe sistemul fizic.

Căutați o comandă care să genereze chei pentru autentificare. Pentru a o găsi trebuie să căutați printre paginile de manual, folosind comanda apropos (vedeți laboratorul 2). Pentru a găsi comanda dorită folosiți comanda

apropos ssh

Comanda pe care o căutați sigur are legătura cu authentication și key *wink*. Dacă ați găsit comanda, când o apelați nu trebuie să specificați niciun parametru.

La rularea comenzii, furnizați valorile implicite. Adică apăsați ENTER pentru fiecare informație pe care v-o cere.

Pentru a verifica generarea cu succes de chei, folosiți comanda de mai jos. Ar trebui să obțineți un output similar:

student@asgard:~$ ls ~/.ssh/
id_rsa id_rsa.pub

3.2. Copierea remote a cheii (0.75p)

Am reușit să generăm o pereche de chei pentru autentificare prin SSH. Această pereche este formată dintr-o cheie publică și una privată. Pentru a ne putea autentifica fără a mai introduce parola trebuie să ne instalăm cheia publică de pe sistemul fizic.

Ne propunem să copiem cheia publică SSH de pe sistemul fizic pe mașina virtuală.

Deși există mai multe variante de a realiza acest sarcină, cea mai simplă este să folosim comanda ssh-copy-id. Comanda ssh-copy-id copiază cheia la distanță, pe sistemul pe care vreți să vă autentificați.

Sintaxa ei este asemănătoare cu cea a comenzii ssh, adică este urmată de o construcție de forma <username>@<IP>, unde <username> este numele utilizatorului iar <IP> este adresa IP a sitemului de la distanță.

În cazul de față veți folosi comanda ssh-copy-id pe sistemul fizic pentru a copia cheia la distanță, pe mașina virtuală, folosind o comandă de foma

ssh-copy-id student@<IP-VM>

unde <IP-VM> este adresa IP a mașinii virtuale.

Există riscul unor erori la conectarea prin SSH. Ca să nu aveți aceste erori, să rulați, pe sistemul fizic comanda:

ssh-add

După ce ați copiat cheia, conectați-vă la mașina virtuală folosind o comandă de forma ssh student@<IP-VM>, unde <IP-VM> este adresa IP a mașinii virtuale. Dacă ați configurat cum trebuie, ar trebui să vă conectați la mașina virtuală fără parolă.

Dacă ați dat cheii alt nume decât cel implicit, trebuie să specificați calea către cheie folosind parametrul -i. De exemplu, ssh -i private_key student@172.16.14.133.

4. Determinarea adresei IP publice (1.5p)

Pe sistemul fizic, folosind utilitarul curl și site-uri precum http://checkip.dyndns.org sau http://ipecho.net/plain sau http://icanhazip.com/, determinați, folosind linia de comandă, adresa voastră IP publică.

Atenție! Trebuie să afișați doar adresa IP, nimic altceva pe lângă. Nu aveți nevoie de filtre de text avansate (cut, sed, awk etc.).

Urmăriți și indicațiile de aici.

5. Descărcarea automată a unui fișier (1p)

[0.5p] Creați un script care descarcă fișierul acesta, însă doar dacă el nu există deja în directorul curent.

Acest script trebuie să execute doi pași:

  1. Să verifice existența fișierului
  2. Să descarce fișierul

O comandă ce returnează un cod de eroare în cazul în care fișierul trimis ca parametru nu există este comanda ls iar pentru a executa o comandă doar dacă cea precedentă s-a terminat cu eșec înlănțuim cele două comenzi prin operatorul ||.

[0.5p] Extindeți script-ul creat la exercițiul anterior astfel încât la fiecare rulare a scriptului fișierul respectiv să fie copiat în directorul home al utilizatorului student de pe mașina virtuală.

Pentru a copia fișiere între cele două mașini puteți folosi comanda scp.

Trebuie să oferiți permisiuni de execuție scriptului pe care îl creați folosind comanda

chmod a+x <nume-script>

unde <nume-script> este numele scriptului pe care l-ați creat.

6. Descărcarea automată a unui fișier prin autentificare (1p)

Ne propunem să descărcăm acest fișier din linie de comandă. Din păcate dacă dăm direct wget vom observa următoarea eroare:

student@uso:~$ wget http://repository.grid.pub.ro/cs/uso/USO-Mint-VM.ova.torrent
--2015-08-02 14:42:20--  http://repository.grid.pub.ro/cs/uso/USO-Mint-VM.ova.torrent
Resolving repository.grid.pub.ro (repository.grid.pub.ro)... 141.85.241.53
Connecting to repository.grid.pub.ro (repository.grid.pub.ro)|141.85.241.53|:80... connected.
HTTP request sent, awaiting response... 401 Authorization Required
 
Username/Password Authentication Failed.

Găsiți o modalitate prin care putem descărca fișierul autentificându-ne folosind credențialele de pe cs.curs.pub.ro. Nu dați parola în linie de comandă. Hint man wget, ask-password sau căutați pe Google după wget secure password.

7. Torrents download from command line [1p]

Pentru acest exercițiu avem nevoie de pachetul rtorrent. Îl putem instala folosind comanda

student@midgard:~$ sudo apt-get install rtorrent

Folosiți rtorrent în linie de comandă pentru a descărca o imagine de Linux Mint de aici. Este vorba de fișierul numit linuxmint-13-cinnamon-dvd-32bit.iso.torrent. Descărcați fișierul linuxmint-13-cinnamon-dvd-32bit.iso.torrent în /home/student/Downloads/, folosind wget.

Pentru a descărca fișierul .torrent folosind wget urmați pașii:

  1. Accesați link-ul din browser.
  2. În fereastra nou dechisă în browser, dați click dreapta pe link-ul aferent fișierului linuxmint-13-cinnamon-dvd-32bit.iso.
  3. Folosiți din meniul contextual (apărut la click dreapta) opțiunea Copy link location (sau similar pentru browserul vostru).
  4. Deschideți un terminal.
  5. Schimbați directorul în /home/student/Downloads/,
  6. Tastați comanda wget și un caracter spațiu.
  7. Folosiți combinația de taste Shift+Insert pentru a face paste la link-ul copiat (link-ul către fișierul .torrent).
  8. Rulați comanda, care va copia astfel, fișierul în directorul curent.

Este vorba de alt fișier .torrent decât cel folosit la exercițiul anterior: 6. Descărcarea automată a unui fișier prin autentificare (1p).

Apoi folosiți rtorrent pentru a descărca conținutul torrent-ului indicat de fișierul linuxmint-13-cinnamon-dvd-32bit.iso.torrent.

[BONUS 1] Netcat web server (2 karma WoUSO)

Exercițiul se desfășoară pe mașina virtuală puccini

Deschideți un editor text și creați fișierul index.html având următorul conținut:

HTTP/1.1 200 OK
Date: Fri, 31 Dec 1999 23:59:59 GMT
Content-Type: text/html
Content-Length: 258


<html>
        <head>
                <title>USO Rulz</title>
        </head>
        <body>
                <h1>Yep, USO Rulz</h1>
                <h2>Subheading problems?</h2>
                <p>Sample paragraph text. It works!</p>
        </body>
</html>

Pe mașina virtuală puccini porniți un server web folosind netcat pe portul 8888 astfel încât deschizând un browser la adresa http://192.168.56.101:8888 să vedem rezultatul HTML-ului de mai sus.

Pentru încă 1 karma point îmbunătățiți serverul astfel încât să servească permanent (netcat listener-ul să nu fie închis după ce a deschis cineva pagina în browser).

Dacă doriți să copiați conținutul fișierului într-un fișier index.html, cel mai bine folosiți ca editor gedit.

uso/laboratoare/laborator-07.1510246513.txt.gz · Last modified: 2017/11/09 18:55 by costin.carabas
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0