This shows you the differences between two versions of the page.
rl:labs:08:contents:05 [2022/11/23 11:08] florin.stancu [5. [10p] Trafic criptat și necriptat] |
rl:labs:08:contents:05 [2023/11/05 12:55] (current) vlad_iulius.nastase |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ==== 5. [10p] Trafic criptat și necriptat ==== | + | ==== 05. [10p] Port forwarding ==== |
- | Traficul generat de servicii se clasifică în **trafic criptat** și **trafic în clar**. Traficul **în clar (necriptat)** poate fi interpretat și înțeles dacă este capturat. Traficul criptat nu poate fi interpretat în absența cheii de criptare; doar transmițătorul și receptorul cunosc cheia pentru a putea comunica. | + | La exercițiile de până acum am folosit NAT pentru a permite stațiilor cu adrese private dintr-o rețea locală să acceseze Internetul. NAT poate fi folosit și pentru a permite unei stații din rețeaua locală să fie accesată din Internet, adică să se inițieze conexiuni din Internet. Acest proces poartă numele de //port forwarding//. |
- | Ne propunem să analizăm, din punctul de vedere al criptării traficului, următoarele protocoale/servicii: | + | Dorim să putem accesa prin SSH, din Internet, stația ''red''. Acest lucru nu este posibil în mod implicit întrucât stația ''red'' are adresă IP privată. Soluția este "deschiderea unui port" pe gateway (adică stația ''host'') și redirectarea acestui port (//port forwarding//) către portul aferent serviciului SSH (portul TCP ''22'') de pe stația ''red''. |
- | * telnet (port TCP 23) | + | |
- | * SSH (port TCP 22) | + | |
- | * FTP (port TCP 21) | + | |
- | + | ||
- | Vom folosi ''tcpdump'', un utilitar cu ajutorul căruia putem captura pachetele care trec printr-un anumit server, pentru a afișa datele transmise (parolă). Vom folosi topologia de laborator și ne vom conecta de la stația ''red'' la stația ''green'' prin intermediul stației ''host''. | + | |
- | + | ||
- | Pentru a porni procesul de captură, autentificați-vă ca ''root'' pe stația ''host'' și rulați comanda<code bash> | + | |
- | root@host:~# tcpdump -vvv -A -i veth-green | + | |
+ | Vom aplica pe stația ''host'' o regulă prin care redirectăm traficul ce vine către ''host'' pe portul ''10022'' către portul ''22'' (SSH) al stației ''red'' (adresa IP ''192.168.1.2''):<code bash> | ||
+ | root@host:~# iptables -t nat -A PREROUTING -p tcp --dport 10022 -j DNAT --to-destination 192.168.1.2:22 | ||
</code> | </code> | ||
- | Pentru comunicație prin telnet, rulați pe stația ''red'' comanda<code bash> | + | Verificăm aplicarea regulii prin consultarea lanțului ''PREROUTING'' din tabela NAT:<code bash> |
- | root@red:~# telnet green | + | root@host:~# iptables -t nat -L PREROUTING -n -v |
+ | Chain PREROUTING (policy ACCEPT 1 packets, 474 bytes) | ||
+ | pkts bytes target prot opt in out source destination | ||
+ | 0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:10022 to:192.168.1.2:22 | ||
</code> | </code> | ||
- | În urma rulării comenzii ați realizat o conexiune telnet de la stația ''red'' la stația ''green'' prin intermediul stației ''host''. La prompt-ul generat de comandă folosiți username-ul ''student'' și parola ''student''; după aceea rulați comanda ''ls'' și apoi comanda ''exit'' pentru a închide conexiunea. Observați pe stația ''host'' captura credențialelor (username și parolă) transmise prin telnet între stațiile ''red'' și ''green'' => traficul telnet între cele două stații a fost **trafic în clar** și a fost capturat pe stația ''host''. | ||
- | Pentru comunicație prin FTP, rulați pe stația ''red'' comanda<code bash> | + | Pentru a verifica rezultatul de mai sus, de pe ''fep.grid.pub.ro'' deschidem un nou terminal și ne conectăm prin SSH folosind portul ''10022'' la stația ''host'':<code bash> |
- | root@red:~# ftp green | + | mihai.carabas@fep:~$ ssh -l student $ADRESA_IP_MV -p 10022 |
- | </code> | + | root@192.168.138.129's password: |
- | În urma rulării comenzii ați realizat o conexiune FTP de la stația ''red'' la stația ''green'' prin intermediul stației ''host''. La prompt-ul generat de comandă folosiți username-ul ''student'' și parola ''student''; după aceea rulați comanda ''ls'' și apoi comanda ''quit'' pentru a închide conexiunea. Observați pe stația ''host'' captura credențialelor (username și parolă) transmise prin FTP între stațiile ''red'' și ''green'' => traficul FTP între cele două stații a fost **trafic în clar** și a fost capturat pe stația ''host''. | + | [...] |
+ | root@red:~# | ||
+ | </code> unde ''$ADRESA_IP_MV'' este adresa IP a masinii virtuale obținută din dashboard-ul OpenStack. | ||
+ | <spoiler Pentru rulare masina virtuala VMware local> | ||
+ | Daca rulați VMware local, ''$ADRESA_IP_MV'' este adresa interfeței ''eth0'' a stației ''host''. | ||
+ | </spoiler> | ||
- | Pentru comunicație prin SSH, rulați pe stația ''red'' comanda<code bash> | + | Observăm că în urma autentificării ne găsim pe stația ''red''. //Port forwarding// a funcționat. |
- | root@red:~# ssh -l student green | + | |
+ | Folosim comanda de conectare SSH la stația ''host'' de pe stația ''green'':<code bash> | ||
+ | root@green:~# ssh -l student host -p 10022 | ||
+ | [...] | ||
+ | root@red:~# | ||
</code> | </code> | ||
- | În urma rulării comenzii ați realizat o conexiune SSH de la stația ''red'' la stația ''green'' prin intermediul stației ''host''. În sesiunea de shell deschisă la distanță, rulați comanda ''ls'' și apoi comanda ''exit'' pentru a închide conexiunea. Observați că pe stația ''host'', ''tcpdump'' nu afișează informații în clar, traficul SSH între cele două stații fiind **criptat** și transmis într-un format binar. | ||
- | Pe stația ''host'', pentru a opri comanda ''tcpdump'' folosiți combinația de taste ''Ctrl+c''. | + | Observăm că și de pe stația ''green'' am accesat stația ''red'' prin //port forwarding//. Dorim să limităm //port forwarding// doar pentru conexiuni de la stațiile din Internet. Pentru aceasta trebuie să actualizăm regula de //port forwarding//. |
- | <note> | + | Ștergeți regula de //port forwarding// și adăugați o regulă nouă care să permită **doar** stațiilor din Internet să acceseze prin //port forwarding// stația ''red''. |
- | Traficul telnet și FTP este trafic necriptat (în clar), în timp ce traficul SSH este trafic criptat. | + | |
+ | <note tip> | ||
+ | Aplicați regula doar pentru pachetele ce **sosesc** pe interfața ''eth0''. Adică ''eth0'' este interfața de **intrare**. Folosiți opțiunea ''-i'' a ''iptables'' pentru precizarea interfeței de **intrare**. | ||
</note> | </note> | ||
+ | |||
+ | Realizați apoi din nou conectare SSH pe portul ''10022'' al stației ''host'' de pe ''fep.grid.pub.ro'' și de pe stația ''green''. Dacă ați configurat corect, nu va merge conexiunea SSH de pe stația ''green'' dar va merge în continuare de pe ''fep.grid.pub.ro''. | ||
+ | |||
+ | <hidden> | ||
+ | <solution> | ||
+ | Ștergem vechea regulă și aplicăm regula nouă, ce ține cont de interfața de intrare:<code bash> | ||
+ | root@host:~# iptables -t nat -D PREROUTING -p tcp --dport 10022 -j DNAT --to-destination 192.168.1.2:22 | ||
+ | root@host:~# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 10022 -j DNAT --to-destination 192.168.1.2:22 | ||
+ | root@host:~# iptables -t nat -L PREROUTING -n -v | ||
+ | Chain PREROUTING (policy ACCEPT 1 packets, 474 bytes) | ||
+ | pkts bytes target prot opt in out source destination | ||
+ | 0 0 DNAT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:10022 to:192.168.1.2:22 | ||
+ | </code> | ||
+ | Verificăm conectarea de la ''fep.grid.pub.ro'' și de la stația ''green''. Prima merge în continuare, dar a doua nu mai merge:<code bash> | ||
+ | mihai.carabas@fep:~$ ssh $ADRESA_IP_VM -p 10022 | ||
+ | root@host.local's password: | ||
+ | [...] | ||
+ | root@red:~# | ||
+ | |||
+ | root@green:~# ssh -l student host -p 10022 | ||
+ | ssh: connect to host host port 10022: Connection refused | ||
+ | </code> | ||
+ | </solution> | ||
+ | </hidden> |