Un firewall stateless analizează fiecare pachet de rețea izolat, fără să știe nimic despre pachetele anterioare din aceeași conexiune. O regulă stateless clasică permite sau blochează traficul pe baza adresei IP sursă, adresei IP destinație, portului și protocolului, dar tratează fiecare pachet ca pe un eveniment independent. Routerele mai vechi funcționau adesea exclusiv astfel, iar regulile trebuiau scrise în ambele direcții, atât pentru pachetul care pleacă, cât și pentru răspunsul care se întoarce.
Un firewall stateful, în schimb, ține evidența conexiunilor active într-un tabel numit conntrack (connection tracking) pe Linux. Când un pachet inițiază o conexiune TCP nouă, firewallul înregistrează sursa, destinația, porturile și starea conexiunii, iar pachetele următoare din aceeași conexiune sunt recunoscute automat, fără să mai fie nevoie de reguli separate pentru traficul de răspuns. nftables, succesorul lui iptables inclus implicit în Ubuntu din versiunea 20.04 și în Debian din versiunea 10, folosește expresia ct state tocmai pentru acest scop.
Stările unei conexiuni în conntrack
Linux recunoaște patru stări principale pentru o conexiune urmărită: «new» pentru primul pachet al unei conexiuni, «established» pentru o conexiune deja confirmată prin schimbul de pachete în ambele direcții, «related» pentru o conexiune secundară legată de una existentă, cum este canalul de date FTP deschis după conexiunea de control, și «invalid» pentru pachete care nu se potrivesc cu nicio conexiune cunoscută, adesea semn de scanare sau de pachet corupt. O regulă tipică într-un firewall de producție acceptă traficul established și related, respinge traficul invalid și aplică reguli explicite doar pentru traficul new.
table inet filter {
chain input {
type filter hook input priority 0;
ct state established,related accept
ct state invalid drop
tcp dport 22 ct state new accept
}
}
Exemplul de mai sus, scris în sintaxa nftables, arată structura minimă a unui firewall stateful pe un server Linux. Prima regulă acceptă tot traficul care aparține unei conexiuni deja stabilite, indiferent de portul folosit, ceea ce elimină nevoia de a scrie o regulă separată pentru fiecare răspuns al serverului. A doua regulă elimină pachetele marcate ca invalide de motorul de tracking. A treia regulă permite conexiuni noi doar către portul 22, folosit de SSH.
De ce contează diferența în practică
Pe un server dintr-un centru de date, un firewall stateless corect configurat tot funcționează, dar cere de două până la trei ori mai multe reguli decât unul stateful pentru același nivel de protecție, iar fiecare regulă suplimentară crește riscul unei greșeli de configurare. În plus, urmărirea stării permite protecții pe care un firewall stateless nu le poate oferi, cum este limitarea numărului de conexiuni noi pe secundă de la aceeași adresă IP, o tehnică folosită frecvent împotriva atacurilor de tip SYN flood.
Toate protocoalele VPN discutate în acest curs, WireGuard, OpenVPN și IPsec, funcționează peste UDP sau TCP obișnuit, deci regulile de firewall pe care le veți scrie pentru ele urmează exact acest model stateful. Un tunel WireGuard, de exemplu, nu are nevoie decât de o regulă care acceptă conexiuni noi UDP pe portul 51820, restul traficului fiind gestionat automat de conntrack pe baza stării conexiunii.