This shows you the differences between two versions of the page.
rl:labs:08:contents:04 [2020/12/01 10:56] iulia.florea |
rl:labs:08:contents:04 [2023/11/05 12:54] (current) vlad_iulius.nastase |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ==== 4. [5p] Blocare completă a traficului ==== | + | ==== 04. [10p] Configurare incorectă a translatării ==== |
- | <spoiler Prezentare scurtă iptables (dați click)> | + | Comanda folosită mai sus pentru translatare, la [[:rl:labs:09:contents:01]], are neajunsuri pe care le vom identifica mai jos. |
- | ''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 | + | |
- | 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]]. | ||
- | Comanda ''iptables'' înseamnă lucrul cu reguli de filtrare de la nivelul nucleului. În mod obișnuit se va preciza: | + | Pe stația ''green'' capturăm traficul pe interfața ''green-eth0'' folosind comanda ''tcpdump'':<code bash> |
- | * tipul de operație pe regulă (adăugare, ștergere, înlocuire, inserare) | + | root@green:~# tcpdump -i green-eth0 |
- | * punctul din nucleul în care trebuie să se găsească pachetul pentru a se aplica regula | + | tcpdump: verbose output suppressed, use -v or -vv for full protocol decode |
- | * regula în sine | + | listening on green-eth0, link-type EN10MB (Ethernet), capture size 65535 bytes |
- | + | ||
- | 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). | + | Pe stația ''red'' executăm comanda ''ping'' către stația ''green'':<code bash> |
- | </spoiler> | + | |
- | + | ||
- | Pentru început verificați că stația ''red'' poate accesa alte stații din rețea. Rulați comanda<code bash> | + | |
root@red:~# ping -c 2 green | root@red:~# ping -c 2 green | ||
PING green (192.168.2.2) 56(84) bytes of data. | PING green (192.168.2.2) 56(84) bytes of data. | ||
- | 64 bytes from green (192.168.2.2): icmp_req=1 ttl=63 time=0.076 ms | + | 64 bytes from green (192.168.2.2): icmp_req=1 ttl=63 time=0.155 ms |
- | 64 bytes from green (192.168.2.2): icmp_req=2 ttl=63 time=0.067 ms | + | 64 bytes from green (192.168.2.2): icmp_req=2 ttl=63 time=0.086 ms |
+ | [...] | ||
+ | </code> | ||
- | --- green ping statistics --- | + | În acest moment, pe stația ''green'' avem captura pachetelor în output-ul comenzii ''tcpdump'':<code> |
- | 2 packets transmitted, 2 received, 0% packet loss, time 999ms | + | 11:18:54.535064 IP host > green: ICMP echo request, id 633, seq 17, length 64 |
- | rtt min/avg/max/mdev = 0.067/0.071/0.076/0.009 ms | + | 11:18:54.535092 IP green > host: ICMP echo reply, id 633, seq 17, length 64 |
</code> | </code> | ||
- | Asocierile între porturi și protocoale (''21'' și FTP, ''22'' și SSH, ''23'' și telnet) sunt cele implicite. Acest lucru nu împiedică însă un administrator să configureze un serviciu să asculte pe un port diferit de cel implicit. Pentru a preveni transferul de fișiere și conectare de la distanță pe stația ''red'' vom bloca accesul la toate porturile. Pentru aceasta vom configura stația ''host'' pentru a bloca **întreg** traficul de la stația ''red''. | + | Observăm că adresa sursă a pachetelor de tip ''ICMP echo request'' este stația ''host'', nu stația ''red''. Acest lucru se întâmplă din cauză că atunci când am activat NAT nu am specificat pentru ce tip de trafic să aplice politica de translatare. Astfel stația ''host'' aplică politica de NAT pentru tot traficul care o tranzitează. Dorim să aplicăm politica doar pentru pachetele ce **ies** în Internet, adică cele ale căror **interfață de ieșire** este interfața ''eth0''. Vom șterge vechea regulă de NAT și vom adăuga o regulă corectă. |
- | <code bash> | + | Pentru ștergerea vechii reguli de NAT rulăm pe stația ''host'' comanda<code bash> |
- | root@host:~# iptables -A FORWARD -s red -j REJECT | + | root@host:~# iptables -t nat -D POSTROUTING -j MASQUERADE |
- | root@host:~# iptables -L FORWARD -n -v | + | </code> |
- | Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) | + | Verificăm faptul că nu mai există comanda<code bash> |
- | pkts bytes target prot opt in out source destination | + | root@host:~# iptables -t nat -L POSTROUTING -n -v |
- | 0 0 REJECT all -- * * 192.168.1.2 0.0.0.0/0 reject-with icmp-port-unreachable | + | Chain POSTROUTING (policy ACCEPT 1 packets, 328 bytes) |
+ | pkts bytes target prot opt in out source destination | ||
</code> | </code> | ||
- | Comanda blochează întreg traficul **de la** stația ''red'' (opțiunea ''-s'') pe care stația ''host'' l-ar fi rutat (lanțul ''FORWARD''). | ||
- | Verificați că stația ''red'' nu poate accesa alte stații. Rulați comenzile<code bash> | + | Adăugăm din nou regula de NAT, dar de data aceasta vom specifica să aplice politica de NAT pachetelor ce ies prin interfața ''eth0'' a stației ''host'':<code bash> |
- | root@red:~# ping -c 2 green | + | root@host:~# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE |
- | PING green (192.168.2.2) 56(84) bytes of data. | + | </code> |
- | From host (192.168.1.1) icmp_seq=1 Destination Port Unreachable | + | Verificați că regula a fost inserată:<code bash> |
- | From host (192.168.1.1) icmp_seq=2 Destination Port Unreachable | + | root@host:~# iptables -t nat -L POSTROUTING -n -v |
+ | Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) | ||
+ | pkts bytes target prot opt in out source destination | ||
+ | 0 0 MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0 | ||
+ | </code> | ||
+ | Observăm prezența interfaței ''eth0'' în coloana ''out''. Înainte apărea caracterul ''*'', adică orice interfață. | ||
- | --- green ping statistics --- | + | Repetați testul de la începutul exercițiului și arătați că pachetele trimise de la ''red'' către ''green'' au adresele IP sursă/destinație nemodificate (nu mai fac trecerea prin NAT), în vreme ce pachetele ce ies în Internet sunt translatate. |
- | 2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 999ms | + | |
- | + | ||
- | root@red:~# telnet green | + | |
- | Trying 192.168.2.2... | + | |
- | telnet: Unable to connect to remote host: Connection refused | + | |
- | + | ||
- | root@red:~# ftp green | + | |
- | ftp: connect: Connection refused | + | |
- | ftp> exit | + | |
- | + | ||
- | root@red:~# ssh -l student green | + | |
- | ssh: connect to host green port 22: Connection refused | + | |
- | </code> | + | |
- | Observați că nu mai sosesc pachete de răspuns (sunt respinse de stația ''host''), deci traficul de la stația ''red'' este blocat. | + |