În universul sistemelor Linux, securizarea dispozitivului este crucială, iar opțiunile abundă. Un instrument fundamental este iptables, un utilitar firewall de comandă extrem de versatil și eficient.
Cu toate acestea, natura sa de utilitar bazat pe linia de comandă implică o curbă de învățare inițială.
Astfel, dacă sunteți un administrator de sistem sau un utilizator Linux dornic să învețe, acest ghid vă va familiariza cu cele mai comune comenzi iptables, oferind exemple practice.
Ce este iptables?
iptables este un firewall software specific sistemelor Linux. Acesta permite utilizatorilor să definească politici care reglementează traficul de internet, atât direct cât și indirect.
Concret, iptables vă permite să configurați reguli pentru a bloca sau autoriza traficul, specificând porturi, adrese IP sursă, interfețe de rețea și alte criterii.
Odată ce aceste reguli sunt stabilite, tot traficul de rețea trebuie să le respecte. De exemplu, la inițierea unei noi conexiuni, iptables va verifica regulile existente pentru a vedea dacă se potrivesc. Dacă o regulă se aplică, aceasta va fi executată. În absența unei reguli potrivite, se va aplica politica implicită.
Comanda de bază pentru utilizarea iptables este următoarea:
$ iptables -L -n -v
Parametrii folosiți aici au următoarele semnificații:
- -L: afișează toate regulile definite.
- -n: prezintă ieșirea numerică, pentru performanțe mai rapide.
- -v: afișează informațiile în format detaliat.
Dacă încercați să rulați comanda iptables fără parametri, veți obține următorul rezultat:
iptables v1.8.7 (nf_tables): no command specified Try `iptables -h' or 'iptables --help' for more information.
În cazul în care sistemul returnează o eroare, cum ar fi „command ‘iptables’ not found”, va fi necesar să instalați utilitarul.
Pentru a instala iptables pe distribuția dvs. Linux, folosiți următoarea comandă:
$ sudo apt-get install iptables
Un rezultat tipic, în cazul în care iptables este deja instalat, ar fi:
#output Reading package lists... Done Building dependency tree... Done Reading state information... Done iptables is already the newest version (1.8.7-1ubuntu5). iptables set to manually installed. 0 upgraded, 0 newly installed, 0 to remove, and 35 not upgraded.
Ce este un Firewall?
Firewall-urile reprezintă baza securității pentru sisteme, rețele și computere personale. Acestea pot fi implementate ca hardware sau software, funcționând pe baza unui set de reguli bine definite.
Majoritatea firewall-urilor sunt extrem de configurabile, permițându-vă să creați sau să modificați reguli. De exemplu, scanarea porturilor poate filtra pachetele de date, deoarece acestea folosesc porturi specifice pentru a comunica cu un sistem. De asemenea, puteți controla accesul la servicii, permițând sau blocând conexiuni bazate pe adresa IP sursă sau interfața de rețea.
Utilizatorii Linux au acces la iptables, un firewall integrat. Totuși, pot fi folosite și alte soluții firewall Linux dedicate, pentru a spori protecția sistemului.
De Ce Aveți Nevoie de iptables pentru a Configura Firewall-ul?
Dar de ce să folosiți iptables în mod specific? Există utilitare alternative de comandă, cum ar fi ufw și firewalld, precum și firewall-uri Linux independente, mai ușor de utilizat și cu funcții extinse.
Ce face ca iptables să fie o opțiune bună pentru configurarea firewall-ului? Motivele includ:
- Flexibilitate superioară: permite stabilirea de reguli detaliate la nivel de pachet.
- Ușurință în utilizare: devine simplu de utilizat odată ce înțelegeți cum funcționează.
- Blocarea traficului nedorit: proces simplu de blocare a conexiunilor neautorizate.
- Redirecționarea pachetelor: capacitatea de a trimite pachete către adrese IP alternative.
- Protecție împotriva atacurilor DoS: oferă mecanisme pentru a contracara atacurile de tip Denial of Service.
Și multe alte funcționalități!
Înțelegerea Arhitecturii iptables și a Relației Sale cu Netfilter
Pentru a folosi eficient iptables, este esențial să înțelegeți arhitectura sa. Acest lucru va oferi o perspectivă clară asupra componentelor iptables, facilitând scrierea regulilor de firewall.
În contextul iptables, apare și Netfilter, un concept care poate fi considerat ca o extensie a iptables. Netfilter stă la baza iptables și oferă funcții extinse pentru gestionarea firewall-ului. Cu toate acestea, iptables este un mijloc important prin care Netfilter își atinge obiectivele.
iptables acționează ca o interfață de comandă pentru cârligele Netfilter la nivel de kernel. Aceste cârlige interacționează cu stiva de rețea Linux, afectând pachetele la un nivel profund.
Arhitectura iptables este organizată după cum urmează:
Tabele
Arhitectura iptables începe cu tabele, care sunt structuri pentru organizarea regulilor. Fiecare tabel este categorizat după tipul de decizie pe care o implementează. În esență, un tabel simplifică procesul de pachete, asociind un mod specific de gestionare a acestora.
Tabelele oferite de iptables includ:
- Tabelul de filtrare: decide dacă un pachet ar trebui să ajungă la destinație sau nu.
- Tabelul NAT: gestionează traducerea adreselor, determinând rutarea pachetelor bazat pe rețele NAT.
- Tabelul Mangle: este folosit pentru procesarea specială a pachetelor, de exemplu, pentru modificarea valorilor de antet (TTL).
- Tabelul Raw: permite lucrul cu starea firewall-ului iptables, direcționând pachete bazat pe „starea” lor înainte ca sistemul să înceapă urmărirea conexiunii.
Lanțuri
În interiorul tabelelor, se află „lanțurile”, care realizează inspecția pachetelor în diferite etape ale fluxului lor. De exemplu, pachetele pot fi inspectate la sosirea pe un port sau o interfață de rețea, permițând luarea unei decizii înainte de a le permite să continue.
Există mai multe tipuri de lanțuri, printre care:
- Lanțul PREROUTING: gestionează pachetele imediat ce ajung la o interfață de rețea.
- Lanțul INPUT: se ocupă de conexiunile de intrare, care sunt ulterior predate proceselor locale.
- Lanțul OUTPUT: gestionează pachetele generate de procesele locale.
- Lanțul FORWARD: gestionează pachete care nu sunt destinate sistemului local, fiind un intermediar pentru alte sisteme (cum ar fi un router).
- Lanțul POSTROUTING: se ocupă de pachetele care urmează să părăsească sistemul prin interfața de rețea.
Nu toate lanțurile sunt disponibile în fiecare tabel. De exemplu, lanțul FORWARD se găsește doar în tabelele Mangle, Filter și Security. Lanțul POSTROUTING este disponibil în tabelele mangle și nat (SNAT). Doar lanțul OUTPUT este accesibil în toate tabelele.
Țintă
Când un pachet intră în sistem, trece prin lanțuri pentru a identifica cea mai potrivită regulă. Dacă o regulă este potrivită, se execută acțiunea asociată, iar pachetul este direcționat către o „țintă”, sigilând soarta pachetului.
În cazul în care pachetul nu corespunde niciunei reguli, se aplică politica implicită, o „țintă” prestabilită.
Țintele finale includ ACCEPT, DROP și REJECT:
- ACCEPT: Permite pachetul.
- DROP: Ignoră pachetul, făcând expeditorul să nu știe dacă sistemul este disponibil sau nu.
- REJECT: Respinge pachetul.
Există și alte ținte, care nu sunt finale, utilizate pentru stocarea informațiilor despre pachet.
Cele mai Comune Comenzi iptables cu Exemple
Înainte de a începe să utilizați comenzile iptables, asigurați-vă că:
- Aveți privilegii administrative pentru a executa comenzile (folosiți sudo, dacă este cazul).
- Acest ghid nu este un tutorial pas cu pas despre configurarea iptables pe Ubuntu.
- Vom utiliza comenzile iptables pentru IPv4 (pentru IPv6, folosiți ip6tables).
Verificarea Stării iptables
Pentru a vedea starea curentă a iptables, folosiți următoarea comandă:
$ iptables -L -n -v
#output Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Rezultatul afișează informații detaliate, inclusiv că firewall-ul este momentan inactiv (toate lanțurile sunt setate pe ACCEPT și nu există reguli active).
Pentru a activa firewall-ul, trebuie să adăugați reguli.
Adăugarea de Reguli la Lanț
Regulile sunt adăugate întotdeauna la un lanț. Pentru aceasta, se utilizează opțiunea -A (Add). Sintaxa este:
$ sudo iptables -A
Executarea acestei comenzi fără argumente va returna:
iptables v1.8.7 (nf_tables): option "-A" requires an argument Try `iptables -h' or 'iptables --help' for more information.
Argumentele disponibile pentru a defini reguli includ:
- – i: interfața de rețea (ex: ppp0, eth0 etc.).
- – p: protocolul (ex: ICMP, TCP, UDP). Folosiți „all” pentru a aplica regula la toate protocoalele.
- – s: adresa IP sursă sau numele gazdei.
- – dport: portul de destinație al pachetului.
- – j: ținta (ACCEPT, DROP, RETURN).
Comanda trebuie scrisă în următoarea ordine:
$ sudo iptables -A <nume-lanț> -i <nume-interfață> -p <nume-protocol> -s <sursa> --dport <nr. port> -j <țintă>
Salvarea Modificărilor la iptables
Odată adăugată o regulă, o puteți salva cu comanda iptables -save:
$ sudo iptables -save
Un exemplu de rezultat este:
[email protected]:~$ sudo iptables-save # Generated by iptables-save v1.8.7 on Sun May 14 13:37:34 2023 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -p tcp -m tcp --dport 392 -j REJECT --reject-with icmp-port-unreachable -A OUTPUT -o lo -j ACCEPT COMMIT # Completed on Sun May 14 13:37:34 2023
Reguli Persistente Manual
În mod implicit, regulile iptables nu sunt salvate. La repornirea sistemului, aceste reguli vor fi șterse. Pentru a le menține, folosiți următoarele comenzi:
Pentru regulile IPv4:
$ sudo iptables-save > /etc/iptables/rules.v4
Pentru regulile IPv6:
$ sudo iptables-save > /etc/iptables/rules.v6
Reguli Persistente Automat
Pentru ca regulile să fie menținute și după repornire, în mod automat, este necesară instalarea pachetului iptables-persistent:
$ sudo apt-get install iptables-persistent
Va apărea o fereastră. Alegeți
Pachetul va afișa doar regulile IPv4 (dacă este cazul). Similar, pentru IPv6, se va afișa o fereastră separată.
Notă: pachetul încarcă doar regulile iptables salvate. Deci, după orice modificare, este necesar să salvați modificările cu comanda iptables -save.
Reîncărcarea Regulilor După Repornire
Odată salvate, regulile pot fi reîncărcate folosind comenzile:
$ sudo iptables-restore < /etc/iptables/rules.v4
Și
$ sudo iptables-restore < /etc/iptables/rules.v6
Activarea Traficului pe Localhost / Activarea Loopback
Pentru a activa traficul pe localhost, folosiți:
$ sudo iptables -A INPUT -i lo -j ACCEPT
lo reprezintă interfața loopback pentru toate comunicațiile locale.
Similar, pentru a permite pachetelor să iasă prin interfața loopback:
$ sudo iptables -A OUTPUT -o lo -j ACCEPT
Pentru a verifica schimbările, utilizați: iptables -L -n -V
#output Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Activarea Traficului pe Anumite Porturi
Traficul pe anumite porturi poate fi activat prin ACCEPT sau dezactivat prin REJECT.
De exemplu, porturile SSL, HTTP și SSH sunt esențiale pentru aplicații. Puteți adăuga reguli pentru ACCEPT prin intermediul numerelor de port.
Pentru SSL:
$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Pentru HTTP:
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Pentru a permite întregul trafic HTTPS pe interfața eth0:
$ iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT $ iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
Pentru SSH:
$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Și pentru a accepta tot traficul SSH de intrare pe interfața eth0:
$ iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT $ iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Un alt exemplu este activarea traficului pe un port specific, cum ar fi 233, pentru o aplicație personalizată:
$ sudo iptables -A INPUT -p tcp --dport 233 -j ACCEPT
Similar, conexiunile pe un anumit port pot fi dezactivate cu opțiunea REJECT.
Pentru a bloca toate conexiunile pe portul 392:
$ sudo iptables -A INPUT -p tcp --dport 392 -j REJECT
Pentru a verifica modificările, folosiți: iptables -L -n -v.
#output Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:233 0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:392 reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
Ștergeți Regulile Existente
Pentru a șterge toate regulile existente, folosiți:
$ iptables -F
Sau
$ iptables --flush
Notă: Dacă regulile nu au fost salvate, ele se vor pierde și nu pot fi restaurate cu iptables -restore.
Ștergeți Regulile cu Numere de Linie
Pentru a șterge o regulă specifică, este nevoie să afișați lista regulilor cu numere de linie:
$ sudo iptables -L --line-numbers
#output Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh 2 ACCEPT tcp -- anywhere anywhere tcp dpt:http 3 ACCEPT tcp -- anywhere anywhere tcp dpt:https 4 ACCEPT tcp -- anywhere anywhere tcp dpt:233 5 REJECT tcp -- anywhere anywhere tcp dpt:392 reject-with icmp-port-unreachable
Pentru a șterge, de exemplu, regula cu numărul 4 din lanțul INPUT, folosiți:
$ sudo iptables -D INPUT 4
Verificați din nou lista de reguli cu iptables -n -v -L.
#output Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:392 reject-with icmp-port-unreachable
Afișează Numai Regulile Lanțului INPUT sau OUTPUT
Pentru a vedea doar regulile din lanțul INPUT:
$ sudo iptables -L INPUT -n -v --line-numbers
#ouput Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 2 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 3 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 4 0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:392 reject-with icmp-port-unreachable
<