GuiderBörja härSäkra en ny Debian-server

Säkra en ny Debian-server

De första stegen på en ny Debian 13-server, från inloggning med SSH-nyckel och avstängd inloggning med lösenord till automatiska säkerhetsuppdateringar och en brandvägg med ufw som bara öppnar portarna du använder.

Testad på Debian 13 (trixie) på en server hos Melonslab Steg 3 av 4 för nybörjare Uppdaterad 26 september 2026

Rekommenderad server för guiden

VC-S Micro · 2 vCPU · 8 GB Minne · 250 GB Lagring

Månadsvis, ingen bindningstid 7 dagars öppet köp

90 kr/mån

Beställ nu
På den här sidan

Det här sätter du upp

En ny server hittas inom några timmar. Vår testserver loggade sin första lösenordsgissning mindre än tre timmar efter att den kom online, och 1 636 under sitt första dygn, från 11 adresser. De flesta försökte logga in som root.

Stegen tar omkring 15 minuter, och alla andra guider här bygger på en server som är uppsatt så här:

  1. du loggar in med en nyckel i stället för ett lösenord,
  2. servern slutar ta emot lösenord över SSH, så att ingen kommer in genom att gissa ett,
  3. säkerhetsuppdateringar installeras automatiskt varje dag, och
  4. en brandvägg, ufw, håller alla portar som du inte har öppnat stängda.

Varje steg nedan har körts på en nyinstallerad server hos Melonslab med Debian 13, och kontrollerats igen efter en omstart.

Innan du börjar

Du behöver en server med Debian 13 och dess root-lösenord. Har du inte loggat in på den än visar anslutningsguiden hur. Exemplen använder 203.0.113.10 som din servers IPv4-adress. Byt ut den mot din egen genomgående.

Om något går fel kommer du alltid in via konsolen: öppna din server i kundportalen och välj Open console på fliken Server. Den visar serverns skärm som om du stod vid den, och fungerar utan SSH och nätverk.

1. Logga in med en nyckel

Skapa en nyckel på din egen dator, i en terminal (på Windows i PowerShell):

ssh-keygen -t ed25519

Tryck på Enter för att behålla den föreslagna filen, och välj en lösenfras: den skyddar nyckeln om någon kopierar den från din dator. Det skapar två filer: id_ed25519 är den privata nyckeln, som aldrig lämnar din dator, och id_ed25519.pub är den publika nyckeln, som hamnar på servern.

Kopiera den publika nyckeln till servern. Det är sista gången du skriver serverns root-lösenord:

ssh-copy-id root@203.0.113.10

Windows har inget ssh-copy-id. Kör det här i PowerShell i stället:

type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh root@203.0.113.10 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Logga nu in:

ssh root@203.0.113.10

Frågar den efter nyckelns lösenfras och inte efter serverns lösenord, så fungerar nyckeln.

2. Stäng av inloggning med lösenord

Håll den här sessionen öppen till slutet av steget. Om en ändring går fel kan du fortfarande ångra den här.

Skapa /etc/ssh/sshd_config.d/10-keys-only.conf:

# Log in with keys only. Named 10- so it is read before 50-cloud-init.conf,
# whose PasswordAuthentication yes would otherwise win.
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password

Katalogen har redan en fil, 50-cloud-init.conf, som slår på inloggning med lösenord. SSH läser filerna i namnordning och använder det första värdet den hittar för varje inställning, så en fil vars namn börjar med 10 läses först och får företräde. PermitRootLogin prohibit-password släpper fortfarande in root med en nyckel.

Kontrollera konfigurationen och tillämpa den:

sshd -t && systemctl reload ssh

sshd -t skriver bara ut något om det finns ett fel, och SSH laddas bara om när det inte finns några fel. Så här ser du vilka inställningar SSH nu använder:

sshd -T | grep -E '^(passwordauthentication|kbdinteractiveauthentication|permitrootlogin) '
permitrootlogin without-password
passwordauthentication no
kbdinteractiveauthentication no

without-password är ett äldre namn för prohibit-password. Öppna nu en andra terminal och logga in igen med ssh root@203.0.113.10. När det fungerar kan du stänga den första sessionen.

För att kontrollera att lösenord nekas ber du SSH att inte använda din nyckel:

ssh -o PubkeyAuthentication=no root@203.0.113.10

SSH svarar Permission denied (publickey). utan att fråga efter något lösenord.

Du behöver inte Fail2ban för SSH nu. Gissningar kan inte längre lyckas, de fyller bara loggen.

3. Installera säkerhetsuppdateringar automatiskt

apt update
apt install -y unattended-upgrades curl

Kommandot installerar också curl, som många av våra guider använder för att hämta filer och testa webbservrar: det finns inte på en nyinstallerad server. Att installera unattended-upgrades slår inte på det. Skapa /etc/apt/apt.conf.d/20auto-upgrades:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

Servern hämtar nu paketlistorna och installerar uppdateringar från Debian och Debians säkerhetsteam en gång om dagen, på morgonen. Så här ser du vad den skulle göra, utan att installera något:

unattended-upgrade --dry-run --debug 2>&1 | grep -E 'Allowed origins|No packages'

Den första raden har label=Debian-Security bland källorna den installerar från. systemctl list-timers apt-daily-upgrade.timer visar när den körs nästa gång.

