Differences

This shows you the differences between two versions of the page.

Link to this comparison view

rl:labs:07:contents:06 [2013/11/14 00:41]
razvan.deaconescu
rl:labs:07:contents:06 [2023/11/05 12:44] (current)
vlad_iulius.nastase
Line 1: Line 1:
-==== 06. [10p] Depanare problemă de configurare adresei IP ====+==== 6. [10p] Blocare servicii necriptate ​==== 
 +<spoiler Prezentare scurtă iptables (dați click)>​ 
 +''​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: 
 +  * acceptarea pachetului (''​ACCEPT''​) 
 +  * respingerea pachetului (''​REJECT''​) 
 +  * aruncarea pachetului (''​DROP''​),​ similar cu respingerea dar nu se transmite nici o notificare de respingere către cel care a transmis pachetul inițial
  
-Rulați scriptul ​de pregătire cu argumentul 6:<code bash> +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]]. 
-# ./rl-lab-07-prepare 6+ 
 +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);
 +  * ''​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
  
-Scriptul configurează adresa IP ''​7.7.7.1''​ pe interfața ''​veth-red'' ​stației ''​host'' ​și adresa IP ''​7.7.7.2''​ pe interfaț''​eth0''​ a stației ''​red''​. Folosiți comanda:<code bash> +În tabela de filtrare aferentă ''​iptables''​ vom avea, așadar, o listă de reguli care sunt parcurse secvențialPartea ​''​-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). 
-ip address show dev INTERFACE+</​spoiler>​ 
 + 
 +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ă 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''​. 
 + 
 +Autentificați-vă prin SSH ca ''​root''​ pe stația ''​host''​. Pentru ​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> 
 +root@host:​~#​ iptables -A FORWARD -d green -p tcp --dport telnet -j REJECT
 </​code>​ </​code>​
-pentru a urmări configurația IP pe interfața ''​INTERFACE''​. 
  
-Folosiți comanda ​''​ping'' ​pentru a testa conectivitatea între cele două adrese IP (''​7.7.7.1''​ și ''​7.7.7.2''​pe cele două stații. Observați ca nu există conectivitate.+Pentru a verifica adăugarea regulii de mai sus, rulați pe stația ​''​host'' ​comanda<​code bash> 
 +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 depana această problemă, urmărim tabela de rutare ​fiecărei stații:<code bash> +Pentru a afișinformații și despre pachetele prelucrate și interfețele folosite, rulați pe stația ''​host''​ comanda<code bash> 
-root@red:~# ip r s +root@host:~# iptables -L FORWARD -v 
-root@red:~# +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>​
  
-root@host:​~# ​ip r s +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> 
-10.10.20.0/24 dev veth-green ​ proto kernel ​ scope link  src 10.10.20.1 +root@host:​~# ​iptables -L FORWARD -v -n 
-10.10.30.0/24 dev veth-green  proto kernel ​ scope link  src 10.10.30.1 +Chain FORWARD (policy ACCEPT ​packets, 0 bytes) 
-192.168.56.0/24 dev eth0  proto kernel ​ scope link  src 192.168.56.101+ pkts bytes target ​    prot opt in     ​out ​    ​source ​              ​destination ​         
 +    ​    0 REJECT ​    ​tcp ​ --  ​*      *       0.0.0.0/0            ​192.168.2.2          tcp dpt:23 reject-with icmp-port-unreachable
 </​code>​ </​code>​
 +De acum înainte recomandăm folosirea acestor opțiuni (''​-v -n''​) pentru listarea regulilor ''​iptables''​.
  
-Observați ​că nu apar rutele relevante în tabela de rutare. Fie interfețele sunt dezactivatefie configurația este greșită. Dacă rulăm comenzile de afișare a informațiilor de nivel 3, observăm:<code bash> +Pentru a verifica blocarea traficului telnet ​tre ''​green''​rulați pe stația ''​red''​ comanda<code bash> 
-root@red:~# ip address show eth0 +telnet green
-46: eth0: <​BROADCAST,​MULTICAST,​UP,​LOWER_UP>​ mtu 1500 qdisc pfifo_fast state UP qlen 1000 +
-    link/ether 00:​16:​3e:​8e:​84:​21 brd ff:​ff:​ff:​ff:​ff:​ff +
-    inet 7.7.7.2/32 scope global eth0 +
-    inet6 fe80::​216:​3eff:​fe8e:​8421/​64 scope link  +
-       ​valid_lft forever preferred_lft forever +
-        +
-root@host:​~#​ ip address show veth-red +
-47: veth-red: <​BROADCAST,​MULTICAST,​UP,​LOWER_UP>​ mtu 1500 qdisc pfifo_fast state UP qlen 1000 +
-    link/ether 4e:​1b:​b8:​d9:​14:​bb brd ff:​ff:​ff:​ff:​ff:​ff +
-    inet 7.7.7.1/32 scope global veth-red+
 </​code>​ </​code>​
  
-Interfețele sunt active (''​UP''​)Observăm însă că aceste adrese au masca ''​/32''​. Acest lucru înseamnă ​că nu pot comunica în rețea unele cu altele și explică și absența rutei relevante din tabela de rutare. Repararea acestei greșeli ​se face prin folosirea unor adrese cu mască potrivită (de exemplu ''/​24''​).+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ă
  
-<note warning>​ +Pentru a vedea că regula ​de blocare a funcționat, rulați din nou pe stația ''​host''​ comanda<​code bash> 
-O greșeală relativ frecventă în configurarea adresei IP în Linux este omiterea măștii ​de rețea. Aveți în vedere să nu omiteți masca în momentul în care configurați adrese IP pe interfețe în Linux+root@host:​~#​ iptables -L FORWARD -v -n 
-</note>+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.
  
-<note important+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
-Listarea tabelei de rutare ​unei stații este printre primii pași care trebuie urmați pentru ​depanarea unei probleme de conectivitate.+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 ​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>​
 +<​solution>​
 +<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>​
 +</​hidden>​
rl/labs/07/contents/06.1384382507.txt.gz · Last modified: 2013/11/14 00:41 by razvan.deaconescu
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