Sätt upp en brandvägg i Ubuntu 22.04 med UFW

Introduktion

Att ha en fungerande brandvägg på servern är ett viktigt steg i säkerhetsarbetet. I den här guiden kommer vi att skapa en grundläggande brandvägg som du sedan kan bygga vidare på med egna regler. Guiden utgår från en nyinstallerad Cloud VPS med Ubuntu 22.04. Om du vill sätta upp en brandvägg i Debian 11 har vi en guide för det här: Sätt upp en brandvägg i Debian 11 med nftables

UFW står för Uncomplicated Firewall och är ett verktyg för att förenkla administreringen av den inbyggda brandväggen i Linux. Den medföljer Ubuntu som standard, men är avstängd.

Sätt upp grundläggande regler


Vi börjar med att verifiera att brandväggen är avstängd. Det gör vi med kommandot:

sudo ufw status

UFW bör nu svara med Status: inactive.

Nu kan vi börja lägga in de regler vi behöver. För att inte riskera att låsa oss själva ute börjar vi med att tillåta SSH:

sudo ufw allow ssh

Vi bör nu få följande som svar:

Rules updated
Rules updated (v6)

Nu kan vi lägga till övriga portar som vi vill öppna, exempelvis HTTP och HTTPS. Det gör vi med:

sudo ufw allow http
sudo ufw allow https

Istället för att ange en tjänst, som exempelvis http eller https, går det även att ange ett portnummer. Syntax är då istället ufw allow 80/tcp för att tillåta HTTP.

Vi vill också tillåta traceroute. Vi tillåter därför UDP-portarna 33434 till 33524. Detta gör vi med kommandot:

sudo ufw allow 33434:33524/udp

Nu är det dags att sätta upp en standardpolicy för utgående och inkommande trafik. Som standard ska brandväggen vara konfigurerad att tillåta utgående trafik, men att neka inkommande. För att verkligen säkerställa att så är fallet kommer vi ändå att sätta dessa regler med följande kommando:

sudo ufw default allow outgoing
sudo ufw default deny incoming

Nu när vi har de viktigaste reglerna på plats kan vi aktivera brandväggen. Det gör vi med kommandot:

sudo ufw enable

Vi får nu en varning om att brandväggen kan avbryta pågående SSH-anslutning. Men eftersom vi redan tillåtit SSH svarar vi y på frågan. Vi får därefter en bekräftelse på att den har aktiverats:

Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Nu har vi en fullt fungerande brandvägg som blockerar all inkommande trafik förutom SSH, HTTP, HTTPS och traceroute. ICMP (ping) tillåts redan innan UFW laddar in sina regler. Vi kontrollerar statusen på brandväggen igen:

sudo ufw status

Denna gången visas även de portar som tillåts:

Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
33434:33524/udp            ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)
33434:33524/udp (v6)       ALLOW       Anywhere (v6)

Lägg märke till att UFW har lagt till regler för både IPv4 och IPv6 som standard.

Redigera reglerna


Att lägga till nya regler är inte svårare än att köra ufw allow-kommandot igen med den tjänst eller port man vill tillåta. För att exempelvis tillåta TCP-port 8080 kör vi:

sudo ufw allow 8080/tcp

Listar vi statusen igen med sudo ufw status syns den nya porten:

Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
8080/tcp                   ALLOW       Anywhere
33434:33524/udp            ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)
8080/tcp (v6)              ALLOW       Anywhere (v6)
33434:33524/udp (v6)       ALLOW       Anywhere (v6)

Om vi nu vill radera TCP-port 8080 från brandväggen använder vi samma syntax som när vi lade till den, men vi lägger till delete framför:

sudo ufw delete allow 8080/tcp

En ny listning med sudo ufw status visar att porten har tagits bort från både IPv4 och IPv6:

Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
33434:33524/udp            ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)
33434:33524/udp (v6)       ALLOW       Anywhere (v6)

För att kunna redigera listan med större noggrannhet kan vi använda oss av en numrerad lista. Vi kan då radera en specifik regel, eller skjuta in nya regler på en specifik plats i listan. Vi börjar med att lägga till TCP-port 8080 igen, så att vi har något att labba med:

sudo ufw allow 8080/tcp

Nu listar vi statusen igen, men den här gången med en numrerad lista. Kör följande kommando:

sudo ufw status numbered

Det ger oss följande lista:

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 443                        ALLOW IN    Anywhere
[ 4] 33434:33524/udp            ALLOW IN    Anywhere
[ 5] 8080/tcp                   ALLOW IN    Anywhere
[ 6] 22/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 7] 80/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 8] 443 (v6)                   ALLOW IN    Anywhere (v6)
[ 9] 33434:33524/udp (v6)       ALLOW IN    Anywhere (v6)
[10] 8080/tcp (v6)              ALLOW IN    Anywhere (v6)

Nu kan vi exempelvis radera TCP-port 8080 för IPv4, men inte för IPv6. Vi väljer då att endast radera regel nummer fem:

sudo ufw delete 5

Här får vi också en fråga ifall det är rätt regel som vi vill radera. Det är det, så vi svarar y på frågan:

Deleting:
 allow 8080/tcp
Proceed with operation (y|n)? y
Rule deleted

På samma sätt kan vi skjuta in nya regler i listan. Låt oss anta att vi vill skjuta in TCP-port 8080 igen, men denna gången på tredje platsen i listan. Det kan vi göra med kommandot:

