Modul 5 · 5.2
En brannmur med ufw og nftables
Modul 5: Skjerm av nettverket · Lesetid: 12 minutter
Læringsmål: Etter denne leksjonen kan du sette opp en brannmur som bare slipper inn det som trengs, for både IPv4 og IPv6, uten å stenge deg selv ute. Du vet også hva en brannmur på serveren ikke beskytter mot.
Nøkkelbegreper: pakkefilter, netfilter, nftables, iptables-nft, ufw, standardpolicy, allow, deny, reject, limit, IPv6 i ufw, leverandørens brannmur, firewalld, Docker og brannmuren
Hva en brannmur gjør
En brannmur på serveren din er et pakkefilter: for hver nettverkspakke som kommer inn, ser den på en liste med regler og bestemmer om pakken slipper gjennom. I Linux ligger dette filteret i kjernen og heter netfilter. Du stiller det inn med et program:
- nftables (kommandoen
nft) er dagens verktøy. Debian har brukt det som standard siden Debian 10. - iptables er det gamle verktøyet. På moderne systemer er
iptablessom regel en oversettelse til nftables (iptables-nft), slik at gamle veiledninger fortsatt fungerer. - ufw (Uncomplicated Firewall) er et enkelt lag oppå, installert som standard på Ubuntu og mulig å installere med én kommando på Debian. For én enkelt server er ufw det enkleste valget. Denne leksjonen bruker ufw og viser deretter hvordan de samme reglene ser ut i nftables.
En brannmur er det andre forsvarslaget ditt. Det første er at tjenester bare lytter på riktig adresse (leksjon 5.1). Sammen sørger de for at en feil i det ene laget ikke straks blir en åpen dør.
Først: hvordan kommer du tilbake hvis noe går galt?
Den klassiske feilen: du slår på brannmuren, glemmer å tillate SSH, og tilkoblingen din faller ut. Da kommer du ikke lenger inn via SSH. Før du begynner:
- Vit hvordan du åpner konsollen hos leverandøren din (leksjon 1.2). Den går utenom nettverket, så den virker også når brannmuren stenger alt. Der logger du inn og skriver
ufw disable. - Ta et øyeblikksbilde (snapshot) hvis du er i tvil.
- Hold den nåværende SSH-økten åpen og test med en ny økt.
ufw i fem trinn
Trinn 1: installer og velg 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'Standardpolicyen gjelder for alt som ikke har en egen regel. "Deny incoming" betyr: alt som kommer inn er forbudt, unntatt det du tillater etterpå. Det er det eneste trygge utgangspunktet. Utgående trafikk (serveren din som henter oppdateringer) tillater du.
Trinn 2: tillat SSH før du slår på brannmuren.
anna@web1:~$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)OpenSSH er en applikasjonsprofil som ufw kjenner (den står for port 22/tcp). Kjører SSH på en annen port, bruker du nummeret: sudo ufw allow 2222/tcp. Legg merke til "Rules updated (v6)": ufw lager regelen også for IPv6. Det gjør den fordi /etc/default/ufw inneholder linjen IPV6=yes, som er standard. Sjekk det likevel. Står den på no, gjelder brannmuren din bare for IPv4.
Trinn 3: det du ellers trenger.
anna@web1:~$ sudo ufw allow 80/tcp
anna@web1:~$ sudo ufw allow 443/tcp
anna@web1:~$ sudo ufw allow 443/udp # kun hvis du bruker HTTP/3Du kan begrense en regel til én kildeadresse, for eksempel en administrasjonsport som bare skal nås fra kontoret ditt:
anna@web1:~$ sudo ufw allow from 198.51.100.20 to any port 9090 proto tcpTrinn 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 startupTrinn 5: kontroller. Åpne et nytt vindu og logg inn på nytt. Går det, er SSH riktig satt opp. Se deretter på reglene:
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 fjerner en regel ved hjelp av nummer: sudo ufw status numbered og deretter sudo ufw delete 3.
deny, reject og limit
- deny forkaster pakken i stillhet: utenfra ser du "filtrert" (leksjon 5.1).
- reject sender tilbake et avslag: utenfra ser du "lukket". Ryddigere for dine egne tjenester, men det avslører at det finnes en server der.
- limit tillater en tilkobling, men blokkerer en adresse som prøver å koble til seks ganger eller mer innen 30 sekunder. Nyttig for SSH:
sudo ufw limit OpenSSHi stedet forallow. Det er grovt (det teller tilkoblinger, ikke mislykkede innlogginger). fail2ban (leksjon 5.3) er mer presis.
De samme reglene i nftables
Under panseret skriver ufw netfilter-regler. Vil du klare deg uten ufw, skriver du en nftables-fil selv. På Debian ligger den i /etc/nftables.conf, og du laster 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;
}
}Les det slik. Tabellen heter filter og tilhører familien inet: én tabell for IPv4 og IPv6 samtidig, så du ikke kan glemme IPv6. I kjeden input er policyen drop. Deretter: svar på tilkoblinger som allerede finnes, slipper tilbake (established,related), alt på loopback er tillatt, ICMP er tillatt (nødvendig blant annet for IPv6 og for feilmeldinger om pakkestørrelse), og portene 22, 80 og 443 er tillatt.
anna@web1:~$ sudo nft -c -f /etc/nftables.conf # kontroller uten å laste inn
anna@web1:~$ sudo systemctl enable --now nftables
anna@web1:~$ sudo nft list rulesetBruk enten ufw eller en egen nftables-fil, ikke begge: de skriver til samme netfilter og kan komme i veien for hverandres regler.
Hva brannmuren ikke beskytter mot
- Tjenester du selv slipper inn. Port 443 er åpen for nettstedet ditt, så et sikkerhetshull i nettstedet er fortsatt tilgjengelig. Brannmuren beskytter bare portene som er stengt.
- Docker. Når du publiserer en port med Docker (
-p 5432:5432), lager Docker sine egne netfilter-regler, som videresender trafikken før reglene til ufw gjelder. Docker-dokumentasjonen sier rett ut at Docker og ufw ikke fungerer godt sammen. En containerport kan dermed være åpen utenfra selv omufw statusikke viser den. Løsningen (publisere på127.0.0.1) lærer du i leksjon 9.3. - Utgående trafikk. Med "allow outgoing" kan et hacket program nå hvor som helst. For de fleste små servere er det et akseptabelt valg. Strenge miljøer begrenser også utgående trafikk.
Leverandørens brannmur
Mange leverandører har også en brannmur i nettverket, foran serveren din, som du stiller inn i kundepanelet (noen ganger kalt "cloud firewall" eller "security group"). Den er et fint ekstra lag, og den virker også om du gjør noe feil på selve serveren. Men den erstatter ikke brannmuren på serveren: flytter du serveren eller bytter leverandør, blir den ikke med, og ikke alle leverandører tilbyr den. Ha derfor alltid en brannmur på selve serveren.
På AlmaLinux og Rocky Linux
Der er firewalld slått på som standard, med soner. De viktigste kommandoene:
[root@web1 ~]# firewall-cmd --list-all
[root@web1 ~]# firewall-cmd --permanent --add-service=http --add-service=https
[root@web1 ~]# firewall-cmd --reloadUten --permanent gjelder en endring bare til neste omstart. Med --permanent gjelder den først etter --reload. SSH er allerede åpen i standardsonen.
I praksis
Stenger du deg likevel ute på en VPS hos WebOké, åpner du konsollen i VPS-skjermbildet, logger inn og slår av brannmuren (ufw disable) eller tilbakestiller den siste regelen. Hos andre leverandører heter denne nødinngangen også konsoll, VNC eller rescue. Finn ut hvor den knappen er før du trenger den.
Oppsummering
- En brannmur er det andre laget ditt etter "lytt bare der det trengs". nftables er verktøyet i kjernen, ufw et enkelt lag oppå.
- Start med
default deny incoming, tillat SSH førufw enable, test med en ny økt, og kjenn konsollen hos leverandøren din. - Kontroller at ufw også dekker IPv6 (
IPV6=yes). I nftables gjør familieninetdet i én operasjon. denygir "filtrert" utenfra,rejectgir "lukket".limitbremser gjentatte tilkoblinger.- Docker-porter går forbi ufw (leksjon 9.3). Leverandørens brannmur er et ekstra lag, ikke en erstatning.
Quiz
Oppgave
Oppgave O5.2: Sett opp brannmuren din. Slå på en brannmur på serveren din med ufw (eller nftables, eller firewalld på AlmaLinux/Rocky): alt innkommende stengt som standard, SSH, og det du ellers virkelig trenger. Test med en ny økt, kontroller at IPv6 er dekket, og sjekk utenfra med nc at en port som ikke er tillatt, er lukket eller filtrert. Fyll ut sjekklisten og lim inn ufw status verbose (eller nft list ruleset). Oppgi for hver åpen port hva den brukes til.
Oppgave O5.2: Sett opp brannmuren din
Denne oppgaven gjør du selv; ingen kontrollerer den. Kryss av det du har gjort, og merk oppgaven som fullført.
For en webserver bare 22 (eller SSH-porten din), 80 og 443, for IPv4 og IPv6. Administrasjonsporter bare fra en fast adresse eller via en SSH-tunnel. Via konsollen: ufw disable (eller tøm nftables-reglene).
Avkrysningene og notatene dine blir kun i denne nettleseren; vi sender dem ikke noe sted. Er du logget inn, lagrer vi kun i Mine kurs at du har gjort oppgaven.
Les mer
- Sikre VPS-en din: de første fem minuttene
- Har du ikke lenger tilgang til VPS-en din? Dette gjør du nå
- Debian Wiki, nftables: https://wiki.debian.org/nftables
- Ubuntu Server-dokumentasjonen, Firewall (ufw): https://ubuntu.com/server/docs/how-to/security/firewalls/
- Docker-dokumentasjonen, Packet filtering and firewalls: https://docs.docker.com/engine/network/packet-filtering-firewalls/
- Hvilke tjenester lytter på VPS-en din, og hva er tilgjengelig utenfra?
- VPS: fra første innlogging til sikker server 3.4: En brannmur med ufw (eller nftables)
