Skip to content

Wszystko o WordPressie, tworzeniu stron — i nie tylko

🚀 Jak skonfigurować dynamiczny DNS przez Cloudflare na Raspberry Pi

🚀 Jak skonfigurować dynamiczny DNS przez Cloudflare na Raspberry Pi

Twój domowy serwer na Raspberry Pi działa całodobowo, ale dostawca codziennie zmienia zewnętrzny adres IP. Ręczne sprawdzanie nowego adresu to zajęcie dla archeologa. A DynDNS i No-IP zamęczają mailami: „zaloguj się raz w miesiącu, bo wyłączymy darmowe konto".

Okazuje się, że Cloudflare potrafi działać jako dynamiczny DNS, bez reklamowych mailingów, bez ograniczeń częstotliwości aktualizacji i bez zewnętrznych subdomen. Ma Pan już domenę na Cloudflare? W takim razie potrzebuje Pan tylko tokena API i skryptu bash na Raspberry Pi. W pół godziny uruchomi Pan schemat, który sam aktualizuje rekord A przy każdej zmianie IP.

A jeśli chce Pan nie tylko „dostać się do konsoli", ale wdrożyć pełnoprawną stronę deweloperską, na przykład na WordPress, ten zestaw staje się fundamentem: zyskuje Pan dostęp do swojego serwera z dowolnego miejsca na świecie pod ładną subdomeną, taką jak home.example.com.

💡 Szybki przegląd:

  • Krok 1: Tworzymy rekord A w panelu DNS Cloudflare z testowym IP 0.0.0.0
  • Krok 2: Pobieramy token API (nie klucz globalny, token jest bezpieczniejszy i można go odwołać jednym kliknięciem)
  • Krok 3: Uruchamiamy skrypt bash, który odpytuje bieżące IP i wysyła je do API Cloudflare
  • Krok 4: Ustawiamy zadanie cron i zapominamy o ręcznej aktualizacji na zawsze

Co będzie potrzebne

  • Domena dodana do Cloudflare i zarządzana przez ich DNS
  • Raspberry Pi (odpowiedni będzie każdy model, Pi 3, Pi 4, Pi Zero 2 W) z Raspbianem lub Raspberry Pi OS
  • Statyczne lokalne IP dla Raspberry Pi (konfiguruje się w GUI systemu lub przez router)
  • Dostęp do terminala Pi przez SSH lub bezpośrednio

To, jakie konkretnie usługi hostuje Pan na Raspberry Pi i jak przekierowuje porty na routerze, to osobny temat, wykraczający poza ten poradnik. Schemat działa tak samo zarówno dla serwera WWW z WordPress, jak i dla dostępu VNC czy kamery monitoringu.

1. Tworzymy rekord A dla domowego serwera

Proszę wymyślić subdomenę, stanie się ona stałym punktem wejścia. Ja używam home, ale może Pan wybrać dowolną: dev, lab, cam.

  • Proszę wejść do panelu Cloudflare i wybrać domenę
  • Proszę przejść na zakładkę DNS
  • Proszę kliknąć Add record, typ A
  • W polu Name proszę wpisać subdomenę (na przykład home)
  • W polu **IPv4 **address proszę podać 0.0.0.0, tymczasowo, aby później sprawdzić działanie skryptu
  • Proszę pozostawić Proxy status wyłączony (szara chmurka), buforowanie i proxy nie są potrzebne dla DDNS
Rekord A home z testowym IP 0.0.0.0 w DNS Cloudflare

Rekord jest gotowy. Teraz pobierzemy klucz dostępu do API.

2. Pobieramy token API Cloudflare

Kiedyś wszystkie instrukcje sugerowały globalny klucz API, który daje pełny dostęp do wszystkich domen na koncie. To niebezpieczne: wycieknie klucz, wycieknie wszystko. Obecnie Cloudflare zaleca tokeny API z granularnymi uprawnieniami. Token można ograniczyć do konkretnej domeny i akcji, a w razie kompromitacji odwołać jednym kliknięciem.

  • W panelu Cloudflare proszę przejść: My ProfileAPI Tokens
  • Proszę kliknąć Create Token
  • Proszę wybrać szablon Edit zone DNS (lub utworzyć własny)
  • W sekcji Zone Resources proszę wskazać konkretną domenę, tę, dla której konfiguruje Pan DDNS
  • Proszę kliknąć Continue to summaryCreate Token
  • Proszę skopiować token, jest on pokazywany tylko raz

