Skip to content

Allt om WordPress, webbutveckling — och mer därtill

🚀 Så här sätter du upp dynamisk DNS via Cloudflare på Raspberry Pi

🚀 Så här sätter du upp dynamisk DNS via Cloudflare på Raspberry Pi

Din hemserver på Raspberry Pi körs 24/7, men din internetleverantör byter den externa IP-adressen varje dag. Att manuellt leta reda på den nya adressen är ett jobb för en arkeolog. Och DynDNS och No-IP bombarderar dig med mejl: "logga in en gång i månaden annars stänger vi av ditt gratiskonto."

Det visar sig att Cloudflare kan fungera som dynamisk DNS, utan reklammejl, utan gränser för uppdateringsfrekvens och utan tredjeparts-subdomäner. Har du redan en domän på Cloudflare? Då är allt du behöver en API-token och ett bash-skript på Raspberry Pi. På en halvtimme sätter du upp ett system som automatiskt uppdaterar A-posten när IP-adressen ändras.

Och om du inte bara vill "komma åt konsolen", utan driftsätta en fullfjädrad utvecklingssajt, till och med på WordPress, blir den här installationen grunden: du får åtkomst till din server från hela världen via en smidig subdomän som home.example.com.

💡 Snabb översikt:

  • Steg 1: Skapa en A-post i Cloudflares DNS-panel med test-IP 0.0.0.0
  • Steg 2: Skaffa en API-token (inte en global nyckel, tokens är säkrare och kan återkallas med ett klick)
  • Steg 3: Kör ett bash-skript som hämtar aktuell IP och skickar den till Cloudflares API
  • Steg 4: Sätt upp ett cron-jobb och glöm manuella uppdateringar för alltid

Vad du behöver

  • En domän som är tillagd i Cloudflare och hanteras via deras DNS
  • Raspberry Pi (vilken modell som helst fungerar, Pi 3, Pi 4, Pi Zero 2 W) med Raspbian eller Raspberry Pi OS
  • Statisk lokal IP-adress för Raspberry Pi (konfigureras i OS-gränssnittet eller via routern)
  • Terminalåtkomst till Pi via SSH eller direkt

Exakt vilka tjänster du kör på Raspberry Pi och hur du vidarebefordrar portar i routern är ett separat ämne utanför den här guiden. Upplägget fungerar likadant oavsett om det gäller en webbserver med WordPress, VNC-åtkomst eller en övervakningskamera.

1. Skapa en A-post för din hemserver

Välj en subdomän, den blir din permanenta ingångspunkt. Jag använder home, men du kan välja vilken som helst: dev, lab, cam.

  • Gå till Cloudflares dashboard och välj din domän
  • Navigera till fliken DNS
  • Klicka på Add record, välj typ A
  • I fältet Name anger du subdomänen (till exempel home)
  • I fältet IPv4 address anger du 0.0.0.0, tillfälligt, för att testa skriptet senare
  • Låt Proxy status vara avstängd (grått moln), caching och proxy behövs inte för DDNS
A-post med test-IP 0.0.0.0 i Cloudflare DNS

Posten är klar. Nu skaffar vi API-nyckeln.

2. Skaffa Cloudflare API-token

Tidigare rekommenderade alla guider den globala API-nyckeln, som ger full åtkomst till alla kontots domäner. Det är farligt: om nyckeln läcker ut läcker allt ut. Nu rekommenderar Cloudflare API-tokens med detaljerade behörigheter. En token kan begränsas till en specifik domän och åtgärd, och vid kompromettering återkallas den med ett klick.

  • I Cloudflares dashboard, gå till: My ProfileAPI Tokens
  • Klicka på Create Token
  • Välj mallen Edit zone DNS (eller skapa en anpassad)
  • I avsnittet Zone Resources anger du den specifika domän du konfigurerar DDNS för
  • Klicka på Continue to summaryCreate Token
  • Kopiera token, den visas bara en gång

Token ser ut som en lång sträng som börjar med cfut_. Förvara den på ett säkert ställe, skriptet på Raspberry Pi behöver den strax.

