Från VPS till egen server

14 Jul 2023

En gång i tiden så hade jag ett eget serverkluster i källaren, med fina maskiner från Super Micro, Dell och till och med Apple i form av Xserve. Det var utmanande, roligt, utmattande (i synnerhet när källaren svämmade över, vilket hände både en och tre gånger…), dyrt och också oerhört flexibelt i det att jag kunde köra i princip vad som helst hemma, på mitt egna nätverk.

Fig 5: Halvjobbigt läge

För två år sedan gick flytten till en lägenhet och med det försvann också möjligheterna att köra massor med servrar och lagring och annat roligt, inte bara på grund av platsbrist utan också på grund av de ständigt skenande elpriserna.

Så jag hyrde en VPS istället, hos ett franskt bolag som heter OVH som är ganska trevligt. För en dryg hundralapp i månaden (priset har sakta gått upp i takt med inflation och stigande elpriser) har jag kört denna sajt och en rad andra dito på denna lilla VPS med fyra gigabyte minne och 80 gigabyte lagring. Den har sannerligen fått göra skäl för pengarna och i takt med att den började få det lite jobbigt med prestanda (vilket sammanföll med att den fick mer att göra, helt enkelt) och jag samtidigt började känna att köra min Mastodon-instans hemma på en liten AMD-baserad server (den kördes i mitt Raspberry Pi-kluster i ungefär ett år vilket fungerade överraskande bra) inte längre var hållbart så började jag rikta blickarna mot min VPS hos OVH. För att den skulle orka med att köra även Mastodon på samma virtuella server skulle kostnaden gå från en dryg hundralapp i månaden till närmare 300 kronor.

Det visar sig att för lite mer än 300 kronor kan man få så mycket mer. Man kan hyra en hel server, med 64 gigabyte internminne, 512 gigabyte SSD-baserad lagring (i en speglad konfiguration) och en Intel Core i7-7700-processor fyra fysiska processorkärnor (att jämföra med två virtuella dito hos OVH), en publik IPv4-adress och en publik IPv6-adress för drygt 360 kronor per månad. Företaget som gör detta möjligt heter Hetzner och en titt på deras sida för serverauktioner visar hur de hyr ut inte helt nya, men ändå livskraftiga, maskiner i en rad datacenter. Det datacenter jag valde ligger i Helsingfors.

Så jag slog till. Sedan började den minst sagt långa processen att börja bygga upp vad jag i princip hade i min källare för över två år sedan. I princip allt fick göras från minnet då jag inte hade någonting kvar från den tiden, vilket var bitvis utmanande men också bra eftersom jag fick chansen att göra saker och ting “rätt” den här gången.

Installation

Jag hade från början bestämt mig för att köra en virtualiseringsplattform på den här servern och valet föll inte helt överraskande på Proxmox. Jag installerade därför Debian 11 och därefter Proxmox ovanpå detta vilket gick utmärkt.

Därefter kunde jag öppna port 8006 i Hetzners brandvägg och komma åt min Proxmox-server.

“Vänta lite nu!”, kanske du tänker. Ja, att exponera SSH eller Proxmox webbgränssnitt mot hela vida världen är verkligen ingen god ide. Det åtgärdades omgående och jag ska nu förklara hur.

Lösningen heter Cloudflare och deras lösning Zero Trust. För hobbyanvändare är merparten av funktionerna i denna lösning gratis att använda men den förutsätter också att du använder Cloudflare:s DNS-tjänster (också gratis) för dina domäner.

I praktiken fungerar det så här:

