Hoppa till innehållet

Cookieinställningar

Välj vilka typer av cookies du tillåter. Du kan alltid ändra ditt val via Cookieinställningar längst ned på varje sida. Integritetspolicy

Nödvändiga

Alltid på

Behövs för att logga in, spara din varukorg och komma ihåg dina val. De är alltid på.

Vilka cookies?
  • weboke_sessie, weboke_klant, weboke_remember: din session och att du förblir inloggad
  • weboke_basket: din varukorg
  • wkBtwIncl: visa priser med eller utan moms
  • wok_cookies: ditt cookieval, 12 månader

Mäter vilken annons som leder till ett besök eller en beställning, så att vi inte betalar för annonser som inte ger något.

Vilka cookies?
  • Google Ads via Google Tag Manager (_gcl_au, _gcl_aw), upp till 90 dagar
  • OpenAI Ads, annonser i ChatGPT
  • wok_aff: via vilken partner du kom till oss (affiliateprogram), 60 dagar

4,6

Land och språk

Varje land har en egen webbplats med landets priser och moms.

Visa

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 iptables oftast 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:

  1. 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.
  2. Ta en snapshot om du är osäker.
  3. 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/3

Du 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 tcp

Steg 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 startup

Steg 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 OpenSSH i stället för allow. 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 ruleset

Anvä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 fast ufw status inte 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 --reload

Utan --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öre ufw 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 familjen inet det på en gång.
  • deny ger "filtrerad" utifrån, reject ger "stängd"; limit bromsar upprepade anslutningar.
  • Docker-portar går förbi ufw (lektion 9.3); leverantörens brandvägg är ett extra lager, ingen ersättning.

Quiz

1. I vilken ordning slår du på ufw för första gången på en server där du är inloggad via SSH?



2. Efter ufw enable fungerar din webbplats inte längre via IPv4, men SSH fungerar. Vad är den troligaste orsaken?



3. Du publicerar port 5432 från en databascontainer med Docker. ufw status visar ingen regel för 5432. Går databasen att nå utifrån?



4. Varför använder nftables-exemplet en tabell av familjen inet?



5. Din leverantör har en nätverksbrandvägg i kundpanelen. Behöver du då fortfarande en brandvägg på servern?



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.



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

Ett ögonblick…

Ställ in dina domäner

Ställ in namnservrar, koppling till ditt webbhotell och vem som blir innehavare för varje domän.

Hämtar dina domäner…