利用CloudFlare设置Dynamic DNS(DDNS)获取动态IP

更新提示

2018/07/05:增加一个Python脚本,支持Python2和Python3。Shell脚本和Python脚本均支持Cloudflare的v4 API,使用其中一个即可。

2018/07/04:第一版教程的脚本比较旧,用的API不再被CloudFlare支持。新教程改用Benkulbertis的shell脚本,设置也更为简单。此脚本需要系统支持grep的-P参数,部分系统可能无法使用,会报错grep: the -P option is not supported。目前在CentOS 7、Ubuntu 16.04测试通过,已知可能不支持的系统有OS X、Debian、FreeBSD。

2018/05/13:第一版教程使用了Larrybolt的shell脚本

简介

如果买了动态IP的VPS或服务器,IP会经常改变。这时,就可以通过DDNS来获取动态IP。部分商家可能不提供DDNS,需要自己搭建。假设你已经有了一个域名shiyanhe.com,想要设置域名ddns.zhaozhu.net获取最新的动态IP。

获取API

如果域名没有使用CloudFlare的DNS解析服务,首先要在CloudFlare按提示添加域名shiyanhe.com,把域名的DNS服务器改为CloudFlare,增加对应域名的A记录ddns.shiyanhe.com。TTL可设为2分钟或自动。注意,DDNS使用的域名不要开启CloudFlare的CDN,只用CF的DNS解析功能,也就是status一列对应域名的图标要是灰色的。

图片[1]-利用CloudFlare设置Dynamic DNS(DDNS)获取动态IP --实验盒

添加好域名解析后,前往https://www.cloudflare.com/a/profile获取Global API,把API一长串字符复制保存下来。注意,这串API不要泄露给其他人。

图片[2]-利用CloudFlare设置Dynamic DNS(DDNS)获取动态IP --实验盒

Shell脚本

获取脚本

得到API后,在VPS中下载脚本到/usr/local/bin目录,把脚本命名为cf-ddns.sh,并修改脚本的权限:

curl https://gist.githubusercontent.com/benkulbertis/fff10759c2391b6618dd/raw > /usr/local/bin/cf-ddns.sh && chmod +x /usr/local/bin/cf-ddns.sh

一般系统都会带有curl,但如果出错,就需要先安装curl,具体安装方法可以谷歌或百度一下。

配置

打开脚本进行配置:

vi  /usr/local/bin/cf-ddns.sh

找到以下内容并修改:

auth_email="user@example.com"
auth_key="c2547eb745079dac9320b638f5e225cf483cc5cfdda41" # found in cloudflare account settings
zone_name="example.com"
record_name="www.example.com"

其中,在auth_email中填入CloudFlare账号的邮箱,在auth_key输入前面获取的API,zone_name填入域名shiyanhe.com,record_name填入DDNS的域名ddns.shiyanhe.com。

修改完后,保存退出。输入bash /usr/local/bin/cf-ddns.sh运行脚本,如果提示IP changed to: X.X.X.X,表明配置成功。

crontab定时运行

脚本配置成功后,需要让它定时运行。这里设置每10分钟运行一次cf-ddns.sh脚本。

输入crontab -e,然后会弹出vi编辑界面,在里面添加一行:

*/10 * * * *  /usr/local/bin/cf-ddns.sh >/dev/null 2>&1

保存并退出。输入service crond status,可以看到contab的运行状态。如果contab服务没有打开,建议参考http://man.linuxde.net/crontab教程,它涵盖了crontab服务状态的启动、重启、查看、简单配置等内容。另外也可以看看http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.htmlhttp://www.runoob.com/linux/linux-comm-crontab.html

日志文件

脚本获取IP更改CloudFlare的DNS记录后,会在目录中生成ip.txt、cloudflare.ids和cloudflare.log三个文件。ip.txt记录的是本机的IP。脚本自动获取到IP后,会先与ip.txt中的IP进行比较,当不一致时(检测到IP发生变化),才会更新CloudFlare的DNS记录,并且把新IP写入ip.txt文件中。如果IP没变化,运行脚本会提示IP has not changed。如果要强制运行脚本更新DNS记录,可以rm /usr/local/bin/ip.txt删除掉ip.txt。

如果运行忽然出问题,可以试试rm /usr/local/bin/cloudflare.ids把cloudflare.ids文件和ip.txt文件删除掉,再重新运行脚本。

Python脚本

获取脚本

curl https://raw.githubusercontent.com/AmirAzodi/cloudflare_ddns/master/cf-ddns.py > /usr/local/bin/cf-ddns.py && curl https://raw.githubusercontent.com/AmirAzodi/cloudflare_ddns/master/cf-ddns.conf > /usr/local/bin/cf-ddns.conf && chmod +x /usr/local/bin/cf-ddns.py

配置

打开配置文件:

vi /usr/local/bin/cf-ddns.conf

按提示修改以下内容:

{
 "domains": [
  {
   "hosts": [
    {
     "id": "",
     "ipv4": "",
     "ipv6": "",
     "name": "ddns",   #以ddns.shiyanhe.com为例,此处填入ddns
     "types": ["A"]
    }
   ],
   "id": "",
   "name": "shiyanhe.com"  #以ddns.shiyanhe.com为例,此处填入shiyanhe.com
  }
 ],
 "user": {
  "api_key": "CLOUDFLARE_API_KEY_HERE",  #填入API
  "email": "CLOUDFLARE_EMAIL_HERE"  #填入CloudFlare邮箱
 }
}

保存并退出,输入python /usr/local/bin/cf-ddns.py运行脚本,如果提示内容有update successful,表明运行成功。

crontab定时运行

跟第一个脚本类似,输入crontab -e,然后会弹出vi编辑界面,在里面添加一行:

*/10 * * * *  /usr/local/bin/cf-ddns.py >/dev/null 2>&1

更多脚本

如果以上都不能使用,可以尝试换其他的,不过这些本人没尝试过:

https://gist.github.com/bensonfx/487a7fece19916f3e66a31ce782e76d2

https://github.com/MachineITSvcs/Cloudflare-DDNS-Update

https://github.com/gstuartj/cf-ddns.sh

© 版权声明
THE END
喜欢就支持以下吧
点赞0
分享
评论 共18条
赵煮机的头像-实验盒

昵称

取消
昵称表情代码图片
    • 赵煮机的头像-实验盒
      chenmo
      0
    • 赵煮机的头像-实验盒
      Microsoft
      0
    • 赵煮机的头像-实验盒
      Pink
      0
    • 赵煮机的头像-实验盒
      Kenzie
      0
      • 赵煮机的头像-实验盒
        Kenzie
        0
    • 赵煮机的头像-实验盒
      taoge
      0
    • 赵煮机的头像-实验盒
      taoge
      0
    • 赵煮机的头像-实验盒
      taoge
      0
    • 赵煮机的头像-实验盒
      baiyou
      0
    • 赵煮机的头像-实验盒
      Colin
      0
    • 赵煮机的头像-实验盒
      cf-origin
      0
    • 赵煮机的头像-实验盒
      maxcat
      0
    • 赵煮机的头像-实验盒
      miaoice
      0
      • 赵煮机的头像-实验盒
        灰太狼
        0
    • 赵煮机的头像-实验盒
      Safy
      0
    • 赵煮机的头像-实验盒
      Safy
      0