Modulul 5 · 5.2
Un firewall cu ufw și nftables
Modulul 5: Protejarea rețelei · Timp de citire: 12 minute
Obiectivul lecției: După această lecție veți putea configura un firewall care permite doar ce este necesar, pentru IPv4 și IPv6, fără să vă blocați propriul acces, și veți ști împotriva căror lucruri nu vă protejează un firewall pe server.
Noțiuni cheie: filtru de pachete, netfilter, nftables, iptables-nft, ufw, politică implicită, allow, deny, reject, limit, IPv6 în ufw, firewall-ul furnizorului, firewalld, Docker și firewall-ul
Ce face un firewall
Un firewall pe serverul dumneavoastră este un filtru de pachete: pentru fiecare pachet de rețea care sosește, consultă o listă de reguli și decide dacă îl lasă să treacă. În Linux, acest filtru se află în kernel și se numește netfilter. Îl configurați cu ajutorul unui program:
- nftables (comanda
nft) este instrumentul actual. Debian îl folosește implicit începând cu Debian 10. - iptables este instrumentul vechi. Pe sistemele moderne,
iptableseste de obicei o traducere către nftables (iptables-nft), astfel încât ghidurile vechi încă funcționează. - ufw (Uncomplicated Firewall) este un strat simplu deasupra, prezent implicit pe Ubuntu și instalabil cu o singură comandă pe Debian. Pentru un singur server, ufw este cea mai simplă alegere. Această lecție folosește ufw și arată apoi cum arată aceleași reguli în nftables.
Un firewall este al doilea dumneavoastră strat de apărare. Primul este ca serviciile să asculte doar pe adresa corectă (lecția 5.1). Împreună, ele fac ca o greșeală într-un strat să nu însemne imediat o ușă deschisă.
Mai întâi: cum reveniți dacă ceva nu merge?
Greșeala clasică: porniți firewall-ul, uitați să permiteți SSH, iar conexiunea se întrerupe. Atunci nu mai puteți accesa serverul prin SSH. Înainte de a începe:
- Aflați cum deschideți consola furnizorului dumneavoastră (lecția 1.2). Aceasta funcționează în afara rețelei, deci și atunci când firewall-ul blochează totul. Acolo vă autentificați și tastați
ufw disable. - Faceți un snapshot dacă aveți îndoieli.
- Păstrați deschisă sesiunea SSH curentă și testați cu o a doua sesiune.
ufw în cinci pași
Pasul 1: instalarea și alegerea politicii implicite.
anna@web1:~$ sudo apt install ufw
anna@web1:~$ sudo ufw default deny incoming
Default incoming policy changed to 'deny'
anna@web1:~$ sudo ufw default allow outgoing
Default outgoing policy changed to 'allow'Politica implicită se aplică pentru tot ce nu are o regulă. "Deny incoming" înseamnă: tot ce intră este interzis, cu excepția a ceea ce permiteți ulterior. Aceasta este singura bază sigură. Traficul de ieșire (serverul dumneavoastră care descarcă actualizări) îl permiteți.
Pasul 2: permiteți SSH, înainte de a porni firewall-ul.
anna@web1:~$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)OpenSSH este un profil de aplicație pe care ufw îl cunoaște (corespunde portului 22/tcp). Dacă SSH rulează pe alt port, folosiți numărul: sudo ufw allow 2222/tcp. Observați "Rules updated (v6)": ufw creează regula și pentru IPv6. Face acest lucru deoarece în /etc/default/ufw se află setarea IPV6=yes, care este valoarea implicită. Verificați acest lucru; dacă este setată la no, firewall-ul dumneavoastră se aplică doar pentru IPv4.
Pasul 3: ce mai aveți nevoie.
anna@web1:~$ sudo ufw allow 80/tcp
anna@web1:~$ sudo ufw allow 443/tcp
anna@web1:~$ sudo ufw allow 443/udp # doar dacă folosiți HTTP/3Puteți limita o regulă la o singură adresă sursă, de exemplu un port de administrare accesibil doar de la birou:
anna@web1:~$ sudo ufw allow from 198.51.100.20 to any port 9090 proto tcpPasul 4: pornirea.
anna@web1:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startupPasul 5: verificarea. Deschideți o a doua fereastră și autentificați-vă din nou. Dacă reușiți, SSH este configurat corect. Apoi verificați regulile:
anna@web1:~$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
443/tcp (v6) ALLOW IN Anywhere (v6)Ștergerea unei reguli se face prin numere: sudo ufw status numbered și apoi sudo ufw delete 3.
deny, reject și limit
- deny aruncă pachetul în tăcere: din exterior vedeți "filtrat" (lecția 5.1).
- reject trimite înapoi un refuz: din exterior vedeți "închis". Este mai elegant pentru propriile servicii, dar dezvăluie că există un server.
- limit permite o conexiune, dar blochează o adresă care încearcă să se conecteze de șase ori sau mai mult în 30 de secunde. Util pentru SSH:
sudo ufw limit OpenSSHîn loc deallow. Este o metodă grosieră (numără conexiunile, nu autentificările eșuate); fail2ban (lecția 5.3) este mai precis.
Aceleași reguli în nftables
În spate, ufw scrie reguli netfilter. Dacă doriți să lucrați fără ufw, scrieți singur un fișier nftables. Pe Debian acesta se află în /etc/nftables.conf și îl încărcați cu serviciul nftables:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
ct state invalid drop
iif "lo" accept
meta l4proto { icmp, ipv6-icmp } accept
tcp dport { 22, 80, 443 } accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}Citiți-l astfel. Tabelul se numește filter și aparține familiei inet: un singur tabel pentru IPv4 și IPv6 în același timp, astfel încât nu puteți uita IPv6. În lanțul input, politica este drop. Apoi: răspunsurile la conexiunile deja existente pot reveni (established,related), tot ce este pe loopback este permis, ICMP este permis (necesar, printre altele, pentru IPv6 și pentru mesajele de eroare privind dimensiunea pachetelor), iar porturile 22, 80 și 443 sunt permise.
anna@web1:~$ sudo nft -c -f /etc/nftables.conf # verificare fără încărcare
anna@web1:~$ sudo systemctl enable --now nftables
anna@web1:~$ sudo nft list rulesetFolosiți fie ufw, fie un fișier nftables propriu, nu pe amândouă: ele scriu în același netfilter și își pot încurca reciproc regulile.
Împotriva a ce nu vă protejează firewall-ul
- Serviciile pe care le permiteți chiar dumneavoastră. Portul 443 este deschis pentru site-ul dumneavoastră; o vulnerabilitate în site rămâne deci accesibilă. Firewall-ul protejează doar porturile închise.
- Docker. Când publicați un port cu Docker (
-p 5432:5432), Docker își setează propriile reguli netfilter, care redirecționează traficul înainte ca regulile ufw să se aplice. Documentația Docker spune textual că Docker și ufw nu se înțeleg bine. Un port de container poate fi deci deschis din exterior, în timp ceufw statusnu îl afișează. Soluția (publicarea pe127.0.0.1) o învățați în lecția 9.3. - Traficul de ieșire. Cu "allow outgoing", un program compromis poate comunica oriunde. Pentru majoritatea serverelor mici aceasta este o alegere acceptabilă; mediile stricte limitează și traficul de ieșire.
Firewall-ul furnizorului dumneavoastră
Mulți furnizori au și un firewall în rețea, în fața serverului dumneavoastră, pe care îl configurați în panoul de client (numit uneori "cloud firewall" sau "security group"). Acesta este un strat suplimentar excelent și funcționează chiar dacă greșiți ceva pe server. Dar nu înlocuiește firewall-ul de pe server: dacă mutați serverul sau schimbați furnizorul, acesta nu vine cu dumneavoastră, iar nu orice furnizor îl oferă. De aceea, păstrați întotdeauna un firewall pe serverul propriu-zis.
Pe AlmaLinux și Rocky Linux
Acolo, firewalld este activ implicit, cu zone. Cele mai importante comenzi:
[root@web1 ~]# firewall-cmd --list-all
[root@web1 ~]# firewall-cmd --permanent --add-service=http --add-service=https
[root@web1 ~]# firewall-cmd --reloadFără --permanent, o modificare se aplică doar până la următoarea repornire; cu --permanent, abia după --reload. SSH este deja deschis în zona implicită.
În practică
Dacă totuși vă blocați accesul pe un VPS la WebOké, deschideți consola în ecranul VPS-ului, vă autentificați și opriți firewall-ul (ufw disable) sau anulați ultima regulă. La alți furnizori, această intrare de urgență se numește tot consolă, VNC sau rescue. Aflați unde se află acel buton înainte să aveți nevoie de el.
Rezumat
- Un firewall este al doilea strat după "ascultați doar unde este necesar"; nftables este instrumentul din kernel, ufw un strat simplu deasupra.
- Începeți cu
default deny incoming, permiteți SSH înainte deufw enable, testați cu o a doua sesiune și cunoașteți consola furnizorului dumneavoastră. - Verificați ca ufw să acopere și IPv6 (
IPV6=yes); în nftables, familiainetface acest lucru dintr-o dată. denyapare din exterior ca "filtrat",rejectapare ca "închis";limitfrânează conexiunile repetate.- Porturile Docker ocolesc ufw (lecția 9.3); firewall-ul furnizorului este un strat suplimentar, nu un înlocuitor.
Test (quiz)
Exercițiu
Exercițiul O5.2: Configurarea firewall-ului dumneavoastră. Porniți pe serverul dumneavoastră un firewall cu ufw (sau nftables, sau firewalld pe AlmaLinux/Rocky): implicit tot traficul de intrare închis, SSH și ce mai aveți cu adevărat nevoie. Testați cu o a doua sesiune, verificați dacă IPv6 este acoperit și verificați din exterior cu nc dacă un port nepermis este închis sau filtrat. Completați lista de verificare și lipiți rezultatul ufw status verbose (sau nft list ruleset); indicați pentru fiecare port deschis la ce folosește.
Exercițiul O5.2: Configurarea firewall-ului dumneavoastră
Acest exercițiu îl faceți singur; nimeni nu îl verifică. Bifați ce ați făcut și marcați exercițiul ca finalizat.
Pentru un server web doar 22 (sau portul dumneavoastră SSH), 80 și 443, pentru IPv4 și IPv6. Porturile de administrare doar de la o adresă fixă sau printr-un tunel SSH. Prin consolă: ufw disable (sau goliți regulile nftables).
Bifele și notițele dumneavoastră rămân doar în acest browser; nu le trimitem nicăieri. Dacă sunteți autentificat, păstrăm în Cursurile mele doar faptul că ați finalizat exercițiul.
Lecturi suplimentare
- Securizarea VPS-ului dumneavoastră: primele cinci minute
- Nu mai aveți acces la VPS-ul dumneavoastră: ce puteți face?
- Debian Wiki, nftables: https://wiki.debian.org/nftables
- Documentația Ubuntu Server, Firewall (ufw): https://ubuntu.com/server/docs/how-to/security/firewalls/
- Documentația Docker, Packet filtering and firewalls: https://docs.docker.com/engine/network/packet-filtering-firewalls/
- Ce servicii rulează pe VPS-ul dumneavoastră și ce este accesibil din exterior?
- VPS: de la prima autentificare la un server securizat 3.4: Un firewall cu ufw (sau nftables)
