Po zalogowaniu do Cloudflare, z menu po lewej wybrać "Websites". Następnie kliknąć na domenę z menu po prawej odczytać CLOUDFLARE_ZONE_ID. Następnie wybrać "Get your API token" i wygenerować token.
Otrzymamy URL postaci, w którym jest podany ID tokenu:
curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify"
-H "Authorization: Bearer CLOUDFLARE_TOKEN_ID"
-H "Content-Type:application/json"
Kolejny krok, to utworzenie rekordu, który będzie automatycznie modifikowany po zmianie IP. Czas TTL ustawić taki, ile wynosi interwał wywoływania skryptu (u mnie co 5 minut):
Pozostaje teraz poznać CLOUFLARE_RECORD_ID. W tym celu należy wywołać w linii komend:
curl -X GET "https://api.cloudflare.com/client/v4/zones/CLOUDFLARE_ZONE_ID/dns_records" \
-H "Authorization: Bearer CLOUDFLARE_TOKEN_ID" \
-H "Content-Type:application/json" -s | jq . | less -S
Otrzymamy coś postaci:
{
"result": [
...
{
"id": "CLOUDFLARE_RECORD_ID",
"zone_id": "CLOUDFLARE_DOMAIN_ID",
...
"type": "A",
"content": "1.1.1.1", // current-router-ip
...
},
...
Teraz czas na finał, czyli stworzenie skryptu aktualizującego i zapewnienie, aby się cyklicznie wywoływał. Założenia skryptu:
wywoływany okresowo (raz na 5 minut)
do określania IP korzystam z https://api.ipify.org
przechowuje lokalnie ostatni IP, jaki ustawiłem w CloudFlare -> jak jest taki sam jak pobrany to kończę skrypt
pobieram aktualny IP przypisany do rekordu z CloudFlare -> jak jest taki sam jak pobrany to kończę srkytp
aktualizuje IP w CloudFlare i zapisuję go sobie lokalnie
Dodatkowo - zakładam, że w ustawianiach AsusWRT http://local-router-ip/Advanced_System_Content.asp (Administracja > System) jest już zaznaczone:
Skrypt zakładam, że mamy zainstalowane EntWare oraz pakiet jq oraz curl. Od strony shella skrypt + ustawienia crona wygląda tak:
$ ssh root@router
# cd /jffs/scripts
# cat dyndns.sh
#!/bin/sh
FORCE=${FORCE:-0}
CLOUDFLARE_TOKEN="SECRET"
CLOUDFLARE_ZONE_ID="SECRET"
CLOUDFLARE_RECORD_ID="SECRET"
SAVED_IP_FILENAME="/tmp/dyndns.ip"
CUR_IP=$(curl -s -X GET https://api.ipify.org)
SAVED_IP=""
if [ -f "${SAVED_IP_FILENAME}" ]; then
SAVED_IP=`cat "${SAVED_IP_FILENAME}"`
fi
if [ $FORCE -eq 0 -a "${CUR_IP}" == "${SAVED_IP}" ]; then
exit 0;
fi
DNS_IP=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ZONE_ID}/dns_records/${CLOUDFLARE_RECORD_ID}" -H "Authorization: Bearer ${CLOUDFLARE_TOKEN}" -H "Content-Type: application/json" | jq -j .result.content)
if [ $FORCE -eq 1 -o "${CUR_IP}" != "${DNS_IP}" ]; then
CHANGED_IP=$(curl \
-X PATCH "https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ZONE_ID}/dns_records/${CLOUDFLARE_RECORD_ID}" \
--data "{\"content\":\"${CUR_IP}\"}" \
-H "Authorization: Bearer ${CLOUDFLARE_TOKEN}" \
-H "Content-Type:application/json" \
-s | jq -j .result.content)
if [ "${CHANGED_IP}" == "${DNS_IP}" ]; then
echo "${DNS_IP}" > $SAVED_IP_FILENAME
fi
elif [ "${SAVED_IP}" != "${DNS_IP}" ]; then
echo "${DNS_IP}" > $SAVED_IP_FILENAME
fi
# cat services-start | grep dyndns
cru a dyndns "*/5 * * * * /jffs/scripts/dyndns.sh"