CloudFlare DDNS

Если у вас динамический ip адрес, то можно использовать CloudFlare в качестве
динамического dns (DDNS) сервера. Суть в том, что как только у вас на сервере меняется ip адрес, отсылается информация об этом на сервер Cloudflare. Последний, в соответствии с пришедшей информацией, обновляет DNS записи.

Вот скрипт для отсылки информации об обновлении ip адреса. Он должен запускаться периодично, скажем, каждые 10 минут по cron. Для того, чтобы он работал, необходимо заполнить параметры конфигурации.

#!/bin/sh

### CONFIGURATION BEGIN
# CloudFlare login
cfuser=
# API KEY
cfkey=
# hostname
cfhost=

# Identificators
zoneid=
dnsrecid=
# network card interface
iface=
ttl=120
cache_file=/tmp/ddns.ip.txt
### CONFIGURATION END

# saved ip
if test -f $cache_file
then
   cache_ip=$(cat $cache_file)
fi

# current ip
current_ip=`/sbin/ifconfig $iface | grep 'inet addr' | cut -d ':' -f 2 | cut -d ' ' -f 1`

# on change
if [ "$current_ip" != "$cache_ip" ]
then
   echo "Updating CloudFlare with IP $current_ip"

   #"success":true,"errors":[]
   out=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records/$dnsrecid" \
      -H "X-Auth-Email: $cfuser" \
      -H "X-Auth-Key: $cfkey" \
      -H "Content-Type: application/json" \
      --data '{"id":"'$dnsrecid'","type":"A","name":"'$cfhost'","content":"'$current_ip'","ttl":'$ttl'}')

   # CloudFlare response check
   if echo "$out" | fgrep -qie '"success":true'
   then
      logger -t DNS -- "CloudFlare update with IP $current_ip"
      echo $current_ip > $cache_file
   fi
fi

Если параметры из секции конфигурации вам не известны, то далее речь будет идти о том, как их получить и протестировать их корректность.

Получение cfkey:
Его можно получить во вкладке "My Settings" > "API Key" > "Global API Key"

Получение zoneid:

#!/bin/sh
# CloudFlare login
cfuser=
# API KEY
cfkey=

# Get list of zone ids
curl -s -X GET "https://api.cloudflare.com/client/v4/zones" \
   -H "X-Auth-Email: $cfuser" \
   -H "X-Auth-Key: $cfkey" \
   -H "Content-Type: application/json" \
   | jq '.result[] | {name, id}'

Здесь используется jq для парсинга json ответа. Если он у вас не установлен, то строчку с jq можно просто убрать и оставить последней строкой -H "Content-Type: application/json". В таком случае ответ будет просто несколько более "многословный".

Получение списка dnsrecid:

#!/bin/sh
cfuser=
cfkey=
zoneid=

# Get list of DNS record ids in a zone
curl -s GET "https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records" \
   -H "X-Auth-Email: $cfuser" \
   -H "X-Auth-Key: $cfkey" \
   -H "Content-Type: application/json" \
   | jq '.result[] | {name, id, zone_id, zone_name, content, type}'

Простой скрипт для теста полученных параметров:

#!/bin/sh -x
cfuser=
cfkey=
zoneid=
dnsrecid=
cfhost=
# Example ip.
new_ip='127.0.0.1'

curl -X PUT "https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records/$dnsrecid" \
   -H "X-Auth-Email: $cfuser" \
   -H "X-Auth-Key: $cfkey" \
   -H "Content-Type: application/json" \
   --data '{"id":"'$dnsrecid'","type":"A","name":"'$cfhost'","content":"'$new_ip'","ttl":120}'

Если он работает, то можно заполнять конфигурацию первого скрипта из поста и ставить его в cron. Всё, в самом простейшем варианте должно корректно работать. Далее можно скрипт модифицировать для обновления поддоменов, изменения ttl и т.д., но в базовом варианте всё есть.

Comments

comments powered by Disqus