Kilka lat temu napisałem artykuł (i skrypt) opisujący wykorzystanie serwisu CloudFlare jako serwisu DDNS (Dynamic DNS). Oczywiście tego typu serwisów (Dynamic DNS) jest sporo, ale w większości przypadków za dodatkowe opcje – np. podpięcie własnej domeny – trzeba płacić. A po co to robić, jeśli w tym celu można wykorzystać właśnie usługę CloudFlare. Wspomniany artykuł opiera się na API w wersji 1, i choć u znajomego (jak i u mnie, podczas choćby dzisiejszych testów) nadal działa, to pojawiają się w komentarzach informacje, że nie u każdego tak jest. Dlatego postanowiłem zaktualizować skrypt do nowej wersji API (v4), przy okazji modyfikując niektórego jego założenia/funkcje…

CloudFlare (API v4) jako Dynamic DNS (DDNS)

Wprawdzie ten artykuł może być traktowany jako samodzielny byt, to jednak zachęcam do przeczytania jego „starszej wersji”, gdzie oprócz informacji o samym skrypcie i jego działaniu (tu akurat będzie trochę zmian) pisałem również o całej otoczce, towarzyszących usługach, wymaganiach systemowych, poleceniach czy programach…

Założenia skryptu pozostały bez zmian – w wybranych odstępach czasu (np. za pomocą usługi CRON) skrypt sprawdza aktualne publiczne IP (wykorzystuje zewnętrzne usługi), który następnie podstawia pod wybraną domenę lub subdomenę, skonfigurowaną na naszym koncie CloudFlare:

#!/bin/bash

# --------------------------------------------------
#
# ----- ---- --- CloudFlare DDNS --- ---- -----
#
# Code from: https://WebInsider.pl/cloudflare-ddns-api4
#
# CloudFlare API DOC:
# https://api.cloudflare.com/
#
# --------------------------------------------------

IP_CONTROL_LAST=1 # 1 - check the latest IP (file $IP_LOG_FILE), 0 - always sends the new IP

# Use Your fav IP chceck URL:
IP_CHECK_URL=
# e.g.:
# https://cdn.pryc.eu/add/myip.php

IP_LOG_FILE=/boot/last-ip.txt # Last IP LOG file

CF_API_KEY= # CF API KEY
CF_EMAIL= # CF E-mail

DOMAIN= # Domain
DOMAIN_RECORD_NAME= # Domain or subdomain to set IP

CF_RECORD_PROXIED=true # Whether the record is receiving the performance and security benefits of Cloudflare, valid values: true,false

CF_ZONE_ID= # CF Zone ID for selected domain
CF_REKORD_ID= # CF Record (domain/subdomain) ID


# Basic config test
if [[ ! $IP_CHECK_URL ]] || [[ ! $CF_API_KEY ]] || [[ ! $CF_EMAIL ]] || [[ ! $DOMAIN ]] || [[ ! $DOMAIN_RECORD_NAME ]] || [[ ! $CF_RECORD_PROXIED ]] || [[ ! $IP_LOG_FILE ]]
then
 echo "First set: IP_CHECK_URL, CF_API_KEY, CF_EMAIL, DOMAIN DOMAIN_RECORD_NAME, CF_RECORD_PROXIED, IP_LOG_FILE"
 exit 0
fi


# Start oprions: Basic config (ZONE ID, REKORD ID)

START_OPTION=$1

if [ "$START_OPTION" = "CF_ZONE_ID" ]
then
 curl -X GET "https://api.cloudflare.com/client/v4/zones?name="$DOMAIN"&status=active&page=1&per_page=20&order=status&direction=desc&match=all" \
 -H "X-Auth-Email: "$CF_EMAIL \
 -H "X-Auth-Key: "$CF_API_KEY \
 -H "Content-Type: application/json"
 exit 0
fi

if [ "$START_OPTION" = "CF_REKORD_ID" ]
then 
 curl -X GET "https://api.cloudflare.com/client/v4/zones/"$CF_ZONE_ID"/dns_records?page=1&per_page=20&order=type&direction=desc&match=all" \
 -H "X-Auth-Email: "$CF_EMAIL \
 -H "X-Auth-Key: "$CF_API_KEY \
 -H "Content-Type: application/json"
 exit 0
fi


# ZONE config test
if [[ ! $CF_ZONE_ID ]]
then
 echo "First run: script_name CF_ZONE_ID"
 echo "E.g.: cloudflare-ddns CF_ZONE_ID"
 echo "Next set it in script"
 exit 0
fi

if [[ ! $CF_REKORD_ID ]]
then
 echo "First run: script_name CF_REKORD_ID"
 echo "Eg: cloudflare-ddns CF_REKORD_ID"
 echo "Next set it in script"
 exit 0
fi


if [ -z "$IP_CHECK_URL" ]
then
 echo "IP_CHECK_URL is empty!"
 exit 0
else
 IP_NOW=`wget -O - -q $IP_CHECK_URL` # Get current IP, if IP_CONTROL_LAST=1 
fi
 

if [ ! -f $IP_LOG_FILE ] && [ "$IP_CONTROL_LAST" = "1" ]
then
 sudo touch $IP_LOG_FILE
fi

if [ $IP_LOG_FILE ] && [ "$IP_CONTROL_LAST" = "1" ]
then
 IP_LAST=$(cat $IP_LOG_FILE)
fi

# --------------------------------------------------