sudo ufw insert 3 allow 8080/tcp

En ny listning med sudo ufw status numbered visar att det lyckades:

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 8080/tcp                   ALLOW IN    Anywhere
[ 4] 443                        ALLOW IN    Anywhere
[ 5] 33434:33524/udp            ALLOW IN    Anywhere
[ 6] 22/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 7] 80/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 8] 443 (v6)                   ALLOW IN    Anywhere (v6)
[ 9] 33434:33524/udp (v6)       ALLOW IN    Anywhere (v6)
[10] 8080/tcp (v6)              ALLOW IN    Anywhere (v6)

Nu kan vi radera de båda reglerna för TCP-port 8080 då vi bara använde dem för att laborera:

sudo ufw delete allow 8080/tcp

Blockera utgående trafik


Får att få en ännu säkrare server kan vi välja att blockera all utgående trafik som standard, och istället endast tillåta de portar som behövs.

Vi behöver först tillåta trafiken på de nödvändiga portarna innan vi ändrar policyn till att blockera all utgående trafik. Det vi behöver tillåta är HTTP och HTTPS, DNS-uppslag, NTP-förfrågningar (för tidssynkronisering), samt traceroute. Vi behöver även tillåta DHCPv6 så att servern kan få en IPv6-adress. Det gör vi med kommandona:

sudo ufw allow out http
sudo ufw allow out https
sudo ufw allow out domain
sudo ufw allow out ntp
sudo ufw allow out 33434:33524/udp
sudo ufw allow out proto udp to ::/0 port 546:547

Det sista kommandot ovan tillåter utgående IPv6-anslutningar till UDP-port 546 och 547 som är till för DHCPv6. För att begränsa regeln till endast IPv6 var vi tvungna att ange "hela" kommandot med proto udp to ::/0 port 546:547. Den speciella adressen ::/0 betyder alla IPv6-adresser. För DHCP över IPv4 finns redan en fungerande regel i Ubuntu som laddas in innan UFW-reglerna laddas.

Innan vi går vidare med att ändra policyn bekräftar vi att ändringarna ser rätt ut genom att göra en ny listning med sudo ufw status:

Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
33434:33524/udp            ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)
33434:33524/udp (v6)       ALLOW       Anywhere (v6)

80/tcp                     ALLOW OUT   Anywhere
443                        ALLOW OUT   Anywhere
53                         ALLOW OUT   Anywhere
123/udp                    ALLOW OUT   Anywhere
33434:33524/udp            ALLOW OUT   Anywhere
80/tcp (v6)                ALLOW OUT   Anywhere (v6)
443 (v6)                   ALLOW OUT   Anywhere (v6)
53 (v6)                    ALLOW OUT   Anywhere (v6)
123/udp (v6)               ALLOW OUT   Anywhere (v6)
33434:33524/udp (v6)       ALLOW OUT   Anywhere (v6)
546:547/udp (v6)           ALLOW OUT   Anywhere (v6)

Allt ser bra ut. De portar vi tillåter utgående trafik på är markerade med ALLOW OUT i listan ovan. Nu ändrar vi policyn i brandväggen till att neka all utgående trafik som inte explicit har tillåtits i reglerna. Kör kommandot:

sudo ufw default deny outgoing

Brandväggen kommer svara med:

Default outgoing policy changed to 'deny'
(be sure to update your rules accordingly)

Vi har nu en bra grundläggande brandvägg som bara släpper igenom den trafik vi själva tillåter. Tänk dock på att du kan behöva anpassa reglerna efter de tjänster och program som just du kör på din server.

Om du råkar låsa dig ute


Var försiktig när du laddar in nya brandväggsregler så att du inte låser dig ute från SSH-tjänsten (TCP-port 22). Skulle du trots allt råka låsa dig ute kan du logga in via konsolen i GleSYS Cloud. Du hittar den under InfrastrukturServrar. Klick på Funktioner bredvid namnet på din server och välj Konsol. När du loggat in kan du antingen stänga av brandväggen helt med sudo ufw disable, eller åtgärda regeln som låser dig ute.

Har du inte satt något lösenord för din användare kan du dock inte logga in som vanligt. Du kan däremot starta om servern till ett underhållsläge för att få åtkomst till den. När servern startas visas under en kort stund en GRUB-skärm. Första valet i listan är Ubuntu. Tryck på e när Ubuntu är markerat.

Ubuntus GRUB-skärm

Rulla sedan ner i filen med piltangenterna. I slutet av raden som börjar med linux /boot/vmlinuz lägger du till init=/bin/bash (efter ordet ro). När du har gjort det startar du servern genom att trycka på Ctrl+x.

Starta datorn i underhållsläge

När servern är startad måste du först montera filsystemet i skrivläge. Det gör du med kommandot mount -o remount,rw /. Därefter kan du stänga av brandväggen med ufw disable.

När du är klar startar du om servern genom att klicka på knappen Ctrl-Atl-Del uppe i vänster hörn i konsolfönstret. Nu kommer servern att starta som vanligt.

Hittar du inte det du söker?

Kontakta oss gärna för mer information. Vi hjälper dig att komma fram till den bästa lösningen för dina behov.

Skicka e-post Ring 0200-23 88 00