Modul 5 · 5.2
En brandvägg med ufw och nftables
Modul 5: Skydda nätverket · Lästid: 12 minuter
Lärandemål: Efter den här lektionen kan du konfigurera en brandvägg som bara släpper in det som behövs, för IPv4 och IPv6, utan att låsa ute dig själv. Du vet också vad en brandvägg på din server inte skyddar mot.
Nyckelbegrepp: paketfilter, netfilter, nftables, iptables-nft, ufw, standardpolicy, allow, deny, reject, limit, IPv6 i ufw, leverantörens brandvägg, firewalld, Docker och brandväggen
Vad en brandvägg gör
En brandvägg på din server är ett paketfilter: för varje inkommande nätverkspaket går den igenom en lista med regler och avgör om paketet får passera. I Linux sitter filtret i kärnan och heter netfilter. Du styr det med ett program:
- nftables (kommandot
nft) är dagens verktyg. Debian använder det som standard sedan Debian 10. - iptables är det gamla verktyget. På moderna system är
iptablesoftast en översättning till nftables (iptables-nft), så att gamla guider fortfarande fungerar. - ufw (Uncomplicated Firewall) är ett enkelt lager ovanpå, som finns som standard i Ubuntu och installeras med ett enda kommando i Debian. För en enskild server är ufw det enklaste valet. Den här lektionen använder ufw och visar sedan hur samma regler ser ut i nftables.
En brandvägg är ditt andra försvarslager. Det första är att tjänster bara lyssnar på rätt adress (lektion 5.1). Tillsammans ser de till att ett misstag i det ena lagret inte direkt blir en öppen dörr.
Först: hur kommer du tillbaka om något går fel?
Det klassiska misstaget: du slår på brandväggen, glömmer att släppa in SSH och anslutningen bryts. Då kommer du inte längre åt servern via SSH. Innan du börjar:
- Ta reda på hur du öppnar leverantörens konsol (lektion 1.2). Den fungerar vid sidan av nätverket, alltså även när brandväggen stänger allt. Där loggar du in och skriver
ufw disable. - Ta en snapshot om du är osäker.
- Håll din nuvarande SSH-session öppen och testa med en andra session.
ufw i fem steg
Steg 1: installera och välj standard.
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'Standardpolicyn gäller för allt som saknar en regel. "Deny incoming" betyder: allt som kommer in är förbjudet, utom det du tillåter härnäst. Det är den enda säkra grunden. Utgående trafik (när din server hämtar uppdateringar) tillåter du.
Steg 2: tillåt SSH innan du slår på brandväggen.
anna@web1:~$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)OpenSSH är en applikationsprofil som ufw känner till (den motsvarar port 22/tcp). Kör SSH på en annan port använder du numret: sudo ufw allow 2222/tcp. Lägg märke till "Rules updated (v6)": ufw skapar regeln även för IPv6. Det gör den eftersom /etc/default/ufw innehåller raden IPV6=yes, vilket är standard. Kontrollera det; står den på no gäller brandväggen bara för IPv4.
Steg 3: det du behöver i övrigt.
anna@web1:~$ sudo ufw allow 80/tcp
anna@web1:~$ sudo ufw allow 443/tcp
anna@web1:~$ sudo ufw allow 443/udp # bara om du använder HTTP/3Du kan begränsa en regel till en enda källadress, till exempel en administrationsport som bara får nås från ditt kontor:
anna@web1:~$ sudo ufw allow from 198.51.100.20 to any port 9090 proto tcpSteg 4: slå på.
anna@web1:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startupSteg 5: kontrollera. Öppna ett andra fönster och logga in igen. Lyckas det är SSH rätt inställt. Titta sedan på reglerna:
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)Du tar bort en regel med nummer: sudo ufw status numbered och sedan sudo ufw delete 3.
deny, reject och limit
- deny släpper paketet tyst: utifrån ser du "filtrerad" (lektion 5.1).
- reject skickar tillbaka en vägran: utifrån ser du "stängd". Snyggare för dina egna tjänster, men det avslöjar att det finns en server.
- limit tillåter en anslutning, men blockerar en adress som försöker ansluta sex gånger eller fler inom 30 sekunder. Praktiskt för SSH:
sudo ufw limit OpenSSHi stället förallow. Det är grovt (det räknar anslutningar, inte misslyckade inloggningar); fail2ban (lektion 5.3) är mer exakt.
Samma regler i nftables
Under huven skriver ufw netfilter-regler. Vill du arbeta utan ufw skriver du en egen nftables-fil. I Debian ligger den i /etc/nftables.conf och du laddar den med tjänsten 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;
}
}Läs den så här. Tabellen heter filter och tillhör familjen inet: en tabell för både IPv4 och IPv6 samtidigt, så att du inte kan glömma IPv6. I kedjan input är policyn drop. Sedan: svar på anslutningar som redan finns får komma tillbaka (established,related), allt på loopback tillåts, ICMP tillåts (behövs bland annat för IPv6 och för felmeddelanden om paketstorlek), och portarna 22, 80 och 443 tillåts.
anna@web1:~$ sudo nft -c -f /etc/nftables.conf # kontrollera utan att ladda
anna@web1:~$ sudo systemctl enable --now nftables
anna@web1:~$ sudo nft list rulesetAnvänd antingen ufw eller en egen nftables-fil, inte båda: de skriver i samma netfilter och kan komma i vägen för varandras regler.
Vad brandväggen inte skyddar mot
- Tjänster som du själv släpper in. Port 443 är öppen för din webbplats; ett säkerhetshål i webbplatsen går alltså att nå som vanligt. Brandväggen skyddar bara de portar som är stängda.
- Docker. När du publicerar en port med Docker (
-p 5432:5432) lägger Docker in egna netfilter-regler som leder om trafiken innan ufw:s regler gäller. Docker-dokumentationen säger rakt ut att Docker och ufw inte fungerar bra ihop. En containerport kan alltså vara öppen utifrån fastufw statusinte visar den. Lösningen (publicera på127.0.0.1) lär du dig i lektion 9.3. - Utgående trafik. Med "allow outgoing" kan ett hackat program skicka trafik vart som helst. För de flesta små servrar är det ett rimligt val; strikta miljöer begränsar även utgående trafik.
Leverantörens brandvägg
Många leverantörer har också en brandvägg i nätverket, framför din server, som du ställer in i kundpanelen (ibland kallad "cloud firewall" eller "security group"). Det är ett utmärkt extra lager, och det fungerar även om du gör fel på själva servern. Men den ersätter inte brandväggen på servern: flyttar du servern eller byter leverantör följer den inte med, och alla leverantörer erbjuder den inte. Ha därför alltid en brandvägg på själva servern.
På AlmaLinux och Rocky Linux
Där är firewalld påslaget som standard, med zoner. De viktigaste kommandona:
[root@web1 ~]# firewall-cmd --list-all
[root@web1 ~]# firewall-cmd --permanent --add-service=http --add-service=https
[root@web1 ~]# firewall-cmd --reloadUtan --permanent gäller en ändring bara till nästa omstart; med --permanent gäller den först efter --reload. SSH är redan öppet i standardzonen.
I praktiken
Låser du ändå ute dig själv på en VPS hos WebOké öppnar du konsolen i VPS-vyn, loggar in och stänger av brandväggen (ufw disable) eller backar den senaste regeln. Hos andra leverantörer heter nödingången också konsol, VNC eller rescue. Ta reda på var den knappen finns innan du behöver den.
Sammanfattning
- En brandvägg är ditt andra lager efter "lyssna bara där det behövs"; nftables är verktyget för kärnan, ufw ett enkelt lager ovanpå.
- Börja med
default deny incoming, tillåt SSH föreufw enable, testa med en andra session och lär dig leverantörens konsol. - Kontrollera att ufw även täcker IPv6 (
IPV6=yes); i nftables gör familjeninetdet på en gång. denyger "filtrerad" utifrån,rejectger "stängd";limitbromsar upprepade anslutningar.- Docker-portar går förbi ufw (lektion 9.3); leverantörens brandvägg är ett extra lager, ingen ersättning.
Quiz
Uppgift
Uppgift O5.2: Konfigurera din brandvägg. Slå på en brandvägg på din server med ufw (eller nftables, eller firewalld på AlmaLinux/Rocky): allt inkommande stängt som standard, SSH och det du verkligen behöver i övrigt. Testa med en andra session, kontrollera att IPv6 täcks och undersök utifrån med nc om en port som inte är tillåten är stängd eller filtrerad. Fyll i checklistan och klistra in din ufw status verbose (eller nft list ruleset); ange för varje öppen port vad den används till.
Uppgift O5.2: Konfigurera din brandvägg
Den här uppgiften gör du själv; ingen kontrollerar den. Bocka av vad du har gjort och markera uppgiften som klar.
För en webbserver bara 22 (eller din SSH-port), 80 och 443, för IPv4 och IPv6. Administrationsportar bara från en fast adress eller via en SSH-tunnel. Via konsolen: ufw disable (eller töm nftables-reglerna).
Dina bockar och anteckningar sparas bara i den här webbläsaren; vi skickar dem ingenstans. Är du inloggad sparar vi i Mina kurser bara att du har gjort uppgiften.
Läs mer
- Skydda din VPS: de första fem minuterna
- Ingen åtkomst till din VPS längre: vad gör du?
- Debian Wiki, nftables: https://wiki.debian.org/nftables
- Ubuntu Server-dokumentationen, Firewall (ufw): https://ubuntu.com/server/docs/how-to/security/firewalls/
- Docker-dokumentationen, Packet filtering and firewalls: https://docs.docker.com/engine/network/packet-filtering-firewalls/
