2017年11月22日 星期三

透過 Cloudflare API實現 DDNS


家中因為只有浮動IP,若要替網站主機實現DDNS可能需要路由設備支援或者是安裝專用的客戶端軟體(如:ddclient),而我的domain是透過cloudflare代管的,自然就利用了cloudflare所提供的API來處理此事了。


1. 確認API key
前往cloudflare官網查詢自己的API key



透過API查詢domain相關參數
[root@centos6 ~]# curl https://www.cloudflare.com/api_json.html -d 'a=rec_load_all' -d 'tkn=824ef65292b33a24c1d249de2566a7785d6ee' -d 'email=2@gmail.com' -d 'z=m.com.tw'


2. 解析domain的相關參數
透過任一線上json解析工具來閱讀API查詢後的結果,從objs集合裡找到你想要設定的網域主機名稱(需事先於cloudflare設定該筆A Record),並擷取所需的rec_id、display_name和type這三個參數的內容。


溫馨提示:[json線上解析工具]


3. 編寫script自動化更新網域的A Record
查詢本身的對外IP後、若已浮動則同步更新A Record至cloudflare
[root@centos6 ~]# nano /root/script/cloudflare_ddns.sh

#!/bin/bash
NEW_IP=`curl -s checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'`
NOWTIME=`date`
CURRENT_IP=`cat /var/tmp/current_ip.txt`
LOG_FILE="/root/script/cloudflare_ddns.log"
IP_FILE="/var/tmp/current_ip.txt"


echo $NOWTIME >> $LOG_FILE
if [ "$NEW_IP" = "$CURRENT_IP" ] || [ ! $NEW_IP ]
then
    echo "No Change in IP Adddress" >> $LOG_FILE
else
    curl https://www.cloudflare.com/api_json.html \
        -d 'a=rec_edit' \
        -d 'tkn=824ef65292b33a24c1d249de2566a7785d6ee' \
        -d 'email=2@gmail.com' \
        -d 'z=m.com.tw' \
        -d 'id=742674400' \
        -d 'type=A' \
        -d 'name=tomyhome' \
        -d 'ttl=1' \
        -d "content=$NEW_IP" \
        >> $LOG_FILE
    echo "" >> $LOG_FILE
    echo $NEW_IP > $IP_FILE
fi


# 第二行的部分若要更換查詢外網的網站,則sed指令也需對應做修改
# 第六行在每次script被執行後都會產生log以便日後查核ddns更新狀況
# tkn參數對應的是你的API key
# email參數對應的是你cloudflare的帳戶名稱
# z參數對應的是你所申請的主網域名稱如:m.com.tw(非www.m.com.tw)
# id參數對應的是你所要命名的網域主機名稱對應ID
# name參數對應的是你所要命名的網域主機名稱如:tomyhome(tomyhome.m.com.tw)

透過crontab定時執行script,檢查浮動IP是否有變更(此範例設置為每6小時確認一次)
[root@centos6 ~]# nano /etc/crontab

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

0 */6 * * * root /root/script/cloudflare_ddns.sh




本文內容參考自Lifely.today

0 意見: