『脚本』使用修改版CloudFlare脚本实现DDNS,含Lightsail被墙自动换ip

为什么需要脚本

动态DNS(英语:Dynamic DNS,简称DDNS)是域名系统(DNS)中的一种自动更新名称服务器(Name server)内容的技术。根据互联网的域名订立规则,域名必须跟从固定的IP地址。但动态DNS系统为动态网域提供一个固定的名称服务器(Name server),透过即时更新,使外界用户能够连上动态用户的网址。 (转自:wikipedia

在域名托管商(如:CloudFlare)处,每一个A记录均唯一对应一个ipv4地址,但是一个ipv4地址可以对应多个域名。在中国大陆,实际大陆拥有的ipv4地址是很少的,而且绝大部分握在中国电信手中,中国联通占少半块,中国移动几乎没多少份额。这一点从个人家庭用户向运营商索要公网ip的难度也可以看得出来。

如果您的入户光纤是分配的固定公网ip,那很好,您并不需要本脚本,只需要创建一条A记录指向您的公网ip就可以即刻体验物联网生活。但是如果是动态公网ip,现在常见的是每次路由器拨号就会更换ip,那显然,一条A记录已经不能满足需求了,这也是本脚本存在的意义

事前准备

一个 CloudFlare 账号,一个linux环境的路由器(或者vps),一个AWS Lightsail账号(可选)。

开始使用

首先获取 CloudFlare 的 Zone ID 和 Global API key 。登陆后,Home→你的根域名→Overview→Zone ID,然后Get your API key→API keys→View,输上密码就可以得到API key,如图

然后在刚才的Overview右侧的DNS栏,创建一条A记录,Name填自己能记得住的,IPv4 address填1.1.1.1即可,以后会自动更新,Add record,这就算创建好了一条A记录。

root身份登陆路由器或者vps,执行

mkdir /home/CloudFlare_DDNS
wget https://raw.githubusercontent.com/dovela/CloudFlare_DNS_Record/Setter/config.conf -O /home/CloudFlare_DDNS/config.conf
wget https://raw.githubusercontent.com/dovela/CloudFlare_DNS_Record/Setter/CloudFlare_DDNS_Setter.sh
vim /home/CloudFlare_DDNS/config.conf

脚本配置

email=  #CloudFlare账户的邮箱
zone_id=  #上文提到的 Zone ID
api_key=  #上文提到的 Global API key
domain=  #创建的A记录名,类似 blog.mcgrady.site
ttl=  #单位秒,建议值120,路由器性能不佳时可以酌情调大,建议不超过600
lightsail_switich=false  #如果本机是 AWS 的 Lightsail,可以用“true”开启本功能
lightsail_ipname=  #创建的静态ip的名称,写个喜欢的就好。名称仅可以包含字母和数字;可以使用连字符 (-) 和下划线 (_) 字符来分隔单词
lightsail_instance=  #本机的实例名称,类似 CentOS-512MB-Oregon-1

举例

email=example@gmail.com 
zone_id=3456dfdhfi465ff4ae263ef35esd060f api_key=84058228se28e28898b6ds3ej78yuf2136654 
domain=example.example.net 
ttl=120 
lightsail_switich=true
lightsail_ipname=ip-of-tokyo 
lightsail_instance=CentOS-1GB-Tokyo-1

运行脚本

如果是第一次运行,建议执行一次

bash CloudFlare_DDNS_Setter.sh install

之后执行

bash CloudFlare_DDNS_Setter.sh

会有以下选项

1.get domain record_id

  • 第一次执行脚本时运行,目的是获取A记录对应的record_id,如果修改修改二级域名后也须执行一次,该过程是自动完成的。

2.create new domain record

  • (注:本功能详见南琴浪博客,本博主并未使用过此功能…似乎是可以自动创建A记录)

3.*configure lightsail if necessary

  • 如果config中“lightsail_switich”项为true,须执行一次本选项。本文最后会给出介绍,现在略过。

执行过一次 get domain record_id 后,config中会自动添加一条record记录,同时以root的身份向crontabs添加了一条
*/3 * * * * bash CloudFlare_DDNS_Setter.sh –ddns

目的是每3分钟执行一次自动更新ddns,不过为了保险起见,先手动执行一次

bash CloudFlare_DDNS_Setter.sh --ddns

如果返回值为result什么什么的,就说明成功了,去Cloudflare检查发现ip也由1.1.1.1更新为了公网ip。如果需要修改自动执行频率,请执行crontab -e

关于Lightsail被墙自动换ip

首先需要去AWS Access keys 获取访问密钥并保存下来,执行 configure lightsail if necessary 后,填入获取的密钥,地域代码须正确填写本机地域,第四项format留空即可。如果之前正确填写了config,此功能将会随ddns一同运行。

地域表

北美

  • us-east-1 弗吉尼亚州
  • us-east-2 俄亥俄州
  • us-west-2 俄勒冈州
  • ca-central-1 加拿大

欧洲

  • eu-west-1 爱尔兰
  • eu-west-2 英国
  • eu-west-3 法国
  • eu-central-1 德国

亚洲

  • ap-northeast-1 日本
  • ap-northeast-2 韩国
  • ap-southeast-1 新加坡
  • ap-southeast-2 澳大利亚
  • ap-south-1 印度

致谢

nanqinlang-script,脚本的创作者,博主在此基础上做了步骤简化和优化。

屌鸡 tg@Unknow000 ,本开源项目使用了他的ipcheck service

皮皮虾窝 ,在加入lightsail自动换ip功能过程中提供了重要的参考。

转载请直接声明本博,项目地址https://github.com/dovela/CloudFlare_DNS_Record

参与评论

  • kala520用户

    关于Lightsail被墙自动换ip,,
    如何设置为 每小时 自动更换1次IP呢? 排除墙 或者 不墙,都按自定义的时间去更换??如果实现呢? 谢谢!

    6天前
    4楼
    回复
  • kala520用户

    Lightsail必须要静态IP 才行吗?

    6天前
    地板
    回复
  • pccw游客

    IP更改成功,不过CF二级域名,每次更新就会把二级域名改为@ 一级域名。。 好奇怪。。。

    kr.ddns.abc.com

    更新之后变为:abc.com

    config.conf里写的是二级域名没问题。

    6月前 (01-27)
    板凳
    回复
  • Mr.Kevin站长

    建议到Github下提交issue

    6月前 (01-28)
    回复
  • Quarter用户

    使用中发现一个问题 就是获取DNS记录的过程中有分页 所以一直获取不到record的id

    7月前 (12-21)
    沙发
    回复
  • dovela用户

    你好,我测试是没问题的,可以把错误报告贴上来吗?

    7月前 (12-21)
    回复
  • Quarter用户

    接口返回数据
    ```
    {
    "result":[],
    "result_info":{
    "page": 1,
    "per_page": 20,
    "total_pages": 2,
    "count": 20,
    "total_count": 31
    },
    "success": true,
    "errors":[
    ],
    "messages":[
    ]
    ```
    执行没有错误信息
    但是config中的record_id一直是空的

    7月前 (12-21)
    回复
  • dovela用户

    或者你可以先执行选项2创建一个A记录,然后用选项1试试

    7月前 (12-21)
    回复
  • Quarter用户

    再次验证了一下,我只要在记录值最前面加上a提高排序就可以获取到record_id了

    7月前 (12-21)
    回复
  • dovela用户

    你试试原版南琴浪的脚本吧,config是兼容的,https://github.com/nanqinlang-script/CloudFlare_DNS_Record

    7月前 (12-21)
    回复
  • Quarter用户

    可以多加一些记录,差不多30?然后选择顺序在下面的一些的记录,看能不能复现 :razz:

    7月前 (12-21)
    回复
  • dovela用户

    我用了台新机子也无法复现。。。zone_id和你的二级域名是对应的吗?我只能说不是脚本的问题。。

    7月前 (12-21)
    回复
  • Quarter用户

    执行选项2的请求结果是记录已存在 :oops:

    7月前 (12-21)
    回复
  • dovela用户

    是不是忘了添加A记录了?我感觉你域名输错了。。

    7月前 (12-21)
    回复
  • Mr.Kevin站长

    之前 bash CloudFlare_DDNS_Setter.sh --ddns 这条命令错了,现在已经修正

    7月前 (12-21)
    回复
  • Quarter用户

    执行 `bash CloudFlare_DDNS_Setter.sh` 中的 `get domain record_id` 选项,config 中的 record_id 仍旧为空

    7月前 (12-21)
    回复