# Brandvägg

## Vad det är

En brandvägg är ett filter på en nätverksväg som jämför varje paket eller varje anslutning med en
lista med regler och sedan släpper igenom trafiken, kastar den eller svarar med en vägran. Den kan
vara programvara på den maskin den skyddar, en separat apparat mellan två nät eller en tjänst som en
molnleverantör kör framför en virtuell maskin. Linuxadministratörer säger ofta paketfilter om samma
sak, och molnleverantörer säljer brandväggar under namn som säkerhetsgrupp. I praktiken kommer
brandväggar ofta i två lager: ett hos leverantören och ett på värddatorn.

Vägledningen från NIST i ämnet, SP 800-41 Rev. 1 från september 2009, sorterar dem efter hur mycket
av trafiken de läser. Ett paketfilter tittar på adresser, protokoll och portnummer, ett paket i
taget. En tillståndskänslig brandvägg minns dessutom anslutningar, så svaret på en begäran som
servern själv gjorde släpps in utan en egen regel. En gateway med applikationsproxy avslutar
anslutningen och läser protokollet inuti den. En värdbaserad brandvägg körs på den server eller
bärbara dator som den vaktar och vet vilket program som äger en socket.

På en Linuxserver sker filtreringen i kärnans ramverk netfilter. nftables, som finns sedan
kärnversion 3.13, ersätter de äldre verktygen i iptables, och gränssnitt som ufw skriver reglerna åt
den som hellre anger en avsikt än bygger kedjor. Oavsett vad som skriver reglerna är modellen
densamma: en ordnad lista som läses uppifrån, där den första regel som matchar avgör.

En brandvägg förväxlas ofta med närliggande verktyg. En brandvägg för webbapplikationer läser
HTTP-förfrågningar och blockerar attackmönster i dem; en nätverksbrandvägg tittar aldrig så djupt.
Ett verktyg som spärrar inkräktare läser loggar och lägger till tillfälliga regler mot adresser som
beter sig illa, vilket betyder att det förutsätter en brandvägg under sig. Ett VPN avgör vem som
över huvud taget finns på nätet. Vart och ett av dem svarar på en annan fråga, och inget av dem
ersätter den enkla regellistan.

## Varför det spelar roll

Varje tjänst som lyssnar på en publik adress är en dörr, och brandväggen är förteckningen över vilka
dörrar som finns. Att sätta upp den kräver ett beslut i tre delar: var brandväggen ska ligga, vad
den tillåter som standard och vem som får ändra den.

En brandvägg hos leverantören stoppar trafiken innan den når maskinen, fortsätter att fungera om
någon får root på värddatorn och kostar servern ingen processortid. Dess regler bor i en konsol
eller ett API, utanför serverns egen konfiguration, så de glider isär från den om de inte skrivs som
kod. En brandvägg på värddatorn följer med maskinen, kan hastighetsbegränsa en enskild port och kan
testas från maskinen själv, men ett kapat root-konto kan skriva om den, och det kan även programvara
som hanterar sina egna regler. Att köra båda är vanligt och förnuftigt, till priset av att två
listor måste hållas i takt: varje port som öppnas eller stängs är en ändring på två ställen.

Standardläget är den andra delen. NIST rekommenderar att all trafik som inte uttryckligen är
tillåten nekas, och för inkommande trafik håller nästan alla med. Det är vid filtrering av utgående
trafik som avvägningen märks: den begränsar vad en kapad tjänst kan nå, och den stoppar
paketuppdateringar, förnyelse av certifikat och övervakning tills varje destination har fått sin
regel.

Den tredje delen är ägarskapet. En brandvägg som nekar som standard är bara så korrekt som den lista
med portar som någon har deklarerat, så det användbara dokumentet är just den deklarerade listan,
förvarad i versionshantering och kontrollerad mot de regler som faktiskt är aktiva. Programvaran är
gratis i varje vanlig Linuxdistribution; det som kostar är den uppmärksamhet som krävs för att hålla
deklarationen sann. Och en brandvägg är en andra försvarslinje. En tjänst som är bunden till
loopback-adressen går inte att nå utifrån, vad reglerna än säger, och det är en starkare garanti än
en nekande regel framför en tjänst som lyssnar överallt.

## Så ser det ut i praktiken

Brandväggen väcker här tre frågor: hur den kontrolleras, när den skapas och vad som kan ta
sig runt den.

På en värddator låg en hastighetsbegränsning för SSH-porten i regellistan i ett år utan att ett enda
paket nådde fram till den, eftersom en bredare tillåtande regel ovanför den matchade först.
Statusverktygen listade begränsningen hela året, och de hade rätt att göra det: den fanns.
[Kontrollerna skrevs om för att läsa regelns position i stället för dess förekomst](/sv/portfolio/verified-firewall-rules-by-position-113/):
de jämför nu ordningen i den numrerade regellistan, och i den kedja som kärnan faktiskt filtrerar
med, mot det som var avsikten. Varje port får en regel och varje regel anger ett protokoll; SSH är
hastighetsbegränsad och har ingen separat tillåtande regel. De fem publika portarna deklareras
tillsammans och kontrolleras som en helhet, så en öppen port som deklarationen utelämnar gör
kontrollen röd, och säkerhetsrapporten listar reglerna i den ordning som paketen möter dem, med en
anvisning om hur den ordningen ska läsas.

