Modul 5 · 5.2
En firewall med ufw og nftables
Modul 5: Afskærm netværket · Læsetid: 12 minutter
Læringsmål: Efter denne lektion kan du sætte en firewall op, der kun tillader det nødvendige, for både IPv4 og IPv6, uden at låse dig selv ude. Du ved også, hvad en firewall på din server ikke beskytter mod.
Centrale begreber: pakkefilter, netfilter, nftables, iptables-nft, ufw, standardpolitik, allow, deny, reject, limit, IPv6 i ufw, udbyderens firewall, firewalld, Docker og firewallen
Hvad en firewall gør
En firewall på din server er et pakkefilter: for hver netværkspakke, der kommer ind, kigger den på en liste med regler og afgør, om pakken må komme igennem. I Linux ligger det filter i kernen og hedder netfilter. Du styrer det med et program:
- nftables (kommandoen
nft) er det nuværende værktøj. Debian har brugt det som standard siden Debian 10. - iptables er det gamle værktøj. På moderne systemer er
iptablessom regel en oversættelse til nftables (iptables-nft), så gamle vejledninger stadig virker. - ufw (Uncomplicated Firewall) er et enkelt lag ovenpå, som følger med Ubuntu som standard og kan installeres på Debian med én kommando. Til en enkelt server er ufw det nemmeste valg. Denne lektion bruger ufw og viser bagefter, hvordan de samme regler ser ud i nftables.
En firewall er dit andet forsvarslag. Det første er, at tjenester kun lytter på den rigtige adresse (lektion 5.1). Tilsammen sørger de for, at en fejl i det ene lag ikke straks bliver en åben dør.
Først: hvordan kommer du ind igen, hvis det går galt?
Den klassiske fejl: du slår firewallen til, glemmer at tillade SSH, og din forbindelse falder. Så kan du ikke længere komme ind via SSH. Før du går i gang:
- Vid, hvordan du åbner din udbyders konsol (lektion 1.2). Den virker uden om netværket, altså også når firewallen lukker alt. Der logger du ind og skriver
ufw disable. - Tag et snapshot, hvis du er i tvivl.
- Hold din nuværende SSH-session åben, og test med en anden session.
ufw i fem trin
Trin 1: installér og vælg standarden.
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'Standardpolitikken gælder for alt, der ikke har en regel. "Deny incoming" betyder: alt, der kommer ind, er forbudt, undtagen det, du tillader herefter. Det er det eneste sikre udgangspunkt. Udgående trafik (din server, der henter opdateringer) tillader du.
Trin 2: tillad SSH, før du slår firewallen til.
anna@web1:~$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)OpenSSH er en applikationsprofil, som ufw kender (den svarer til port 22/tcp). Kører SSH på en anden port, så brug nummeret: sudo ufw allow 2222/tcp. Læg mærke til "Rules updated (v6)": ufw laver også reglen for IPv6. Det gør den, fordi der i /etc/default/ufw står IPV6=yes, hvilket er standarden. Tjek det lige; står den på no, gælder din firewall kun for IPv4.
Trin 3: det, du ellers har brug for.
anna@web1:~$ sudo ufw allow 80/tcp
anna@web1:~$ sudo ufw allow 443/tcp
anna@web1:~$ sudo ufw allow 443/udp # kun hvis du bruger HTTP/3Du kan begrænse en regel til én kildeadresse, for eksempel en administrationsport, der kun må bruges fra dit kontor:
anna@web1:~$ sudo ufw allow from 198.51.100.20 to any port 9090 proto tcpTrin 4: slå den til.
anna@web1:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startupTrin 5: kontrollér. Åbn et andet vindue, og log ind igen. Lykkes det, er SSH sat rigtigt op. Se derefter reglerne:
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)En regel fjerner du med numre: sudo ufw status numbered og derefter sudo ufw delete 3.
deny, reject og limit
- deny lader pakken falde stille: udefra ser du "filtreret" (lektion 5.1).
- reject sender en afvisning tilbage: udefra ser du "lukket". Pænere for dine egne tjenester, men det afslører, at der er en server.
- limit tillader en forbindelse, men blokerer en adresse, der forsøger at oprette forbindelse seks gange eller flere inden for 30 sekunder. Praktisk til SSH:
sudo ufw limit OpenSSHi stedet forallow. Det er groft (det tæller forbindelser, ikke mislykkede logins); fail2ban (lektion 5.3) er mere præcis.
De samme regler i nftables
ufw skriver netfilter-regler under motorhjelmen. Vil du arbejde uden ufw, skriver du selv en nftables-fil. På Debian ligger den i /etc/nftables.conf, og du indlæser den med tjenesten 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ådan. Tabellen hedder filter og tilhører familien inet: én tabel for både IPv4 og IPv6 på samme tid, så du ikke kan glemme IPv6. I kæden input er politikken drop. Derefter: svar på forbindelser, der allerede findes, må komme tilbage (established,related), alt på loopback er tilladt, ICMP er tilladt (nødvendigt blandt andet for IPv6 og fejlmeddelelser om pakkestørrelse), og portene 22, 80 og 443 er tilladt.
anna@web1:~$ sudo nft -c -f /etc/nftables.conf # tjek uden at indlæse
anna@web1:~$ sudo systemctl enable --now nftables
anna@web1:~$ sudo nft list rulesetBrug enten ufw eller en egen nftables-fil, ikke begge: de skriver i samme netfilter og kan komme i vejen for hinandens regler.
Hvad din firewall ikke beskytter mod
- Tjenester, du selv tillader. Port 443 er åben for dit website; et hul i dit website kan altså stadig nås. Firewallen beskytter kun de porte, der er lukkede.
- Docker. Når du publicerer en port med Docker (
-p 5432:5432), sætter Docker sine egne netfilter-regler, som omdirigerer trafikken, før ufw's regler gælder. Docker-dokumentationen siger direkte, at Docker og ufw ikke passer godt sammen. En container-port kan altså være åben udefra, mensufw statusikke viser den. Løsningen (publicér på127.0.0.1) lærer du i lektion 9.3. - Udgående trafik. Med "allow outgoing" kan et hacket program sende trafik hvor som helst hen. For de fleste små servere er det et acceptabelt valg; strenge miljøer begrænser også udgående trafik.
Din udbyders firewall
Mange udbydere har også en firewall i netværket, foran din server, som du sætter op i kundepanelet (nogle gange kaldet "cloud firewall" eller "security group"). Den er et fint ekstra lag, og den virker også, hvis du laver en fejl på selve serveren. Men den erstatter ikke firewallen på serveren: flytter du serveren eller skifter udbyder, følger den ikke med, og ikke alle udbydere tilbyder den. Hav derfor altid en firewall på selve serveren.
På AlmaLinux og Rocky Linux
Her er firewalld slået til som standard, med zoner. De vigtigste kommandoer:
[root@web1 ~]# firewall-cmd --list-all
[root@web1 ~]# firewall-cmd --permanent --add-service=http --add-service=https
[root@web1 ~]# firewall-cmd --reloadUden --permanent gælder en ændring kun til næste genstart; med --permanent først efter --reload. SSH er allerede åben i standardzonen.
I praksis
Låser du alligevel dig selv ude på en VPS hos WebOké, åbner du konsollen i VPS-skærmbilledet, logger ind og slår firewallen fra (ufw disable) eller ruller den sidste regel tilbage. Hos andre udbydere hedder den nødindgang også konsol, VNC eller rescue. Vid, hvor knappen sidder, før du får brug for den.
Opsummering
- En firewall er dit andet lag efter "lyt kun, hvor det er nødvendigt"; nftables er værktøjet i kernen, ufw et enkelt lag ovenpå.
- Start med
default deny incoming, tillad SSH førufw enable, test med en anden session, og kend din udbyders konsol. - Kontrollér, at ufw også dækker IPv6 (
IPV6=yes); i nftables klarer familieninetdet i ét hug. denygiver "filtreret" udefra,rejectgiver "lukket";limitbremser gentagne forbindelser.- Docker-porte går uden om ufw (lektion 9.3); din udbyders firewall er et ekstra lag, ikke en erstatning.
Quiz
Opgave
Opgave O5.2: Sæt din firewall op. Slå en firewall til på din server med ufw (eller nftables, eller firewalld på AlmaLinux/Rocky): alt indgående lukket som standard, SSH og det, du ellers virkelig har brug for. Test med en anden session, kontrollér at IPv6 er dækket, og tjek udefra med nc, at en port, der ikke er tilladt, er lukket eller filtreret. Udfyld tjeklisten, og indsæt din ufw status verbose (eller nft list ruleset); angiv for hver åben port, hvad den bruges til.
Opgave O5.2: Sæt din firewall op
Denne opgave laver du selv; ingen tjekker den. Afkryds hvad du har gjort, og markér opgaven som udført.
For en webserver kun 22 (eller din SSH-port), 80 og 443, for IPv4 og IPv6. Administrationsporte kun fra en fast adresse eller via en SSH-tunnel. Via konsollen: ufw disable (eller tøm nftables-reglerne).
Dine afkrydsninger og noter forbliver kun i denne browser; vi sender dem ingen steder hen. Er du logget ind, gemmer vi kun i Mine kurser, at du har udført opgaven.
Læs mere
- Sikr din VPS: de første fem minutter
- Ingen adgang til din VPS længere: hvad nu?
- Debian Wiki, nftables: https://wiki.debian.org/nftables
- Ubuntu Server-dokumentation, Firewall (ufw): https://ubuntu.com/server/docs/how-to/security/firewalls/
- Docker-dokumentation, Packet filtering and firewalls: https://docs.docker.com/engine/network/packet-filtering-firewalls/
- Hvilke tjenester lytter på din VPS, og hvad kan nås udefra?
- VPS: fra første login til sikker server 3.4: En firewall med ufw (eller nftables)
