• 欢迎访问赵煮机网,有问题可留言或电报

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

折腾笔记 赵煮机 1年前 (2018-07-03) 23166次浏览 19个评论
文章目录[隐藏]

更新提示

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,需要自己搭建。假设你已经有了一个域名 zhaozhuji.net,想要设置域名 ddns.zhaozhu.net 获取最新的动态 IP。

获取 API

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

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

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 填入域名 zhaozhuji.net,record_name 填入 DDNS 的域名 ddns.zhaozhuji.net。

修改完后,保存退出。输入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.zhaozhuji.net 为例,此处填入 ddns
     "types": ["A"]
    }
   ],
   "id": "",
   "name": "zhaozhuji.net"  #以 ddns.zhaozhuji.net 为例,此处填入 zhaozhuji.net
  }
 ],
 "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


版权声明: 如未注明转载 , 均为本站原创文章
本网站采用BY-NC-SA协议进行授权
转载前请联系,并注明原文链接:利用 CloudFlare 设置 Dynamic DNS(DDNS)获取动态 IP
喜欢 (6)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(19)个小伙伴在吐槽
  1. 大佬,是否最后要加上这一行啊chkconfig crond on
    Safy2018-08-22 10:13 回复
    • crontab命令相关的东西懒得写了,所以直接挂了个教程网址 :lol:
      赵煮机2018-08-23 21:01 回复
  2. 而且我遇到一个奇葩的问题,刚开始的时候可以用,后来发现突然用不了啦,发现 在/user/local/bin文件夹 里面 的cloudflare.ids 那几个文件都不会自动生成在/user/local/bin里面,而是生成在root目录,把sh脚本 里面的 这几个文件改成绝对路径/usr/local/bin后 正常了。。。好郁闷。
    Safy2018-08-22 10:16 回复
    • 我也试过忽然用不了的情况,把/usr/local/bin/里面产生的几个文件删除掉重新运行就可以了。个人感觉Python的那个脚本更稳些。
      赵煮机2018-08-23 21:05 回复
  3. [root@Nathosts-201895604 ~]# python /usr/local/bin/cf-ddns.py Traceback (most recent call last): File "/usr/local/bin/cf-ddns.py", line 29, in with open(config_file_name, 'r') as config_file: IOError: [Errno 2] No such file or directory: 'cf-ddns.conf' 大佬这是出现什么问题了,还有shell脚本只有第一次才能用,ip才会改变,第二次使用就不会改变no change ,然后删除ip.txt提示没这个文件!
    miaoice2018-09-07 10:57 回复
    • 我用的python那个脚本,第二次执行的也会出现这样,检查了一下,是路径问题,编辑脚本文件第27行,写全路径就可以了,config_file_name = '/usr/local/bin/cf-ddns.conf'
      灰太狼2018-09-17 13:18 回复
  4. 可以把HTTPS的根证书加上,安全
    maxcat2018-11-10 23:25 回复
  5. root@ip-172-26-9-148:~# bash /usr/local/bin/cf-ddns.sh API UPDATE FAILED. DUMPING RESULTS: {"success":false,"errors":[{"code":7003,"message":"Could not route to \/zones\/dns_records, perhaps your object identifier is invalid?"},{"code":7000,"message":"No route for that URI"}],"messages":[],"result":null} 不知什么原因
    cf-origin2018-12-22 17:07 回复
  6. 很迷 手动执行可以 放crontab 就不能了
    Colin2019-01-12 07:08 回复
  7. 运行 python /usr/local/bin/cf-ddns.py提示* problem with the config file怎么回事呢?
    baiyou2019-02-17 14:00 回复
  8. # bash /usr/local/bin/cf-ddns.sh API UPDATE FAILED. DUMPING RESULTS: {"success":false,"errors":[{"code":1020,"message":"Invalid DNS record identifier"}],"messages":[],"result":null} IP变动后。没有更新。执行命令后提示上面出错,我只能进入程序目录,把IP.TXT删除后,再执行更新命令,就正常了 这是不是要配合别外一个,执行更新的时候需要把旧的IP.txt 删除? [root@Nathosts-2019214508 ~]# rm ip.txt rm: remove regular file ‘ip.txt’? y [root@Nathosts-2019214508 ~]# bash /usr/local/bin/cf-ddns.sh API UPDATE FAILED. DUMPING RESULTS: {"success":false,"errors":[{"code":1020,"message":"Invalid DNS record identifier"}],"messages":[],"result":null} [root@Nathosts-2019214508 ~]# cd /usr/local/bin/ [root@Nathosts-2019214508 bin]# ls cf-ddns.sh cloudflare.ids cloudflare.log ip.txt [root@Nathosts-2019214508 bin]# rm ip.txt rm: remove regular file ‘ip.txt’? y [root@Nathosts-2019214508 bin]# bash /usr/local/bin/cf-ddns.sh IP changed to: 14.*.*.* [root@Nathosts-2019214508 bin]#
    taoge2019-02-23 21:52 回复
  9. 看来每10分钟的计划任务应该是选 RM /usr/local/bin/IP.TXT 最后才 bash /usr/local/bin/cf-ddns.sh 。这样IP换后才不会又出错,今晚又是换IP。10分钟任务没起作用
    taoge2019-02-25 01:04 回复
  10. 赵煮机,每10分钟执行cf-ddns.sh前先把IP.txt删除了,这个crontab -e 要怎么写?
    taoge2019-02-25 01:10 回复
  11. 日志显示已更换,但实际未做更改,这个是为啥呢? [Sun Mar 3 22:30:02 CST 2019] - IP changed to: 58.177.***.*** [Sun Mar 3 22:40:01 CST 2019] - Check Initiated [Sun Mar 3 22:50:01 CST 2019] - Check Initiated [Sun Mar 3 23:00:01 CST 2019] - Check Initiated
    Kenzie2019-03-04 12:27 回复
    • 结贴,因为在添加域名之前运行过一次,所以导致他更新到另外一个域名去了,解决办法删除cloudflare.ids,重新运行
      Kenzie2019-03-04 12:47 回复
  12. 感觉是瞎写,zone id 是一个api 怎么变域名了
    瞎写2019-06-05 14:58 回复
  13. 提問:換了IP之後腳本自動把CDN給關了…該怎麼解決?
    Pink2019-07-05 16:50 回复
  14. 您好,请问可以转载嘛,肯定要注明出处
    Microsoft2019-07-11 10:59 回复
  15. 我想一次多更新几个二级域名呢,要怎么修改?
    chenmo2019-09-25 14:15 回复