Den första servern byggdes för hand och fick sin brandvägg först senare, vilket lämnade ett fönster
då en ny maskin var nåbar från internet. För en andra server hos en annan leverantör
[skapas brandväggen av en egen play före maskinen](/sv/portfolio/provisioned-a-second-server-from-code-123/),
så den nya maskinen möter internet med sina regler redan på plats. Den leverantören kopplar
brandväggar till maskiner med taggar, så taggarna skapas först: en regel som riktar sig mot en tagg
kräver att taggen finns. Varje leverantörs brandvägg skrivs direkt mot leverantörens REST-API med en
enkel HTTP-task. Den tasken gör ingenting vid en torrkörning, så ändringar provkörs i stället på
brandväggens play, eftersom en brandvägg hos leverantören inte kostar något att skapa och går att ta
bort igen.

Den tredje gäller containrar. Docker skriver in egna poster i kärnans paketfilter, och en port som
Docker publicerar för en container matchas före allt som värddatorns härdningsroll har lagt dit, så
en container kan vara nåbar utifrån vad brandväggen än har instruerats att göra.
[Den här plattformens containrar körs under systemd genom Podman och Quadlet](/sv/portfolio/deployed-a-container-plane-on-podman-and-quadlet-122/),
delar värddatorns nätverk och publicerar inga portar, så det finns ingen containerport som något kan
använda för att ta sig runt reglerna.

## Var det går fel

**En regel syns i statusutdatan men slår aldrig till.** Regler utvärderas i ordning och den första
träffen vinner, så en bred tillåtande regel som ligger ovanför en snävare begränsning eller nekande
regel skuggar den helt. Listningen visar fortfarande båda. Läs reglerna som kärnan läser dem,
numrerade och i ordning, lägg specifika regler ovanför allmänna och testa från en maskin utanför:

```sh
ufw status numbered
nft list ruleset
```

**En container svarar på en port som brandväggen nekar.** Docker publicerar portar genom att styra
om trafiken i kärnans NAT-tabell, innan den når de kedjor som ufw filtrerar, och Dockers egen
dokumentation säger att det i praktiken innebär att brandväggens konfiguration ignoreras. Publicera
bara till loopback-adressen, sätt en brandvägg hos leverantören framför, eller kör containrar utan
publicerade portar som beskrivs ovan.

**IPv4 är låst medan IPv6 står vidöppet.** De två adressfamiljerna har separata regeluppsättningar i
iptables, och ufw skriver regler för IPv6 bara när IPv6 är påslaget i dess fil med
standardinställningar. En värddator med en publik IPv6-adress och en regeluppsättning för enbart
IPv4 är exponerad på varje port som den lyssnar på. Använd en tabell i nftables av familjen `inet`,
som ser båda, eller granska båda listningarna, och skanna värddatorns IPv6-adress utifrån.

**SSH-sessionen fryser i samma ögonblick som brandväggen slås på.** Nekandet som standard blev
aktivt före regeln för SSH, eller så flyttades SSH-daemonen till en annan port medan regeln
fortfarande anger 22. Lägg till regeln för SSH först, håll leverantörens konsol öppen i ett annat
fönster och schemalägg en automatisk återställning några minuter fram i tiden, som avbryts så snart
en ny session kommer in.

**En regel öppnar mer än författaren avsåg.** I ufw öppnar en regel som anger en port utan protokoll
den för både TCP och UDP. Ange protokollet i varje regel, och deklarera den förväntade ytan som en
helhet, så att allt extra fäller en kontroll i stället för att vänta på en revision.

## Läs mer

- [Firewall](https://csrc.nist.gov/glossary/term/firewall) — definitionerna som publikationer från
  NIST använder, var och en länkad till sitt källdokument.
- [SP 800-41 Rev. 1: Guidelines on Firewalls and Firewall Policy](https://csrc.nist.gov/pubs/sp/800/41/r1/final)
  — brandväggstyper, en policy som nekar som standard och hantering av regler, från NIST.
- [ufw(8)](https://manpages.ubuntu.com/manpages/noble/man8/ufw.8.html) — brandväggsgränssnittet i
  Ubuntu, bl.a. regelordningen och regeln `limit`.
- [nftables wiki](https://wiki.nftables.org/wiki-nftables/index.php/Main_Page) — dokumentationen
  från projektet netfilter för det ramverk som ersätter iptables.
- [Packet filtering and firewalls](https://docs.docker.com/engine/network/packet-filtering-firewalls/)
  — Dockers egen redogörelse för hur publicerade portar passerar förbi en värddators regler.

<https://engineer.company/sv/glossary/firewall/>
