为什么需要脚本
动态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
关于Lightsail被墙自动换ip,,
2019-07-10 下午9:15如何设置为 每小时 自动更换1次IP呢? 排除墙 或者 不墙,都按自定义的时间去更换??如果实现呢? 谢谢!
Lightsail必须要静态IP 才行吗?
2019-07-10 下午9:14IP更改成功,不过CF二级域名,每次更新就会把二级域名改为@ 一级域名。。 好奇怪。。。
kr.ddns.abc.com
更新之后变为:abc.com
config.conf里写的是二级域名没问题。
2019-01-28 上午12:04建议到Github下提交issue
2019-01-28 下午1:10使用中发现一个问题 就是获取DNS记录的过程中有分页 所以一直获取不到record的id
2018-12-21 下午11:38你好,我测试是没问题的,可以把错误报告贴上来吗?
2018-12-21 下午11:50接口返回数据
2018-12-21 下午11:57```
{
"result":[],
"result_info":{
"page": 1,
"per_page": 20,
"total_pages": 2,
"count": 20,
"total_count": 31
},
"success": true,
"errors":[
],
"messages":[
]
```
执行没有错误信息
但是config中的record_id一直是空的
之前 bash CloudFlare_DDNS_Setter.sh --ddns 这条命令错了,现在已经修正
2018-12-22 上午12:02执行 `bash CloudFlare_DDNS_Setter.sh` 中的 `get domain record_id` 选项,config 中的 record_id 仍旧为空
2018-12-22 上午12:06是不是忘了添加A记录了?我感觉你域名输错了。。
2018-12-22 上午12:13或者你可以先执行选项2创建一个A记录,然后用选项1试试
2018-12-22 上午12:14执行选项2的请求结果是记录已存在
2018-12-22 上午12:15我用了台新机子也无法复现。。。zone_id和你的二级域名是对应的吗?我只能说不是脚本的问题。。
2018-12-22 上午12:27可以多加一些记录,差不多30?然后选择顺序在下面的一些的记录,看能不能复现
2018-12-22 上午12:52你试试原版南琴浪的脚本吧,config是兼容的,https://github.com/nanqinlang-script/CloudFlare_DNS_Record
2018-12-22 上午1:10再次验证了一下,我只要在记录值最前面加上a提高排序就可以获取到record_id了
2018-12-22 上午1:13