这是一篇发布于 1599 天前的文章,部分信息可能已发生改变。
RT,这篇文章是我在群晖上实现 DDNS 的记录,主要是通过 CloudFlare 提供的 API 来实现的。
准备工作 首先,你需要有个域名,还得注册了 CF,最后将域名的 Name Server 更改为 Cloudflare 的地址。
获取各种API秘钥 在Cloudflare的域名右侧找到ZoneID记下 然后点击Get your API key 在Global API keys栏里 找到Global API key 点View查看记下
还需要获得上面要DDNS的域名的Record ID 这个用Cloudflare的API获取 用上面得到的API key和Zone ID 在终端执行一下代码 返回结果中的ID便是需要用到的域名Record ID
在官方文档中我们可以得知 使用以下命令来查询自己的Record ID
1 2 3 4 curl -X GET "https://api.cloudflare.com/client/v4/zones/[YOUR-ZONE-ID]/dns_records?type=A&name=example.com&content=127.0.0.1&page=1&per_page=20&order=type&direction=desc&match=all" \ -H "X-Auth-Email: [user@example.com]" \ -H "X-Auth-Key: [YOUR-API-KEY]" \ -H "Content-Type: application/json"
将上文中的 “[user@example.com ]” 替换为你自己的注册邮箱 并将 “[YOUR-API-KEY]” 和 “[YOUR-ZONE-ID]” 替换为自己的key即可
在输入以上命令后 如果没出什么岔子的话 你会得到这样的回复,找到并记下 Record ID。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 { "success" : true , "errors" : [ ] , "messages" : [ ] , "result" : [ { "id" : "xxxxxxxxxxxxxxxxxxxxxxxxxx" , # 上面一行便是你的Record ID "type" : "A" , "name" : "example.com" , "content" : "198.51.100.4" , "proxiable" : true , "proxied" : false , "ttl" : { } , "locked" : false , "zone_id" : "YOUR_ZONE_ID" , "zone_name" : "USER@example.com" , "created_on" : "2014-01-01T05:20:00.12345Z" , "modified_on" : "2014-01-01T05:20:00.12345Z" , "data" : { } } ] }
配置DDNS 使用 Root 权限登陆群晖
输入以下两行命令 下载脚本到 /sbin 中
1 2 3 wget https://raw.githubusercontent.com/joshuaavalon/SynologyCloudflareDDNS/master/cloudflareddns.sh -O /sbin/cloudflaredns.sh chmod +x /sbin/cloudflaredns.sh
并修改其中的CloudFlare Config配置:
1 2 3 4 5 6 7 8 9 10 __RECTYPE__="A" # DNS记录类型,IPv4 是 A,IPv6 是 AAAA __RECID__="" # 获取到的 Record ID __ZONE_ID__="" # Zone ID __TTL__="1" # TTL=1时为自动 这一行不用管 __PROXY__="ture" # 是否使用CF的代理(小黄云)
修改群晖的DDNS配置文件 添加Cloudflare项 可以执行以下代码添加 也可以直接编辑/etc.defaults/ddns_provider.conf文件
1 2 3 4 5 cat >> /etc.defaults/ddns_provider.conf << 'EOF' [Cloudflare] modulepath=/sbin/cloudflaredns.sh queryurl=https://www.cloudflare.com/ EOF
登陆群晖的Web -> 控制面板 -> 外部访问 -> DDNS,然后抄下面作业就行了
服务提供商选Cloudflare 主机名称是DDNS域名 用户名是Cloudflare的注册邮箱 密码是API key 脚本备份 如果你没有富强工具的话,你大概率连不上 raw.githubusercontent.com 吃枣药丸,这里作为一个备份给没有富强工具的小伙伴。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 #!/bin/sh __USERNAME__="$(echo ${@} | cut -d' ' -f1) " __PASSWORD__="$(echo ${@} | cut -d' ' -f2) " __HOSTNAME__="$(echo ${@} | cut -d' ' -f3) " __MYIP__="$(echo ${@} | cut -d' ' -f4) " __LOGFILE__="/var/log/cloudflareddns.log" __RECTYPE__="A" __RECID__="" __ZONE_ID__="" __TTL__="1" __PROXY__="true" log () { __LOGTIME__=$(date +"%b %e %T" ) if [ "${#} " -lt 1 ]; then false else __LOGMSG__="${1} " fi if [ "${#} " -lt 2 ]; then __LOGPRIO__=7 else __LOGPRIO__=${2} fi logger -p ${__LOGPRIO__} -t "$(basename ${0}) " "${__LOGMSG__} " echo "${__LOGTIME__} $(basename ${0}) (${__LOGPRIO__} ): ${__LOGMSG__} " >> ${__LOGFILE__} } __URL__="https://api.cloudflare.com/client/v4/zones/${__ZONE_ID__} /dns_records/${__RECID__} " log "Updating with ${__MYIP__} ..." __RESPONSE__=$(curl -s -X PUT "${__URL__} " \ -H "X-Auth-Email: ${__USERNAME__} " \ -H "X-Auth-Key: ${__PASSWORD__} " \ -H "Content-Type: application/json" \ --data "{\"type\":\"${__RECTYPE__} \",\"name\":\"${__HOSTNAME__} \",\"content\":\"${__MYIP__} \",\"ttl\":${__TTL__} ,\"proxied\":${__PROXY__} }" ) __RESULT__=$(echo ${__RESPONSE__} | grep -Po '"success":\K.*?[^\\],' ) echo ${__RESPONSE__} case ${__RESULT__} in 'true,' ) __STATUS__='good' true ;; *) __STATUS__="${__RESULT__} " log "__RESPONSE__=${__RESPONSE__} " false ;; esac log "Status: ${__STATUS__} " printf "%s" "${__STATUS__} "