This shows you the differences between two versions of the page.
rl:labs:07:contents:06 [2022/11/16 11:25] florin.stancu [06. [10p] Depanare problemă de configurare adresă IP] |
rl:labs:07:contents:06 [2023/11/05 12:44] (current) vlad_iulius.nastase |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ==== 06. [10p] Depanare problemă de configurare adresă 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 noul argument ''ex6'':<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]]. |
- | root@host:~# start_lab lab7 ex6 | + | |
+ | 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 | ||
- | În urma rulării scriptului au fost repornită stațiile ''red'' și au fost refăcute configurațiile. Va trebui să vă reconectați pe stația ''red'' folosind comanda:<code bash> | + | Î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). |
- | root@host:~# go red | + | </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 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> | ||
+ | root@host:~# iptables -A FORWARD -d green -p tcp --dport telnet -j REJECT | ||
</code> | </code> | ||
- | și folosind username-ul ''root'' și parola ''student''. | ||
- | Scriptul configurează adresa IP ''7.7.7.1'' pe interfața ''veth-red'' a stației ''host'' și adresa IP ''7.7.7.2'' pe interfața ''red-eth0'' a stației ''red''. Folosiți comenzile:<code bash> | + | Pentru a verifica adăugarea regulii de mai sus, rulați pe stația ''host'' comanda<code bash> |
- | root@red:~# ip address show red-eth0 | + | root@host:~# iptables -L FORWARD |
- | 46: red-eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 | + | Chain FORWARD (policy ACCEPT) |
- | link/ether 00:16:3e:8e:84:21 brd ff:ff:ff:ff:ff:ff | + | target prot opt source destination |
- | inet 7.7.7.2/32 scope global red-eth0 | + | REJECT tcp -- anywhere green tcp dpt:telnet reject-with icmp-port-unreachable |
- | 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> | ||
- | 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 afișa informații și despre pachetele prelucrate și interfețele folosite, rulați pe stația ''host'' comanda<code bash> |
+ | root@host:~# iptables -L FORWARD -v | ||
+ | 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 depana această problemă, urmărim tabela de rutare a fiecărei stații:<code bash> | + | 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@red:~# ip r s | + | root@host:~# iptables -L FORWARD -v -n |
- | root@red:~# | + | 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''. | ||
- | root@host:~# ip r s | + | Pentru a verifica blocarea traficului telnet către ''green'', rulați pe stația ''red'' comanda<code bash> |
- | 10.10.20.0/24 dev veth-green proto kernel scope link src 10.10.20.1 | + | telnet green |
- | 10.10.30.0/24 dev veth-blue proto kernel scope link src 10.10.30.1 | + | |
- | 192.168.56.0/24 dev eth0 proto kernel scope link src 192.168.56.101 | + | |
</code> | </code> | ||
- | Observați că nu apar rutele relevante în tabela de rutare. Fie interfețele sunt dezactivate, fie configurația este greșită. Dacă rulăm comenzile de afișare a informațiilor de nivel 3, observăm:<code bash> | + | Vă apare un mesaj de forma<code> |
- | root@red:~# ip address show red-eth0 | + | Trying 192.168.2.2... |
- | 46: red-eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 | + | telnet: Unable to connect to remote host: Connection refused |
- | link/ether 00:16:3e:8e:84:21 brd ff:ff:ff:ff:ff:ff | + | </code> semnificând faptul că se încearcă realizarea conexiunii dar conexiunea este respinsă |
- | inet 7.7.7.2/24 scope global red-eth0 | + | |
- | inet6 fe80::216:3eff:fe8e:8421/64 scope link | + | Pentru a vedea că regula de blocare a funcționat, rulați din nou pe stația ''host'' comanda<code bash> |
- | valid_lft forever preferred_lft forever | + | root@host:~# iptables -L FORWARD -v -n |
- | + | Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) | |
- | root@host:~# ip address show veth-red | + | pkts bytes target prot opt in out source destination |
- | 47: veth-red: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 | + | 2 120 REJECT tcp -- * * 0.0.0.0/0 192.168.2.2 tcp dpt:23 reject-with icmp-port-unreachable |
- | 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> | ||
+ | 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. | ||
- | Interfețele sunt active (''UP''). Observăm însă că una dintre aceaste adrese are 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, pentru o mască ''/24'' este vorba de ''7.7.7.1/24'' și ''7.7.7.2/24''). | + | 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> | ||
- | <note warning> | + | 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. |
- | 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. | + | |
- | </note> | + | |
- | <note important> | + | <note tip> |
- | Listarea tabelei de rutare a unei stații este printre primii pași care trebuie urmați pentru depanarea unei probleme de conectivitate. | + | 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> |