ssb-datatek.dk: selvhostet webserver

Den side du læser nu. En hardened Ubuntu-server derhjemme med NGINX, Let's Encrypt og UFW, bygget for at vise hvad jeg kan i stedet for bare at skrive det.

Status
Løbende
Periode
2026 - nu
Kontekst
Privat projekt
  • Ubuntu Server 24.04
  • NGINX
  • Let's Encrypt
  • UFW
  • Netplan
  • Hugo
Indhold

Formål

I stedet for at sende et klassisk CV ville jeg vise, at jeg kan sætte en rigtig server op fra bunden, sikre den og holde den kørende. Hele siden kører på en Lenovo-PC (Intel i5, 7. gen.) derhjemme.

Opsætning

OmrådeLøsning
OSUbuntu Server 24.04 LTS (headless)
WebserverNGINX med server blocks til to domæner
AdgangSSH med ED25519-nøgler
HardeningPassword-login og root-login slået fra
NetværkStatisk IP via Netplan og port forwarding
FirewallUFW: kun 80 og 443 åbne udefra, SSH kun fra LAN
KrypteringTLS via Let’s Encrypt (Certbot) med automatisk fornyelse
DNSA-records hos Simply.com

SSH-hardening

Serveren accepterer kun nøgle-login:

# /etc/ssh/sshd_config
PasswordAuthentication no
PermitRootLogin no

Firewall

sudo ufw default deny incoming
sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

Udfordringer og løsninger

CGNAT hos internetudbyderen

Siden kunne ikke nås udefra, selvom port forwarding var sat korrekt op. Fejlfindingen viste, at routeren ikke havde en rigtig offentlig IP, men sad bag Carrier-Grade NAT (CGNAT). Løsningen var at få en offentlig IP-adresse fra Waoo.

Offentlig IP skiftede

Efter en periode var siden pludselig nede igen. DNS pegede stadig på den gamle IP, men serveren havde fået en ny:

curl -4 ifconfig.me

Jeg opdaterede A-records hos Simply.com, og siden var oppe igen. Næste skridt er DDNS, så serveren selv opdaterer DNS, når IP’en skifter.

Fra én HTML-side til portfolio

Den første version var én håndskrevet HTML-side. Nu er siden bygget med Hugo, så hvert projekt er en mappe med en Markdown-fil og tilhørende dokumenter og billeder. Hugo bygger det til statiske filer, som NGINX serverer. Der er ingen database og intet admin-login, der kan angribes.

Hvad jeg lærte

  • At fejlfinde netværk hele vejen fra server til router til internetudbyder.
  • At sikre en server, der står direkte på internettet.
  • At dokumentere undervejs, så jeg kan genskabe opsætningen.