前言
近日有网友向我推荐了在群晖NAS上使用 Cloudflare 的 DDNS 方案,经过测试也确实比较简单方便.于是整理了两种方案分别适用于原生 DDNS 服务
和docker 部署
,将分为两篇教程来讲解.
本文将详细介绍在群晖NAS上使用
原生 DDNS
部署配置Cloudflare DDNS
动态域名解析.
本文为 Stille 原创文章.经实践,测试,整理发布.如需转载请联系作者获得授权,并注明转载地址.
部署配置流程
获取 API
1. 获取 区域 ID
登陆 Cloudflare 点击域名,在概述页面右侧获取区域 ID
.
2. 创建 API 令牌
点击获取您的 API 令牌
后创建令牌
,选择最下的自定义令牌
- 为令牌命名
- 权限选择
区域
-DNS
-编辑
- 其他保持默认即可
保存后生成 API 令牌,请复制保存好该令牌,后续将无法在次查询此令牌
.
配置群晖原生 DDNS
群晖原生 DDNS 并不支持 Cloudflare ,通过 joshuaavalon/SynologyCloudflareDDNS 项目提供的脚本和方案,可以将 Cloudflare 添加到原生 DDNS 列表中.
1. 开启并登陆群晖NAS终端
控制面板 - 终端机和 SNMP - 勾选启用 SSH 功能
macOS 使用终端, Windows 使用 PuTTY 或 Windows Terminal 来登陆群晖.
ssh xxxx@192.168.1.x
# xxxx为群晖的帐户
sudo -i
# 登陆成功后,切换为 root 帐户.
2. 下载 Cloudflare DDNS 脚本
下载 Cloudflare 的 DDNS 脚本文件,官方推荐存放于/sbin/cloudflareddns.sh
并赋予执行权限.
手动修改第六行的 proxy="true" 为 proxy="false" 避免被 CDN 代理.
新手用户不建议修改存放路径.如需修改,请注意下文所有相关路径都必须同时更改.
wget https://raw.githubusercontent.com/joshuaavalon/SynologyCloudflareDDNS/master/cloudflareddns.sh -O /sbin/cloudflareddns.sh
# 下载脚本
chmod +x /sbin/cloudflareddns.sh
# 赋予执行权限
3. 新增原生 DDNS 列表
复制粘贴以下命令并执行
cat >> /etc.defaults/ddns_provider.conf << EOF
[Cloudflare]
modulepath=/sbin/cloudflareddns.sh
queryurl=https://www.cloudflare.com
website=https://www.cloudflare.com
EOF
4. 登陆群晖 DSM - 控制面板 - 外部访问 - DDNS - 新增
- 服务供应商 - 选择 Cloudflare
- 主机名称 - 填写 DDNS 域名
- 用户名 - 填写区域 ID
- 密码 - 填写上文生成的 API 令牌
确定后稍等一会就会显示正常即配置成功
主机名称强烈推荐
不要
使用根域名
,单独为 DDNS 选择一个专用域名,如需使用根域名访问家中服务,可以添加根域名
的 CNAME 指向 DDNS 域名即可.具体可参考下图:
结语
更多关于 DDNS 教程,群晖 NAS 相关技巧,教程及信息,请持续关注本站群晖Synology专栏:
本文为 Stille 原创文章.经实践,测试,整理发布.如需转载请联系作者获得授权,并注明转载地址.
75 条评论
DSM7.2 纯ipv6脚本见下文,
ipv6脚本原理:由于在群晖DDNS面板配置中,无法指定ipv6地址的获取,故通过读取群辉网卡中的ipv6地址,实现ddns中ipv6地址的设置;
所以在使用该脚本时,需注意修改 第20行代码“ip6fetch=$(ip -6 addr show ovs_eth0 | grep -oE "$ipv6Regex" | head -n 1 || true)”获取的ipv6地址是否是真正的公网ipv6地址,在测试时,可以通过 bash -x /sbin/cloudflareddns.sh 查看输出的ipv6地址是否是正确的公网ip;其中涉及网口(尤其是双网口设备)的选择、正则的匹配、正则匹配结果正确ip行的选择。
关键命令行解析:
通过linux 命令
ip -6 addr 可以获取所有网卡的ipv6地址;
show ovs_eth0 只显示第一个网口的信息(此处可以通过 ip -6 addr 显示的信息,决定是否修改 ovs_eth0的值,有可能网线插的另一个网口,可能需要修改为 ovs_eth1 ,也有可能网卡命名规则不是 ovs_xxx的形式,需要根据实际情况修改为正确的网卡名称)
| grep -oE "$ipv6Regex" 正则匹配显示网口的ipv6地址
| head -n 1 值获取正则匹配结果后的第一行信息(ipv6地址可能有多个,只能取一个作为DDNS的更新ip)
也可以通过linux命令打印输出的ipv6地址,若不正确,需自行调整
!/bin/bashcopyright:https://raw.githubusercontent.com/joshuaavalon/SynologyCloudflareDDNS/master/cloudflareddns.ship -6 addr show ovs_eth0 | grep -oE "(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))" || true
set -e;
proxy="true"ask for existing proxy, don't override it <.<DSM Configipv6Regex="(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))"
ipv6="true"
username="$1"
Fetch and filter IPv6, if Synology won't provide itpassword="$2"
hostname="$3"
ipAddr="$4"
recType6="AAAA"
if [[ $ipv6 = "true" ]]; then
else
fi
above only, if IPv4 and/or IPv6 is providedlistDnsv6Api="https://api.cloudflare.com/client/v4/zones/${username}/dns_records?type=${recType6}&name=${hostname}" # if only IPv4 is provided
resv6=$(curl -s -X GET "$listDnsv6Api" -H "Authorization: Bearer $password" -H "Content-Type:application/json");
resSuccess=$(echo "$resv6" | jq -r ".success")
if [[ $resSuccess != "true" ]]; then
fi
recordIdv6=$(echo "$resv6" | jq -r ".result[0].id");
API-Calls for creating DNS-EntriesrecordIpv6=$(echo "$resv6" | jq -r ".result[0].content");
recordProxv6=$(echo "$resv6" | jq -r ".result[0].proxied");
createDnsApi="https://api.cloudflare.com/client/v4/zones/${username}/dns_records" # does also work for IPv6
API-Calls for update DNS-EntriesupdateDnsApi="https://api.cloudflare.com/client/v4/zones/${username}/dns_records/${recordId}" # for IPv4 or if provided IPv6
update6DnsApi="https://api.cloudflare.com/client/v4/zones/${username}/dns_records/${recordIdv6}" # if only IPv4 is provided
if [[ $recordIpv6 = "$ip6Addr" ]]; then
fi
if [[ $recordIdv6 = "null" ]]; then
else
fi;
res6Success=$(echo "$res6" | jq -r ".success");
if [[ $res6Success = "true" ]]; then
else
fi
代码行似乎被截断了
可用,成功,谢谢指导!
大佬,为啥我的意志认证失败?
已经不行了,添加了ddns一直不行!
群晖除Synology自带ddns以外都不支持IPV6,用您这个教程来在设置页面只有ipv4没有ipv6,设置成功也只会上传IPV4地址,IPv6地址不上传,请问这个怎么解决?
搞定了,直接在脚本ipAddr=这获取本机ipv6地址就行,就是ipv4地址彻底没了,不过我也没有公网V4,就不搞了。
老兄请问是怎么设置的脚本,我这也是移动网络,按照楼主的教程只能获取到IP4,ip6一直不显示
sh脚本ipAddr="$4"这改成
ipAddr=$(ip addr show dev eth0 | grep -oE '[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}')
网卡eth0这根据自己网卡名字改,只要ip addr show dev eth0 | grep -oE '[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}'这个命令单独执行能获得IPv6地址就验证没问题。
替换位置没错 ipv6地址可能会出来好几个 用语句选择正确的一个
我是双网口,刚才测试了一下,eht1可以获取到ip6地址,我把你第一次发我的消息改成了ipAddr=$(ip addr show dev eth1 | grep -oE '[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}'),后来又添加了两个" ",依然是获取的ip4地址。最新回复的这个定时任务..我不会弄...哈哈,小白理解不了了
""有没有不影响结果,没问题的话我就不回复了,还想折腾的话可以试试在ssh中运行一下命令,看看能不能出ipv6地址,两个网卡名都试试,可以就说明脚本获取ipv6没问题了
ip addr show dev eth1 | grep -oE '[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}'
只是在群晖控制面板-外部访问-DDNS中已经建立的cloudflare提示网络错误,然后进入编辑,看到ip4地址已经变成了0.0.0.0,但是ip6地址也是0.0.0.0,而且是灰色的,不能编辑
又更新了一下,ip4地址又回来了,编辑中的ip6地址依然是灰色的...
没问题的,这个命令完全可以获取到ip6地址
那啥,老兄能不能加我Q一下,我改成这个信息了,还是获取不到呢...2683370253,小白还是得手把手指导
ipAddr="$(ip addr show dev eth0 | grep -oE '[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}')"
echo $ipAddr
你用root用户加一个定时任务用上面代码填进去运行,看一下运行结果