This shows you the differences between two versions of the page.
rl:labs:08:contents:02 [2013/11/20 21:01] razvan.deaconescu [2. Blocare servicii necriptate] |
rl:labs:08:contents:02 [2023/11/05 12:54] (current) vlad_iulius.nastase |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ==== 2. Blocare servicii necriptate ==== | + | ==== 02. [10p] Format de pachete la translatare ==== |
- | 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. | + | Ne propunem să analizăm antetul IP al pachetelor ce sunt generate de stațiile ''red'', ''green'' și ''blue'' și au ca destinație o rețea din Internet. Pentru acest lucru vom folosi utilitarul de captură ''tcpdump''. |
- | 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''. | + | Pe stația ''red'' pornim comanda ''ping'' către ''8.8.8.8.'':<code bash> |
+ | root@red:~# ping 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_req=1 ttl=127 time=42.0 ms | ||
+ | [...] | ||
+ | </code> | ||
- | <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: | + | Atunci când rulăm comanda ''tcpdump'' secvența de urmat este: |
- | * acceptarea pachetului (''ACCEPT'') | + | - Se rulează comanda ''tcpdump'' cu opțiunile aferente într-un terminal, activând astfel captura de pachete. Utilitarul ''tcpdump'' așteaptă acum transmiterea de pachete pe interfețele pe care ascultă. |
- | * respingerea pachetului (''REJECT'') | + | - Într-un alt terminal se rulează o comandă specifică unui client de rețea care generează trafic. |
- | * aruncarea pachetului (''DROP''), similar cu respingerea dar nu se transmite nici o notificare de respingere către cel care a transmis pachetul inițial | + | - Se revine în terminalul în care rulează comanda ''tcpdump'' și se urmăresc pachetele capturate. |
+ | - Când nu mai este nevoie de utilitarul ''tcpdump'' se întrerupe captura de pachete folosind combinația de taste ''Ctrl+c''. | ||
+ | </note> | ||
- | O diagramă a drumului urmat de un pachet de rețea în nucleu este [[http://upload.wikimedia.org/wikipedia/commons/8/8f/Diagrama_linux_netfilter_iptables.gif|aici]]. | + | Pentru a urmări traficul, pe stația ''host'' rulăm comanda<code bash> |
- | + | root@host:~# tcpdump -n -i eth0 ip dst host 8.8.8.8 | |
- | Comanda ''iptables'' înseamnă lucrul cu reguli de filtrare de la nivelul nucleului. În mod obișnuit se va preciza: | + | tcpdump: verbose output suppressed, use -v or -vv for full protocol decode |
- | * tipul de operație pe regulă (adăugare, ștergere, înlocuire, inserare) | + | listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes |
- | * punctul din nucleul în care trebuie să se găsească pachetul pentru a se aplica regula | + | 12:59:20.976707 IP host > 8.8.8.8: ICMP echo request, id 625, seq 6, length 64 |
- | * regula în sine | + | 12:59:21.977708 IP host > 8.8.8.8: ICMP echo request, id 625, seq 7, length 64 |
- | + | ||
- | 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); | ||
- | * ''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). | + | <spoiler (click pentru expandare) Detalii rulare masina virtuala VMware local> |
+ | <note important> | ||
+ | După rularea comenzii de mai sus, probabil vi se va bloca terminalul. În mașina virtuală VMware apare o mini-fereastră care vă indică intrarea plăcii de rețea în modul //promiscuous//. Apăsați pe butonul ''OK'' al ferestrei pentru a debloca mașina virtuală și, astfel, terminalul. | ||
+ | </note> | ||
</spoiler> | </spoiler> | ||
- | 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> | + | Observăm că adresa IP sursă este ''host.local'' chiar dacă stația ''red'' este cea care execută comanda ''ping'' și generează pachetele de tip ''ICMP echo request''. |
- | # iptables -A FORWARD -d green -p tcp --dport telnet -j REJECT | + | |
- | </code> | + | |
- | Pentru a verifica adăugarea regulii de mai sus, rulați pe stația ''host'' comanda<code bash> | + | Pentru a vedea pachetele așa cum sunt generate inițial, rulăm comandă ''tcpdump'' pe interfața ''veth-red'' în loc de ''eth0'': <code bash> |
- | # iptables -L FORWARD | + | root@host:~# tcpdump -n -i veth-red ip dst host 8.8.8.8 |
- | Chain FORWARD (policy ACCEPT) | + | tcpdump: verbose output suppressed, use -v or -vv for full protocol decode |
- | target prot opt source destination | + | listening on veth-red, link-type EN10MB (Ethernet), capture size 65535 bytes |
- | REJECT tcp -- anywhere green tcp dpt:telnet reject-with icmp-port-unreachable | + | 13:01:12.557692 IP red > 8.8.8.8: ICMP echo request, id 626, seq 6, length 64 |
+ | 13:01:13.559726 IP red > 8.8.8.8: ICMP echo request, id 626, seq 7, length 64 | ||
</code> | </code> | ||
+ | Observăm că pe interfața ''veth-red'' adresa IP sursă este adresa stației ''red'', adică așa cum este generat de la început pachetul. Motivul este reprezentat de faptul că pachetele ce intră pe intefața ''veth-red'' sunt capturate înainte de rutare, iar procesul NAT este aplicat **după rutare** (vezi [[rl:labs:09:contents:01|]]. | ||
- | Pentru a afișa informații și despre pachetele prelucrate și interfețele folosite, rulați pe stația ''host'' comanda<code bash> | + | Pentru a vedea modul în care se translatează traficul capturăm traficul pe toate interfețele (cele de interes sunt ''veth-red'' și ''eth0'')<code bash> |
- | # iptables -L FORWARD -v | + | root@host:~# tcpdump -n -i any ip dst host 8.8.8.8 |
- | Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) | + | tcpdump: verbose output suppressed, use -v or -vv for full protocol decode |
- | pkts bytes target prot opt in out source destination | + | listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes |
- | 0 0 REJECT tcp -- any any anywhere green tcp dpt:telnet reject-with icmp-port-unreachable | + | 10:23:07.632412 IP red > 8.8.8.8: ICMP echo request, id 707, seq 237, length 64 |
+ | 10:23:07.632430 IP host > 8.8.8.8: ICMP echo request, id 707, seq 237, length 64 | ||
+ | 10:23:08.633936 IP red > 8.8.8.8: ICMP echo request, id 707, seq 238, length 64 | ||
+ | 10:23:08.633954 IP host > 8.8.8.8: ICMP echo request, id 707, seq 238, length 64 | ||
</code> | </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> | + | În lista de mai sus observăm atât pachetele care sunt captuarate pe interfața ''veth-red'' (generate de stația ''red'') cât și cele capturate pe interfața ''eth0'' (translatate de stația ''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> | + | Capturați și pachetele de reply, care au ca **sursă** adresa ''8.8.8.8''. Folosiți șirul de argumente ''ip src host 8.8.8.8'' pentru ''tcpdump''. |
- | telnet green | + | |
- | </code> | + | |
- | Vă apare un mesaj de forma<code> | + | Repetați testele de mai sus pentru stația ''green''. |
- | 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> | + | <note> |
- | # iptables -L FORWARD -v -n | + | Întrucât latența DNS poate fi semnificativă, recomandăm folosirea opțiunii ''-n'' a utilitarului ''tcpdump'', opțiune care dezactivează rezolvarea DNS. În exemplele de mai sus, nu am folosit opțiunea ''-n'' a utilitarului ''tcpdump'' pentru a identifica mai ușor numele stațiilor implicate în conversație. |
- | 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> | ||
- | |||
- | <solution -hidden> | ||
- | <code bash> | ||
- | root@host:~# iptables -A FORWARD -d green -p tcp --dport ftp -j DROP | ||
- | root@host:~# iptables -L FORWARD -n -v | ||
- | Chain FORWARD (policy ACCEPT 94 packets, 10307 bytes) | ||
- | 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 | ||
- | 0 0 DROP tcp -- * * 0.0.0.0/0 192.168.2.2 tcp dpt:21 | ||
- | |||
- | root@red:~# ftp green | ||
- | ^C | ||
- | |||
- | root@host:~# iptables -L FORWARD -n -v | ||
- | Chain FORWARD (policy ACCEPT 94 packets, 10307 bytes) | ||
- | 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 DROP tcp -- * * 0.0.0.0/0 192.168.2.2 tcp dpt:21 | ||
- | </code> | ||
- | </solution> |