3. Skript för automatisk uppdatering på Raspberry Pi

Anslut till Raspberry Pi via SSH eller öppna terminal. Låt oss skapa en mapp för skriptet:

1mkdir -p ~/cf && cd ~/cf

Nu till själva skriptet. Skapa filen cloudflare-ddns.sh:

1nano ~/cf/cloudflare-ddns.sh

Kopiera in följande kod i den:

1#!/bin/bash
2
3 ## Settings (replace with yours)
4AUTH_EMAIL="[email protected]"
5API_TOKEN="cfut_your_token"
6ZONE_NAME="example.com"
7RECORD_NAME="home.example.com"
8
9 ## Get current public IP
10CURRENT_IP=$(curl -s https://api.ipify.org)
11
12 ## Get Zone ID
13ZONE_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$ZONE_NAME" \
14 -H "Authorization: Bearer $API_TOKEN" \
15 -H "Content-Type: application/json" | grep -o '"id":"[^"]*"' | head -1 | cut -d'"' -f4)
16
17 ## Get Record ID and current record IP
18RECORD=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?name=$RECORD_NAME" \
19 -H "Authorization: Bearer $API_TOKEN" \
20 -H "Content-Type: application/json")
21
22RECORD_ID=$(echo "$RECORD" | grep -o '"id":"[^"]*"' | head -1 | cut -d'"' -f4)
23DNS_IP=$(echo "$RECORD" | grep -o '"content":"[^"]*"' | head -1 | cut -d'"' -f4)
24
25 ## Update record if IP changed
26if [ "$CURRENT_IP" != "$DNS_IP" ]; then
27 UPDATE=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
28 -H "Authorization: Bearer $API_TOKEN" \
29 -H "Content-Type: application/json" \
30 --data "{\"type\":\"A\",\"name\":\"$RECORD_NAME\",\"content\":\"$CURRENT_IP\",\"ttl\":120}")
31
32 echo "$(date): IP changed from $DNS_IP to $CURRENT_IP — updated" >> ~/cf/cloudflare-ddns.log
33else
34 echo "$(date): IP unchanged ($CURRENT_IP)" >> ~/cf/cloudflare-ddns.log
35fi

Ersätt de fyra variablerna i "Settings"-blocket med dina riktiga värden. E-post, samma som för Cloudflare-inloggning. Token, den du kopierade i steg 2. Zone name, din domän utan http://. Record name, hela subdomänen.

Spara filen (Ctrl+O, Enter, Ctrl+X i nano) och gör den körbar:

1chmod +x ~/cf/cloudflare-ddns.sh

Kör manuellt för att kontrollera:

1~/cf/cloudflare-ddns.sh

Om allt är korrekt konfigurerat, gå till Cloudflares DNS-panel, så ska A-postens IP-adress ändras från 0.0.0.0 till din verkliga publika IP. Loggen skrivs till ~/cf/cloudflare-ddns.log, kontrollera där om något gick fel.

4. Automatisering via cron

Manuell körning är bara för test. Härifrån tar cron över.

1crontab -e

Om systemet frågar vilken editor du vill använda, välj nano (oftast nummer 2, den är enklast). Lägg till en rad i slutet av filen:

10 */6 * * * /bin/bash /home/pi/cf/cloudflare-ddns.sh

Denna post kör skriptet var 6:e timme. Även om internetleverantören byter IP en gång i halvåret är ett sextimmarsfönster en rimlig kompromiss mellan aktualitet och API-belastning.

Om du vill ha högre frekvens, ersätt med */30 * * * * (var 30:e minut). Men kom ihåg: Cloudflares API-gräns för gratiskonton är 1200 anrop per minut, så även anrop varje minut är ofarligt för en enda domän.

Spara (Ctrl+X, J, Enter). Cron plockar upp ändringarna automatiskt, ingen omstart av tjänsten behövs. Hjälp med att tolka asteriskerna finns på crontab.guru.

Kort videoguide i samma ämne, från NetworkChuck, med demonstration på riktig Raspberry Pi och förklaring av varje steg:

Vad du gör om skriptet inte hittade Zone ID eller Record ID

Ibland returnerar API:et inte identifierarna automatiskt, särskilt om kontot har många domäner eller poster med liknande namn. Hämta dem då manuellt:

  • Gå till Cloudflares dashboard, välj domänen, fliken DNS
  • Öppna webbläsarens utvecklarverktyg (F12 → fliken Nätverk → underfliken XHR)
  • Klicka på molnikonen bredvid din A-post, ett anrop till API:et dyker upp i nätverkspanelen
  • Högerklicka på det → KopieraKopiera länkadress (Chrome) eller Kopiera URL (Firefox)
  • I den kopierade länken hittar du delen efter zones/, det är Zone ID, och efter dns_records/, Record ID

Lägg in dem i variablerna ZONE_ID och RECORD_ID i skriptet, så fungerar allt. Se till att molnet i DNS-panelen är grått (proxy av): Cloudflare ska inte cacha IP för DDNS.

⁉️🤔 Vanliga frågor

Måste man använda API-token istället för global nyckel?

Den globala nyckeln fungerar fortfarande, men token är det moderna och säkra alternativet. En token kan begränsas till en domän och rättigheter för DNS-redigering. Den globala nyckeln ger tillgång till hela kontot. Om skriptet eller Pi:n komprometteras återkallar du bara token, medan du hade behövt byta nyckel överallt.

Hur skiljer sig detta från DuckDNS eller No-IP?

Tredjeparts DDNS-tjänster ger en tredjenivås subdomän som myhome.duckdns.org. Cloudflare-metoden använder din egen domän (home.example.com), det ser mer professionellt ut, är inte beroende av någon annans tjänst och kräver ingen månatlig inloggning för aktivitetsbekräftelse. Dessutom får du tillgång till hela Cloudflares ekosystem: DDoS-skydd, SSL-certifikat, brandväggsregler.

Behöver jag öppna portar i routern?

Ja, för att nå Raspberry Pi från internet. DDNS säkerställer bara att domänen alltid pekar på den aktuella IP-adressen. Men för att trafik från den IP-adressen ska nå Pi:n måste du konfigurera portvidarebefordran i routern för de nödvändiga portarna (22 för SSH, 80/443 för webb, och så vidare).

Vad gör jag om Raspberry Pi ligger bakom ISP-NAT?

Vissa internetleverantörer använder Carrier-Grade NAT (CGNAT), då har du ingen egen publik IP och DDNS hjälper inte. Lösning: be om en publik IP från leverantören (ofta gratis på begäran) eller använd Cloudflare Tunnel, som skapar en krypterad kanal från Pi:n till Cloudflare utan portvidarebefordran.

Vad kostar den här lösningen?

Noll. Cloudflare DNS är gratis för obegränsat antal A-poster. Raspberry Pi har du redan köpt. Strömförbrukningen för Pi 3/4 under belastning är cirka 3-5 W, årligen blir det ungefär 250-400 kr.

Kan jag uppdatera flera subdomäner?

Ja, duplicera blocken med RECORD_NAME och DNS_IP i skriptet för varje subdomän eller slå in logiken i en loop över en array med namn.

Dynamisk DNS på Cloudflare: vad du ska konfigurera 2026

Upplägget med Cloudflare API och cron har överlevt flera generationer av Raspberry Pi och har inte förlorat sin relevans. Du får en egen subdomän, är inte beroende av tredjeparts DDNS-leverantörer och betalar inte en krona.

Om du vill gå längre, titta på färdiga Docker-images: oznu/cloudflare-ddns uppdaterar IP var 5:e minut och konfigureras via miljövariabler. För den som föredrar Python finns aribasadme/rpi-cloudflare-ddns, särskilt anpassad för Raspberry Pi.

Det viktigaste du gjorde idag: Raspberry Pi är nu tillgänglig från hela världen på en permanent adress. Och det här är grunden för allt: från en WordPress-utvecklingsserver till din egen molnlagring.

🔗 Cloudflare DNS API-dokumentation