Token ma postać długiego ciągu znaków zaczynającego się od cfut_. Proszę przechowywać go w bezpiecznym miejscu, za chwilę będzie potrzebny skryptowi na Raspberry Pi.

3. Skrypt automatycznej aktualizacji na Raspberry Pi

Proszę połączyć się z Raspberry Pi przez SSH lub otworzyć terminal. Utworzymy katalog dla skryptu:

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

Teraz sam skrypt. Proszę utworzyć plik cloudflare-ddns.sh:

1nano ~/cf/cloudflare-ddns.sh

Proszę skopiować do niego następujący kod:

1#!/bin/bash
2
3 ## Настройки (замените на свои)
4AUTH_EMAIL="[email protected]"
5API_TOKEN="cfut_ваш_токен"
6ZONE_NAME="example.com"
7RECORD_NAME="home.example.com"
8
9 ## Получаем текущий публичный IP
10CURRENT_IP=$(curl -s https://api.ipify.org)
11
12 ## Получаем 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 ## Получаем Record ID и текущий 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 ## Обновляем запись, если IP изменился
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

Proszę zastąpić cztery zmienne w bloku „Ustawienia" swoimi rzeczywistymi wartościami. Email, ten sam, którego używają Państwo do logowania do Cloudflare. Token, ten skopiowany w kroku 2. Nazwa strefy, czyli Państwa domena bez http://. Nazwa rekordu, czyli pełna subdomena.

Proszę zapisać plik (Ctrl+O, Enter, Ctrl+X w nano) i uczynić go wykonywalnym:

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

Proszę uruchomić ręcznie w celu weryfikacji:

1~/cf/cloudflare-ddns.sh

Jeśli wszystko jest skonfigurowane poprawnie, proszę wejść do panelu DNS Cloudflare: adres IP rekordu A powinien zmienić się z 0.0.0.0 na Państwa rzeczywisty publiczny adres IP. Log zapisywany jest w ~/cf/cloudflare-ddns.log, proszę tam zajrzeć, jeśli coś poszło nie tak.

4. Automatyzacja przez cron

Ręczne uruchomienie służy wyłącznie do weryfikacji. Dalej działa cron.

1crontab -e

Jeśli system poprosi o wybranie edytora, proszę wybrać nano (zazwyczaj pod numerem 2, jest najprostszy). Proszę dodać linię na końcu pliku:

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

Ten wpis uruchamia skrypt co 6 godzin. Nawet jeśli dostawca zmienia IP raz na kilka miesięcy, sześciogodzinne okno to rozsądny kompromis między aktualnością a obciążeniem API.

Jeśli chcą Państwo częściej, proszę zastąpić przez */30 * * * * (co 30 minut). Proszę jednak pamiętać: bezpłatny limit Cloudflare API to 1200 zapytań na minutę, więc nawet wywołanie co minutę nie stanowi problemu dla jednej domeny.

Proszę zapisać (Ctrl+X, Y, Enter). Cron automatycznie wykryje zmiany, nie trzeba restartować usługi. W rozszyfrowaniu gwiazdek pomoże crontab.guru.

Krótka instrukcja wideo na ten sam temat od NetworkChuck z demonstracją na rzeczywistym Raspberry Pi i wyjaśnieniem każdego kroku:

Co zrobić, jeśli skrypt nie znalazł Zone ID lub Record ID

Czasami API nie zwraca identyfikatorów automatycznie, szczególnie gdy na koncie jest wiele domen lub rekordów o podobnych nazwach. W takim przypadku proszę uzyskać je ręcznie:

  • Proszę wejść do panelu Cloudflare, wybrać domenę, zakładkę DNS
  • Proszę otworzyć narzędzia deweloperskie w przeglądarce (F12 → zakładka Network → podzakładka XHR)
  • Proszę kliknąć ikonę chmury obok Państwa rekordu A, w panelu sieciowym pojawi się zapytanie do API
  • Proszę kliknąć je prawym przyciskiem myszy → CopyCopy link address (Chrome) lub Copy URL (Firefox)
  • W skopiowanym linku proszę znaleźć część po zones/, to Zone ID, a po dns_records/, to Record ID

Proszę podstawić je do zmiennych ZONE_ID i RECORD_ID w skrypcie, a wszystko zacznie działać. Proszę upewnić się, że chmura w panelu DNS jest szara (proxy wyłączone): Cloudflare nie powinien buforować IP dla DDNS.

⁉️🤔 Często zadawane pytania

Czy konieczne jest używanie tokena API, a nie klucza globalnego?

Klucz globalny nadal działa, ale token to nowoczesna i bezpieczna opcja. Token można ograniczyć do jednej domeny i uprawnienia do edycji DNS. Klucz globalny daje dostęp do całego konta. Jeśli skrypt lub Pi zostaną skompromitowane, token można po prostu odwołać, a klucz trzeba by zmieniać wszędzie.

Czym to podejście różni się od DuckDNS lub No-IP?

Zewnętrzne serwisy DDNS dają subdomenę trzeciego poziomu, taką jak myhome.duckdns.org. Podejście z Cloudflare wykorzystuje Państwa własną domenę (home.example.com), wygląda to bardziej profesjonalnie, nie zależy od cudzego serwisu i nie wymaga comiesięcznego logowania w celu potwierdzenia aktywności. Dodatkowo zyskują Państwo dostęp do całego ekosystemu Cloudflare: ochronę przed DDoS, certyfikaty SSL, reguły firewalla.

Czy trzeba przekierować porty na routerze?

Tak, aby połączyć się z Raspberry Pi z internetu. DDNS gwarantuje jedynie, że domena zawsze wskazuje na aktualny adres IP. Aby ruch z tego IP trafił na Pi, należy skonfigurować przekierowanie portów na routerze dla potrzebnych portów (22 dla SSH, 80/443 dla WWW itd.).

Co zrobić, jeśli Raspberry Pi jest za NAT-em dostawcy?

Niektórzy dostawcy stosują Carrier-Grade NAT (CGNAT), wtedy nie mają Państwo własnego publicznego adresu IP i DDNS nie pomoże. Rozwiązanie: poprosić dostawcę o biały adres IP (często jest to bezpłatne na wniosek) lub użyć Cloudflare Tunnel, który tworzy szyfrowany kanał z Pi do Cloudflare bez przekierowania portów.

Ile kosztuje takie rozwiązanie?

Zero. Cloudflare DNS jest bezpłatny dla nieograniczonej liczby rekordów A. Raspberry Pi już Państwo kupili. Zużycie energii elektrycznej przez Pi 3/4 pod obciążeniem wynosi około 3-5 W, co rocznie daje około 250-400 $.

Czy można aktualizować wiele subdomen?

Tak, proszę zduplikować bloki z RECORD_NAME i DNS_IP w skrypcie dla każdej subdomeny lub opakować logikę w pętlę po tablicy nazw.

Dynamiczny DNS na Cloudflare: co wdrożyć w 2026 roku

Schemat z Cloudflare API i cronem przetrwał już kilka generacji Raspberry Pi i nie stracił na aktualności. Otrzymują Państwo własną subdomenę, nie są zależni od zewnętrznych dostawców DDNS i nie płacą ani grosza.

Jeśli chcą Państwo pójść dalej, proszę spojrzeć w stronę gotowych obrazów Dockera: oznu/cloudflare-ddns aktualizuje IP co 5 minut i konfiguruje się przez zmienne środowiskowe. Dla osób preferujących Pythona jest aribasadme/rpi-cloudflare-ddns, zoptymalizowany specjalnie pod Raspberry Pi.

Najważniejsze, co zrobili Państwo dzisiaj: Raspberry Pi jest teraz dostępne z dowolnego miejsca na świecie pod stałym adresem. A to fundament pod cokolwiek: od serwera deweloperskiego WordPress po własną chmurę prywatną.

🔗 Dokumentacja Cloudflare DNS API