En ny kärna används först efter en omstart. Vill du att servern ska starta om av sig själv klockan 04:00 när en uppdatering kräver det, skapar du /etc/apt/apt.conf.d/52unattended-upgrades-local:

Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";

Appar som är uppsatta som i våra andra guider startar igen av sig själva efter en omstart. Vill du hellre starta om själv, hoppa över den här filen: filen /run/reboot-required dyker upp när en uppdatering väntar på en omstart.

4. Öppna bara portarna du använder

Debian har ingen brandvägg från början, så varje program som lyssnar på en port kan nås från internet. ufw, förkortning för "uncomplicated firewall", blockerar allt som kommer in utom det du tillåter, för både IPv4 och IPv6.

Installera den, och tillåt SSH innan du slår på den, annars låser du ute dig själv:

apt install -y ufw
ufw allow 22/tcp

Om servern ska köra webbplatser, tillåt också HTTP och HTTPS. HTTPS använder UDP utöver TCP för HTTP/3:

ufw allow 80,443/tcp
ufw allow 443/udp

Slå sedan på den. Den varnar för att SSH-anslutningar kan avbrytas: svara y. Regeln för port 22 håller din öppen.

ufw enable
ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
80,443/tcp                 ALLOW IN    Anywhere
443/udp                    ALLOW IN    Anywhere
22/tcp (v6)                ALLOW IN    Anywhere (v6)
80,443/tcp (v6)            ALLOW IN    Anywhere (v6)
443/udp (v6)               ALLOW IN    Anywhere (v6)

ufw startar igen efter en omstart med samma regler. För att ta bort en regel skriver du samma regel efter ufw delete, till exempel ufw delete allow 443/udp.

Regler för våra andra guider

GuideKör
WireGuard-VPNufw allow 51820/udp och ufw route allow in on wg0 out on eth0
DNS med Unbound, för VPN-enheterufw allow in on wg0
Matrix-samtalufw allow 7881/tcp och ufw allow 7882/udp, och för coturn ufw allow 3478 och ufw allow 49152:65535/udp
Stalwart-mailserverufw allow 25,465,993,995/tcp
Git-server med Forgejoufw allow 2222/tcp
Headscaleufw allow 3478/udp
Zabbixufw allow from 198.51.100.30 to any port 10051 proto tcp, en gång för varje server du övervakar
FreeRADIUSufw allow from 198.51.100.20 to any port 1812:1813 proto udp, med kontorets adress
Postfix-mailserverufw allow 25,80,587,993/tcp, med 80 för förnyelse av certifikatet
Minecraft-serverufw allow 25565/tcp
Asteriskufw allow 5061/tcp och ufw allow 10000:20000/udp
Pelican och Pterodactylufw allow 8080,2022/tcp, för Wings
Jitsi Meetufw allow 10000/udp, ufw allow 3478/udp och ufw allow 5349/tcp
AdGuard Homeufw allow 853/tcp och ufw allow in on wg0

WireGuard behöver två regler: en låter enheterna ansluta, och route-regeln låter deras trafik passera via servern ut på internet, vilket ufw blockerar som standard.

Rootless Podman-containrar, som i Podman-guiden, följer samma regler som alla andra program: en port de publicerar mot internet förblir stängd tills du tillåter den. Portar som bara publiceras på 127.0.0.1, som i våra appguider bakom Caddy, kan aldrig nås utifrån.

5. Kontrollera vad som lyssnar

ss -tulpn

Det listar varje program som lyssnar på en port. En lokal adress som 0.0.0.0, [::] eller * betyder alla adresser, som ufw håller stängda om du inte har tillåtit porten. 127.0.0.1 och [::1] kan bara nås från själva servern. Hittar du något du inte använder, ta bort det hellre än att lämna det åt brandväggen.

Felsökning

Du är utelåst. Välj Open console i kundportalen och logga in som root med lösenordet. Därifrån stänger ufw disable av brandväggen, och om du tar bort /etc/ssh/sshd_config.d/10-keys-only.conf och kör systemctl reload ssh slås inloggning med lösenord på igen. Har du också tappat bort root-lösenordet kan du sätta ett nytt under Root password på samma flik.

Permission denied (publickey) från din egen dator. Servern godtog inte din nyckel. Kontrollera att du loggar in som root från datorn där du skapade nyckeln i steg 1. Använder du en annan dator, lägg till dess publika nyckel i /root/.ssh/authorized_keys från en session som fungerar, eller från konsolen.

Enheter på VPN:en tappar internet efter ufw enable. route-regeln för WireGuard saknas. Tappar de DNS men inte internet är det regeln för Unbound som saknas. Båda finns i tabellen ovan.

En webbplats eller app slutar svara. Dess port är inte tillåten. ss -tulpn visar vilken port den lyssnar på.

Kör det på din egen server

VC-S Micro

90 kr/mån

vCPU
2
Minne
8 GB
Lagring
250 GB
Trafik
10 TB
Standard
HDD · RAID 10
  • Full root-åtkomst
  • Nativt /64 IPv6
  • RAID-skyddad lagring
  • Malmö, Sverige
  • Månadsvis, ingen bindningstid
  • 7 dagars öppet köp
Alla guider