CloudFlare DDNS

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

Вот скрипт для отсылки информации об обновлении ip адреса. Он должен запускаться периодично, скажем, каждые 10 минут по cron. Для того, чтобы он работал, необходимо заполнить параметры конфигурации: cfuser - логин на сайте Cloudflare, cfkey - ваш API ключ, cfhost - адрес сайта, zoneid - идентификатор DNS зоны (сайта) CloudFlare, dnsrecid - идентификатор DNS записи, которую нужно обновить, iface - интерфейс внешней сетевой карты. После скрипта будет объяснено, как получить параметры cfkey, zoneid, dnsrecid, iface.

#!/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"
API Key

Получение zoneid:
Идентификатор DNS можно либо прочесть в настройках домена "Overview" > "Domain Summary"
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}'

Идентификаторы записей (параметр dnsrecid) здесь выводятся в поле id.

Параметр iface:
Он нужен скрипту для того, чтобы проверять не изменился ли ip адрес у вашей внешней сетевой карты. Просмотреть все доступные интерфейсы можно командами ip addr show либо ifconfig. Среди них должен быть искомый.

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

#!/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}'

Скрипт делает значение DNS записи равной localhost (127.0.0.1)

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

Comments

comments powered by Disqus