This shows you the differences between two versions of the page.
rl:labs:08:contents:08 [2020/12/01 10:12] iulia.florea removed |
rl:labs:08:contents:08 [2023/11/05 12:56] (current) vlad_iulius.nastase |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ==== 8. [5p] Blocare servicii necriptate ==== | + | ==== 08. [10p] Port forwarding pentru telnet ==== |
- | După cum ați observat la punctul anterior, traficul pentru protocoalele telnet și FTP este trafic în clar, necriptat, putându-se afla cu ușurință credențialele unui anumit cont și comenzile rulate. | + | În cadrul exercițiilor anterioare am activat //port forwarding// pentru serviciul SSH. Dorim ca stațiile ''red'', ''green'' și ''blue'' să fie accesibile și prin ''telnet'' din Internet astfel: |
+ | * ''red'' să poată fi accesat folosind portul 10023 | ||
+ | * ''green'' să poată fi accesat folosind portul 20023 | ||
+ | * ''blue'' să poată fi accesat folosind portul 30023 | ||
- | Ne propunem să blocăm accesul de la stația ''red'' către stația ''green'' pentru aceste servicii, configurând ruterul dintre cele două stații, adică stația ''host''. Practic vom configura pe stația ''host'' opțiuni de firewall cu ajutorul utilitarului ''iptables''. | + | Realizați configurațiile necesare pentru a permite //port forwarding// pentru ''telnet'' așa cum este descris mai sus. |
- | <spoiler Prezentare scurtă iptables (dați click)> | + | <note> |
- | ''iptables'' este un utilitar Linux care oferă și rol de firewall software. ''iptables'' folosește suportul nucleului pentru a intercepta pachete de rețea în diverse puncte ale trecerii acestora prin nucleu și a efectua acțiuni asupra acestora. Astfel de acțiuni sunt: | + | Serviciul ''telnet'' ascultă în mod implicit conexiuni pe portul ''23''. Puteți observa acest lucru cu ajutorul uneia dintre comenzile de mai jos:<code> |
- | * acceptarea pachetului (''ACCEPT'') | + | user@host:~$ grep -w 'telnet' /etc/services |
- | * respingerea pachetului (''REJECT'') | + | telnet 23/tcp |
- | * aruncarea pachetului (''DROP''), similar cu respingerea dar nu se transmite nici o notificare de respingere către cel care a transmis pachetul inițial | + | tfido 60177/tcp # fidonet EMSI over telnet |
- | O diagramă a drumului urmat de un pachet de rețea în nucleu este [[https://commons.wikimedia.org/wiki/File:Diagrama_linux_netfilter_iptables.png|aici]]. | + | user@host:~$ getent services telnet |
- | + | telnet 23/tcp | |
- | Comanda ''iptables'' înseamnă lucrul cu reguli de filtrare de la nivelul nucleului. În mod obișnuit se va preciza: | + | |
- | * tipul de operație pe regulă (adăugare, ștergere, înlocuire, inserare) | + | |
- | * punctul din nucleul în care trebuie să se găsească pachetul pentru a se aplica regula | + | |
- | * regula în sine | + | |
- | + | ||
- | De exemplu, comanda de mai jos are semnificația descrisă în continuare:<code bash> | + | |
- | iptables -A FORWARD -d green -p tcp --dport telnet -j REJECT | + | |
</code> | </code> | ||
- | * ''-A'': se adaugă regulă (este vorba de //append//, se adaugă la finalul listei de reguli); | + | </note> |
- | * ''FORWARD'': regula se aplică pachetelor care vor fi rutate; alte variante sunt ''INPUT'' (pachetele primite direct de sistem) și ''OUTPUT'' (pachetele care pleacă de la sistem); | + | |
- | * ''-d green'': sunt selectate pachetele care au ca destinație adresa stației ''green''; | + | |
- | * ''-p tcp'': pachetele selectate sunt pachete TCP; | + | |
- | * ''%%--%%dport telnet'': portul TCP destinație este portul specific protocolului telnet (adică portul ''23'', identificat din fișierul ''/etc/services'') | + | |
- | * ''-j REJECT'': pachetul este respins | + | |
- | În tabela de filtrare aferentă ''iptables'' vom avea, așadar, o listă de reguli care sunt parcurse secvențial. Partea ''-A FORWARD'' identifică lanțul de reguli, partea ''-d green -p tcp %%--%%dport telnet'' este partea de **match** (ce pachete fac match pe regulă), iar partea ''-j REJECT'' este partea de **acțiune** (ce face regula cu pachetul). | + | <note> |
- | </spoiler> | + | Exercițiul este academic. Nu este indicată folosirea ''telnet'' cu atât mai puțin //port forwarding// peste ''telnet'' din rațiuni de securitate. |
+ | </note> | ||
- | Autentificați-vă prin SSH ca ''root'' pe stația ''host''. Pentru a bloca accesul la serviciul telnet (port 23) destinat stației ''green'', rulați pe stația ''host'' comanda de mai jos. Comanda adaugă regula ''iptables'' corespunzătoare.<code bash> | + | Testați de pe ''fep.grid.pub.ro'' folosind comanda ''telnet'':<code bash> |
- | root@host:~# iptables -A FORWARD -d green -p tcp --dport telnet -j REJECT | + | mihai.carabas@fep:~# telnet <adresa-ip-vm> <port-redirectat> |
</code> | </code> | ||
- | Pentru a verifica adăugarea regulii de mai sus, rulați pe stația ''host'' comanda<code bash> | + | unde ''<adresa-ip-vm>'' este adresa IP a mașinii virtuale vizibilă de pe fep iar ''<port-redirectat>'' este portul care face redirectarea pe stația ''host'' (''10023'' sau ''20023'' sau ''30023''). |
- | root@host:~# iptables -L FORWARD | + | |
- | Chain FORWARD (policy ACCEPT) | + | |
- | target prot opt source destination | + | |
- | REJECT tcp -- anywhere green tcp dpt:telnet reject-with icmp-port-unreachable | + | |
- | </code> | + | |
- | Pentru a afișa informații și despre pachetele prelucrate și interfețele folosite, rulați pe stația ''host'' comanda<code bash> | + | <note important> |
- | root@host:~# iptables -L FORWARD -v | + | Există o latență de circa 10-15 secunde din momentul conectării până la apariția promptului ''telnet''. Așteptați să apară promptul și apoi autentificați-vă cu username ''student'' și parolă ''student'' pentru a valida conectivitatea. |
- | Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) | + | |
- | pkts bytes target prot opt in out source destination | + | |
- | 0 0 REJECT tcp -- any any anywhere green tcp dpt:telnet reject-with icmp-port-unreachable | + | |
- | </code> | + | |
- | + | ||
- | Pentru a afișa informații în format numeric (pentru nume de stații și nume de porturi), rulați pe stația ''host'' comanda<code bash> | + | |
- | root@host:~# iptables -L FORWARD -v -n | + | |
- | Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) | + | |
- | pkts bytes target prot opt in out source destination | + | |
- | 0 0 REJECT tcp -- * * 0.0.0.0/0 192.168.2.2 tcp dpt:23 reject-with icmp-port-unreachable | + | |
- | </code> | + | |
- | De acum înainte recomandăm folosirea acestor opțiuni (''-v -n'') pentru listarea regulilor ''iptables''. | + | |
- | + | ||
- | Pentru a verifica blocarea traficului telnet către ''green'', rulați pe stația ''red'' comanda<code bash> | + | |
- | telnet green | + | |
- | </code> | + | |
- | + | ||
- | Vă apare un mesaj de forma<code> | + | |
- | Trying 192.168.2.2... | + | |
- | telnet: Unable to connect to remote host: Connection refused | + | |
- | </code> semnificând faptul că se încearcă realizarea conexiunii dar conexiunea este respinsă | + | |
- | + | ||
- | Pentru a vedea că regula de blocare a funcționat, rulați din nou pe stația ''host'' comanda<code bash> | + | |
- | root@host:~# iptables -L FORWARD -v -n | + | |
- | Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) | + | |
- | pkts bytes target prot opt in out source destination | + | |
- | 2 120 REJECT tcp -- * * 0.0.0.0/0 192.168.2.2 tcp dpt:23 reject-with icmp-port-unreachable | + | |
- | </code> | + | |
- | Observați, în output-ul comenzii, că există acum valori diferite de 0 în coloana ''pkts'' și ''bytes'', semn că au fost pachete prelucrate de această regulă, deci blocate. | + | |
- | + | ||
- | Pentru a verifica funcționarea în continuare a altor conexiuni (diferite de telnet) de la ''red'' la ''green'', rulați pe stația ''red'' comenzile<code bash> | + | |
- | ftp green | + | |
- | ssh -l student green | + | |
- | </code> | + | |
- | + | ||
- | Dorim să blocăm și celălalt serviciu necriptat, FTP. Adăugați o regulă ''iptables'' similară pentru a bloca, pe stația ''host'', traficul FTP destinat stației ''green''. După adăugarea regulii folosiți ''iptables -L FORWARD -n -v'' pentru a valida adăugarea regulii. | + | |
- | + | ||
- | <note tip> | + | |
- | Pentru această regulă puteți transmite argumentul ''21'' opțiunii ''%%--%%dport'' sau chiar numele ''ftp''. Asocierea între port (număr) și protocol (nume) se găsește în fișierul ''/etc/services''. | + | |
</note> | </note> | ||
- | |||
- | De pe stația ''red'' verificați blocarea traficului FTP către stația green folosind comanda<code bash> | ||
- | ftp green | ||
- | </code> | ||
<hidden> | <hidden> | ||
<solution> | <solution> | ||
- | <code bash> | + | Adăugăm cele trei noi reguli pentru redirectarea ''telnet'' și validăm adăugarea lor:<code bash> |
- | root@host:~# iptables -A FORWARD -d green -p tcp --dport ftp -j DROP | + | root@host:~# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 10023 -j DNAT --to-destination 192.168.1.2:23 |
- | root@host:~# iptables -L FORWARD -n -v | + | root@host:~# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 20023 -j DNAT --to-destination 192.168.2.2:23 |
- | Chain FORWARD (policy ACCEPT 94 packets, 10307 bytes) | + | root@host:~# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 30023 -j DNAT --to-destination 192.168.3.2:23 |
+ | root@host:~# iptables -t nat -L PREROUTING -n -vChain PREROUTING (policy ACCEPT 0 packets, 0 bytes) | ||
pkts bytes target prot opt in out source destination | pkts bytes target prot opt in out source destination | ||
- | 2 120 DROP tcp -- * * 0.0.0.0/0 192.168.2.2 tcp dpt:23 | + | 2 120 DNAT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:10022 to:192.168.1.2:22 |
- | 0 0 DROP tcp -- * * 0.0.0.0/0 192.168.2.2 tcp dpt:21 | + | 3 180 DNAT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:20022 to:192.168.2.2:22 |
+ | 8 480 DNAT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:30022 to:192.168.3.2:22 | ||
+ | 0 0 DNAT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:10023 to:192.168.1.2:23 | ||
+ | 0 0 DNAT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:20023 to:192.168.2.2:23 | ||
+ | 0 0 DNAT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:30023 to:192.168.3.2:23 | ||
+ | </code> | ||
- | root@red:~# ftp green | + | Testăm aplicarea celor trei reguli prin folosirea comenzii ''telnet'' pe stația fizică către porturile respectiv ''10023'', ''20023'', ''30023'':<code bash> |
- | ^C | + | razvan@einherjar:~$ telnet $ADRESA_IP_VM 10023 |
+ | [...] | ||
+ | red login: student | ||
+ | Password: | ||
+ | [...] | ||
+ | student@red:~$ | ||
- | root@host:~# iptables -L FORWARD -n -v | + | razvan@einherjar:~$ telnet $ADRESA_IP_VM 20023 |
- | Chain FORWARD (policy ACCEPT 94 packets, 10307 bytes) | + | [...] |
- | pkts bytes target prot opt in out source destination | + | green login: student |
- | 2 120 DROP tcp -- * * 0.0.0.0/0 192.168.2.2 tcp dpt:23 | + | Password: |
- | 2 120 DROP tcp -- * * 0.0.0.0/0 192.168.2.2 tcp dpt:21 | + | [...] |
+ | student@green:~$ | ||
+ | |||
+ | razvan@einherjar:~$ telnet $ADRESA_IP_VM 30023 | ||
+ | [...] | ||
+ | blue login: student | ||
+ | Password: | ||
+ | [...] | ||
+ | student@blue:~$ | ||
</code> | </code> | ||
</solution> | </solution> | ||
</hidden> | </hidden> | ||
+ |