function f_cf_api_change_ip() {

 curl -X PUT "https://api.cloudflare.com/client/v4/zones/"$CF_ZONE_ID"/dns_records/"$CF_REKORD_ID \
 -H "X-Auth-Email: "$CF_EMAIL \
 -H "X-Auth-Key: "$CF_API_KEY \
 -H "Content-Type: application/json" \
 --data '{"type":"A","name":"'$DOMAIN_RECORD_NAME'","content":"'$IP_NOW'","proxied":'$CF_RECORD_PROXIED'}'

}

if [ "$IP_CONTROL_LAST" = "1" ]
then
 if [ "$IP_NOW" != "$IP_LAST" ]
 then
 echo "New IP - changing..."
 echo $IP_NOW | sudo tee $IP_LOG_FILE > /dev/null
 f_cf_api_change_ip 
 else 
 echo "IP is OK"
 fi
else
 echo "Changing IP..."
 echo $IP_NOW | sudo tee $IP_LOG_FILE > /dev/null
 f_cf_api_change_ip 
fi

exit 0

Skrypt możecie skopiować z „listingu” powyżej, lub – chyba bezpieczniej – pobrać z tego adresu. Ew możecie pobrać do bezpośrednio na serwer za pomocą komendy:

wget https://webinsider.pl/add/download/?link=cloudflare_ddns_api4 -O /ścieżka/do/zapisania/cloudflare-ddns

Pamiętajcie, by nadać mu atrybuty wykonywalności:

sudo chmod 755 /ścieżka/do/pliku/cloudflare-ddns

W tym momencie można przystąpić do pierwszej, podstawowej konfiguracji:

  • IP_CONTROL_LAST – czy skrypt ma aktualizować adres IP w CloudFlare tylko gdy się zmienił (1), czy zawsze (0)
  • IP_CHECK_URL – adres serwisu, gdzie można sprawdzić aktualny adres IP (publiczny)
  • IP_LOG_FILE – plik, gdzie skrypt przechowuje ostatni adres IP (do porównania czy się zmienił)
  • CF_API_KEY – klucz API z serwisu CloudFlare
  • CF_EMAIL – adres e-mail powiązany z kontem w CloudFlare
  • DOMAIN – domena, z której będziemy korzystać
  • DOMAIN_RECORD_NAME – rekord z którego będziemy korzystać w ramach wybranej domeny (domena lub subdomena)
  • CF_RECORD_PROXIED – czy rekord ma być chroniony przez usługę CloudFlare, czy ruch ma być przepuszczany swobodnie

Gdy powyższe zmienne są skonfigurowane (niektóre są uzupełnione wartościami domyślnymi, niektóre trzeba samemu uzupełnić) uruchamiamy skrypt z parametrem CF_ZONE_ID (chyba, że znamy ID strefy):

/ścieżka/do/pliku/cloudflare-ddns CF_ZONE_ID

Dzięki czemu uzyskamy ID całej strefy związanej z domeną, który wprowadzamy do skryptu CF_ZONE_ID).

Kolejnym krokiem jest uzyskanie ID konkretnego rekordu, a więc uruchamiamy kolejny raz skrypt, tym razem z parametrem CF_REKORD_ID (chyba, że znamy ID wybranego rekordu):

/ścieżka/do/pliku/cloudflare-ddns CF_REKORD_ID

Uzyskany identyfikator rekordu (ID) dla domeny lub wybranej subdomeny również wprowadzamy do skryptu (CF_REKORD_ID).

W tym momencie skrypt jest już gotowy do pracy. Wystarczy skorzystać z polecenia:

/ścieżka/do/pliku/cloudflare-ddns 

Oczywiście warto to zautomatyzować, korzystając z systemowego harmonogramu zadań (CRON).

(!) Zgłoś błąd na stronie
Potrzebujesz profesjonalnej pomocy? Skontaktuj się z nami!
Spodobał Ci się artykuł? Zapisz się do naszego Newslettera - ZERO SPAMu, same konkrety, oraz dostęp do dodatkowych materiałów przeznaczonych dla subskrybentów!
Na podany adres e-mail otrzymasz od nas wiadomość e-mail, w której znajdziesz link do potwierdzenia subskrypcji naszego Newslettera. Dzięki temu mamy pewność, że nikt nie dodał Twojego adresu przez przypadek. Jeśli wiadomość nie przyjdzie w ciągu najbliższej godziny (zazwyczaj jest to maksymalnie kilka minut) sprawdź folder SPAM.
Roztańczona Karolina zapisała się do Newslettera WebInsider.pl i... teraz może tańczyć
WebInsider poleca księgowość wFirma
WebInsider korzysta z VPSa w HitMe.pl
WebInsider poleca VPSy DigitalOcean
WebInsider poleca serwis Vindicat
Napisz komentarz
wipl_napisz-komentarz_01Jeśli informacje zawarte na tej stronie okazały się pomocne, możesz nam podziękować zostawiając poniżej swój komentarz.

W tej formie możesz również zadać dodatkowe pytania dotyczące wpisu, na które – w miarę możliwości – spróbujemy Ci odpowiedzieć.
Linki partnerskie
Niektóre z linków na tej stronie to tzw. „linki partnerskie”, co oznacza, że jeśli klikniesz na link i dokonasz wymaganej akcji (np. zakup/rejestracja) możemy otrzymać za to prowizję. Pamiętaj, że polecamy tylko te produkty i usługi, z których sami korzystamy, i uważamy, że są tego na prawdę warte… :-)
Znaki towarowe i nazwy marek
W niektórych wpisach (oraz innych miejscach na stronie) mogą być przedstawione/użyte znaki towarowe i/lub nazwy marek, które stanowią własność intelektualną tych podmiotów, a zostały użyte wyłącznie w celach informacyjnych.
Monika ćwiczy przed kongresem ko..., ale dzięki motywowa Divi od Elegant Themes chyba nawet ona da radę...