25+ Cele mai comune comenzi iptables cu exemple

Î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 (apăsați Enter).

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

<