Man skapar först en tunnel hos Cloudflare och därefter installerar man en agentmjukvara från Cloudflare på sin server (i mitt fall den server jag hyrt från Hetzner och kör Proxmox på). Därefter är tunneln uppe och man kan då skapa en access till Proxmox och koppla på autentisering på denna så endast du kan komma åt den (tips: sätt mottagande server till https://localhost:8006 och slå på att ignorera TLS-fel så Cloudflare accepterar ditt icke-signerade certifikat). Det smarta här är att man också kan skapa publika tunnlar utan accessregler som kan användas för publika webbsajter, så all trafik går över en och samma tunnel.

Du kan även skapa ett säkert sätt att via din webbläsare logga in med SSH på din server. Glöm inte att slå på autentisering!

Varför då, undrar du? Eftersom Proxmox tar över nätverkskortet i maskinen så finns det i praktiken två sätt att lösa åtkomst från omvärlden till dina webbservrar: en tunnel från exempelvis Cloudflare, eller att du skapar en brygga i Proxmox och sedan routar trafik till och från den bryggan med IP-tables i Proxmox-maskinen och samtidigt öppnar upp för samma trafik både i Hetzners brandvägg och i IP-tables på Proxmox-maskinen. Båda alternativen fungerar, men jag valde att ta det första då det också löser en rad problem. Bland dessa finns DDOS-skydd och certifikathantering, där det tidigare blir oerhört svårt att lösa på egen hand men det senare går att lösa med IP-tables-alternativet och en reverse proxy som all trafik routas till och som skapar certifkat hos Let’s Encrypt.

Genom att köra tunneln hos Cloudflare så får jag också en reverse proxy hos dem där jag kan välja vilken server trafiken ska skickas till. I bilden ovan visas exemplet för min Mastodon-server och hur trafiken flödar till den. Notera att du måste skapa en reverse proxu för varje hostnamn du använder (en för @, en för www, och så vidare) och de hostnamn du matar in här får inte redan finnas i DNS:en för domänen hos Cloudflare utan radera dem först.

Valet av http eller https är alltså på mottagande server och inte hur det ska hanteras mot omvärlden - i detta fall har jag skapat ett egensignerat certifikat på Mastodon-servern, satt att Cloudflare ska ignorera TLS-problem och sedan är det bara att köra.

Konfigurera nätverket

Nästa problem att lösa var hur de virtuella maskinerna som körs i Proxmox kunde prata med omvärlden. Det löstes genom att skapa en brygga i Proxmox (vmbr0), starta om nätverket (ifup -a) och därefter lägga in detta i konfigurationsfilen för nätverket på Proxmox-servern (/etc/network/interfaces):

auto lo
iface lo inet loopback

iface lo inet6 loopback

auto enp0s31f6
iface enp0s31f6 inet static
	address 95.217.37.144/26
	gateway 95.217.37.129
	up route add -net 95.217.37.128 netmask 255.255.255.192 gw 95.217.37.129 dev enp0s31f6

iface enp0s31f6 inet6 static
	address 2a01:4f9:2b:2fce::2/64
	gateway fe80::1

auto vmbr0
iface vmbr0 inet static
	address 10.10.10.1/24
	bridge-ports none
	bridge-stp off
	bridge-fd 0
	post-up   echo 1 > /proc/sys/net/ipv4/ip_forward
        post-up   iptables -t nat -A POSTROUTING -s '10.10.10.0/24' -o enp0s31f6 -j MASQUERADE
        post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o enp0s31f6 -j MASQUERADE
	post-up   iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
	post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1

Starta om nätverket igen (ifup -a) och därefter kan du skapa din första virtuella server i Proxmox. I denna anger du samma IP-nät som vmbr0 tillhör (10.10.10.0/24), exempelvis 10.10.10.10/24, ange 10.10.10.1 som default gateway och ange sedan den samma DNS som din server hos Hetzner använder. Det går att använda valfri DNS om du tweakar brandväggen hos Hetzner och tillåter trafik ut genom den på port 53/UDP men jag har märkt att Hetzners egna (185.12.64.1) fungerar riktigt bra.

Därefter är det “bara” att sätta igång och sätta upp flera maskiner. Ett tips är också att utnyttja Hetzners erbjudande om en “storage box” med 100 gigabyte lagring. Jag monterade den via SAMBA/CIFS från NFS-servern jag satt upp och kör backuper till den på alla webbar en gång per dygn. Jag monterade också samma lagring från databasservern och dumpar databasbackuper dit en gång per dygn. Vill man ha mer än 100 gigabyte lagringsyta så går det givetvis att köpa till för inte helt obcena priser ska väl tilläggas.

Finns det saker du inte kan köra via Cloudflares proxy och tunnel? Ja, det gör det. Nextcloud är ett sådant exempel. Cloudflare är tydliga med att tunneln och proxyn är till för webbcontent, alltså text och bilder. Att använda den för synkningstjänster som Nextcloud, Owncloud eller annat är inte tillåtet och fungerar för övrigt inget vidare heller. Andra saker du däremot kan få, men som kostar extra, är att Cloudflare exponerar vilka IP-adresser trafiken kommer från till dina servrar via X-Forwarded-For i headern på varje request till webbservrarna. Utan det ser det ut som all trafik kommer från den IP-adress som Cloudflares agentmjukvara körs på. Jag kan leva med det men det kan vara bra att tänka på, i synnerhet om man gillar statistik och inte vill nyttja Google Analytics.

Lycka till!