1. 群晖DDNS解析到底在解决什么问题
家里那台群晖用了三年多,最开始我也没太在意远程访问这件事。局域网里用QuickConnect凑合着,速度慢得让人抓狂,传个几百兆的文件要等半天,看个视频转圈转到怀疑人生。后来实在忍不了,才开始认真研究DDNS这套东西。说实话,刚接触的时候被各种概念绕得头晕——DDNS、公网IP、端口映射、证书、反向代理,每个词都认识,连在一起就不知道从哪下手了。
这篇文章就是把我这几年折腾群晖DDNS的经验完整梳理一遍。DDNS全称动态域名解析,核心作用就一句话:让你在外面也能用固定的域名访问家里那台群晖。不管你是想远程存取文件、看家里的影音库、还是管理下载任务,DDNS都是绕不开的基础设施。适合所有买了群晖但还没搞定外网访问的朋友,不管你是刚入门的新手,还是已经折腾过一阵但总不稳定的老玩家,下面这些内容应该都能帮到你。
先说清楚一个前提:DDNS能玩转的基础是你得有公网IP。没有公网IP的话,DDNS配了也白配,域名解析过去指向的是一个运营商的大内网地址,外面根本连不进来。所以第一步永远是确认自己有没有公网IP。怎么确认?登录群晖,打开控制面板,找到“外部访问”里的DDNS选项,或者更直接的办法——去路由器后台看WAN口IP,然后跟百度搜“IP地址”显示的公网IP对比。如果两个一样,恭喜你,有公网IP;如果不一样,那大概率是运营商给你套了一层NAT。
我当初就是吃了这个亏。第一次配DDNS,域名解析成功了,但死活连不上,折腾了一整晚,最后才发现是运营商那边的问题。打电话过去申请公网IP,客服一开始还说没有,后来我说要装监控需要外网访问,才给开了。所以如果你发现WAN口IP和公网IP不一致,别急着怀疑群晖配置,先找运营商把公网IP要回来。
有了公网IP之后,DDNS要解决的就是另一个问题:家里的公网IP是会变的。运营商分配的公网IP通常是动态的,可能几天变一次,也可能重启一次光猫就变。IP一变,你之前记的地址就失效了。DDNS的作用就是自动检测IP变化,然后把这个新IP更新到域名解析记录里,让你始终能用同一个域名访问。这个过程是自动的,配好之后基本不用管。
群晖自带的DDNS服务支持不少提供商,像Synology自家的、花生壳、No-IP、DynDNS这些都有。但我个人更推荐用Cloudflare或者阿里云这类,原因后面会细说。选哪个提供商,主要看你的域名在哪注册的、对解析速度的要求、以及是否需要泛域名解析这些功能。
2. 方案选型:群晖自带DDNS还是第三方脚本
2.1 群晖自带DDNS的适用场景和局限
群晖控制面板里自带的DDNS功能,优点是配置简单,图形界面点几下就能用,不需要敲命令,对新手非常友好。支持的提供商列表也挺长,常见的花生壳、No-IP、DynDNS、FreeDNS都在里面。如果你只是想让群晖有个固定的外网访问地址,不追求什么高级功能,自带DDNS完全够用。
但自带DDNS有几个明显的局限。第一,它只支持列表里的提供商,像Cloudflare这种不在列表里的就用不了。第二,更新频率和触发机制是群晖自己控制的,你没法精细调整。第三,也是最要命的一点——它只更新IPv4地址,IPv6的支持很有限。现在很多家庭宽带已经分配了IPv6地址,如果你想让群晖通过IPv6被访问,自带DDNS基本帮不上忙。
我一开始用的就是群晖自带DDNS,配的花生壳。用了大概半年,整体还算稳定,但偶尔会出现解析不更新的情况。有一次IP变了,域名还指向旧地址,在外面急用的时候连不上,特别尴尬。后来查日志发现是群晖的DDNS更新请求超时了,但界面没有任何提示。从那以后我就开始琢磨换方案。
2.2 第三方脚本方案的灵活性和坑
第三方脚本方案说白了就是自己写个脚本,定时检测公网IP,发现变化就调用域名提供商的API更新解析记录。群晖上最常用的方式是用计划任务跑脚本,或者用Docker跑一个专门的DDNS容器。
这种方案最大的好处是灵活。你想用哪家域名提供商都行,只要它有API。更新频率你自己定,想一分钟检测一次也行,想一小时一次也行。IPv4和IPv6可以同时更新,甚至可以做多域名、多记录类型的复杂解析。而且脚本跑在后台,出问题了可以看日志,比群晖自带DDNS的黑盒更新透明得多。
但灵活也意味着要自己动手。你得会写脚本或者找现成的脚本,得配置API密钥,得设置计划任务,出了问题得自己排查。对于完全没接触过命令行的朋友,门槛确实高一些。不过别怕,下面我会把每一步都拆开讲清楚,照着做基本不会出问题。
我现在的方案是Cloudflare + 自己写的Shell脚本,跑在群晖的计划任务里,每5分钟检测一次IP。用了两年多,除了Cloudflare偶尔抽风,基本没出过问题。为什么选Cloudflare?一是免费版功能就够用,二是API文档清晰,三是解析速度快,四是支持API Token细粒度权限,比全局API Key安全得多。
2.3 两种方案的核心对比
| 对比项 | 群晖自带DDNS | 第三方脚本方案 |
|---|---|---|
| 配置难度 | 低,图形界面 | 中高,需要命令行 |
| 支持的提供商 | 仅列表内 | 任何有API的 |
| IPv6支持 | 有限 | 完整 |
| 更新频率控制 | 不可调 | 完全自定义 |
| 日志透明度 | 低 | 高,可查详细日志 |
| 多域名支持 | 不支持 | 支持 |
| 稳定性 | 一般 | 取决于脚本质量 |
| 适合人群 | 新手、需求简单 | 进阶、需求复杂 |
选哪个方案,核心看你的需求。如果你就一个域名、只走IPv4、不想折腾,自带DDNS省心。如果你要IPv6、要多域名、要精细控制,或者自带DDNS总出问题,那就上脚本方案。我个人的建议是,只要你有一定的动手能力,直接上脚本方案,一次配好后面省心得多。
3. Cloudflare DDNS脚本实操全流程
3.1 准备工作:域名、API Token和群晖环境
在开始之前,你需要准备三样东西:一个托管在Cloudflare的域名、一个API Token、以及一台能跑脚本的群晖。
域名这块不用多说,在Cloudflare注册或者把已有域名转入都行。转入之后,在Cloudflare的DNS设置里,先手动添加一条A记录,名字随便起,比如home.yourdomain.com,IP先随便填一个,比如1.1.1.1。这条记录后面会被脚本自动更新。TTL建议设成Auto,也就是自动,Cloudflare会自动根据情况调整。
API Token的创建是重点。很多人图省事直接用Global API Key,但那玩意权限太大,一旦泄露整个账号的域名都危险。正确做法是创建细粒度的API Token。登录Cloudflare,右上角头像点进去,找到“My Profile”,然后选“API Tokens”,点“Create Token”。模板选“Edit zone DNS”,然后在“Zone Resources”里选你的具体域名。这样这个Token就只能改这一个域名的DNS记录,安全得多。
创建完之后,Token只会显示一次,一定要复制下来保存好。如果丢了就只能重新创建。我一般会把Token存在群晖的密码管理器里,或者写在一个只有自己能访问的文本文件里。
群晖环境方面,你需要能SSH登录群晖。在控制面板的“终端机和SNMP”里把SSH服务打开,然后用电脑上的终端工具连上去。Windows可以用PowerShell或者PuTTY,Mac和Linux直接用终端。登录用的账号密码就是你群晖的管理员账号。
注意:SSH登录群晖默认用的是你的群晖账号,但有些操作需要root权限。群晖的root账号默认是禁用的,需要先通过
sudo -i提权,输入管理员密码后就能切换到root。不过日常操作不建议一直用root,容易误操作。
3.2 脚本编写:核心逻辑逐行拆解
脚本的核心逻辑其实很简单:获取当前公网IP,跟Cloudflare上记录的IP对比,不一样就更新。但实际写起来要考虑不少细节,比如怎么获取公网IP、怎么处理API返回的错误、怎么记录日志。
获取公网IP有好几种方式。可以用curl请求一些提供IP查询服务的网站,比如ifconfig.me、ipinfo.io/ip、api.ipify.org这些。我一般会准备两三个备用,一个失败了就换下一个。这样即使某个服务挂了,脚本还能正常工作。
# 获取公网IPv4地址,多个备用源 get_ipv4() { local ip ip=$(curl -s4 --max-time 10 https://api.ipify.org) || \ ip=$(curl -s4 --max-time 10 https://ifconfig.me/ip) || \ ip=$(curl -s4 --max-time 10 https://ipinfo.io/ip) echo "$ip" }这段脚本里,-s4表示静默模式并且只走IPv4,--max-time 10是设置10秒超时,避免网络卡住时脚本一直挂着。||是逻辑或,前一个命令失败了就执行下一个。这样三重保险,基本不会获取不到IP。
获取到IP之后,下一步是跟Cloudflare上的记录对比。这里需要调用Cloudflare的API查询当前DNS记录。API的地址是https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records,需要带上API Token和记录类型、名称等参数。
# 查询Cloudflare上的DNS记录 get_dns_record() { local record_name=$1 local record_type=$2 curl -s -X GET "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records?type=${record_type}&name=${record_name}" \ -H "Authorization: Bearer ${CF_API_TOKEN}" \ -H "Content-Type: application/json" }这里CF_ZONE_ID是你的域名在Cloudflare的Zone ID,在域名概览页面右下角能找到。CF_API_TOKEN就是刚才创建的Token。返回的是JSON格式的数据,需要解析出当前记录的IP和记录ID。
解析JSON在Shell里可以用jq这个工具,群晖上默认没有,需要先安装。群晖的套件中心里搜“jq”可能找不到,最简单的办法是用Entware或者Docker装一个。如果不想装额外工具,也可以用grep和sed硬解析,但容易出错,不推荐。
# 用jq解析返回的IP和记录ID current_ip=$(echo "$response" | jq -r '.result[0].content') record_id=$(echo "$response" | jq -r '.result[0].id')拿到当前IP之后,跟获取到的公网IP对比。如果一样,什么都不用做,记录日志就行。如果不一样,就调用更新接口。
# 更新DNS记录 update_dns_record() { local record_id=$1 local new_ip=$2 local record_name=$3 local record_type=$4 curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records/${record_id}" \ -H "Authorization: Bearer ${CF_API_TOKEN}" \ -H "Content-Type: application/json" \ --data "{\"type\":\"${record_type}\",\"name\":\"${record_name}\",\"content\":\"${new_ip}\",\"ttl\":120,\"proxied\":false}" }这里ttl设成120秒,也就是2分钟,这样IP变了之后外面能很快拿到新解析。proxied设成false,意思是DNS记录直接指向你的IP,不经过Cloudflare的代理。如果你想让Cloudflare代理流量,可以设成true,但那样的话群晖收到的访问来源IP会变成Cloudflare的IP,某些场景下会有影响,比如你想做IP白名单就不行了。
3.3 计划任务配置:让脚本自动跑起来
脚本写好了,接下来要让它定时自动执行。群晖的计划任务在控制面板的“任务计划”里。点“新增”,选“计划的任务”,然后选“用户定义的脚本”。
常规设置里,任务名称随便起,比如“Cloudflare DDNS”。用户账号选root,因为脚本需要网络访问权限,普通账号可能会被限制。计划设置里,选“每天”,然后“重复”选“每5分钟”。这样脚本每5分钟跑一次,IP变了最多5分钟就能更新。
任务设置里,把脚本内容粘贴进去。注意脚本开头要加上#!/bin/bash,不然可能不执行。另外建议把脚本输出重定向到日志文件,方便以后排查问题。
#!/bin/bash # Cloudflare DDNS 更新脚本 # 配置区 CF_API_TOKEN="你的API_Token" CF_ZONE_ID="你的Zone_ID" RECORD_NAME="home.yourdomain.com" RECORD_TYPE="A" LOG_FILE="/volume1/scripts/ddns.log" # 日志函数 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE" } # 获取公网IP get_ipv4() { local ip ip=$(curl -s4 --max-time 10 https://api.ipify.org) || \ ip=$(curl -s4 --max-time 10 https://ifconfig.me/ip) || \ ip=$(curl -s4 --max-time 10 https://ipinfo.io/ip) echo "$ip" } # 主逻辑 NEW_IP=$(get_ipv4) if [ -z "$NEW_IP" ]; then log "获取公网IP失败,跳过本次更新" exit 1 fi # 查询当前记录 RESPONSE=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records?type=${RECORD_TYPE}&name=${RECORD_NAME}" \ -H "Authorization: Bearer ${CF_API_TOKEN}" \ -H "Content-Type: application/json") CURRENT_IP=$(echo "$RESPONSE" | jq -r '.result[0].content') RECORD_ID=$(echo "$RESPONSE" | jq -r '.result[0].id') if [ "$NEW_IP" = "$CURRENT_IP" ]; then log "IP未变化: $NEW_IP" exit 0 fi # 更新记录 UPDATE_RESPONSE=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records/${RECORD_ID}" \ -H "Authorization: Bearer ${CF_API_TOKEN}" \ -H "Content-Type: application/json" \ --data "{\"type\":\"${RECORD_TYPE}\",\"name\":\"${RECORD_NAME}\",\"content\":\"${NEW_IP}\",\"ttl\":120,\"proxied\":false}") if echo "$UPDATE_RESPONSE" | jq -e '.success' > /dev/null; then log "更新成功: $CURRENT_IP -> $NEW_IP" else log "更新失败: $(echo "$UPDATE_RESPONSE" | jq -r '.errors[0].message')" fi这个脚本可以直接用,把配置区的几个变量换成你自己的就行。日志文件路径建议放在/volume1下面,因为群晖的系统分区空间有限,日志写多了可能把系统分区撑满。
提示:脚本里的
jq命令需要提前安装。如果群晖上没有jq,可以用Docker跑一个包含jq的容器,或者用Entware安装。最简单的办法是在套件中心装“Node.js”,然后用npm装jq的替代品,但那样脚本要改。我建议还是想办法装个jq,一劳永逸。
3.4 IPv6支持:让解析同时覆盖两种协议
现在很多家庭宽带已经支持IPv6了,群晖也能拿到IPv6地址。如果你想让外面通过IPv6访问群晖,DDNS脚本也得更新AAAA记录。逻辑跟IPv4一样,只是获取IP的方式和记录类型不同。
获取IPv6地址稍微麻烦一点,因为群晖可能有多个IPv6地址,你得找到那个公网可访问的。一般来说,以240e、2409、2408这些开头的才是公网IPv6,fe80开头的是链路本地地址,fd00开头的是私有地址,都不能用。
# 获取公网IPv6地址 get_ipv6() { local ip ip=$(curl -s6 --max-time 10 https://api64.ipify.org) || \ ip=$(curl -s6 --max-time 10 https://ifconfig.co/ip) echo "$ip" }-s6表示只走IPv6。如果群晖的IPv6配置正常,这个命令能返回公网IPv6地址。拿到之后,跟更新A记录一样,更新AAAA记录就行。脚本里可以同时处理A和AAAA,分别调用两次更新逻辑。
不过IPv6有个坑:很多地方的IPv6前缀是动态的,也就是说你的IPv6地址会随着时间变化,而且变化频率可能比IPv4还高。所以IPv6的DDNS更新频率建议设得更勤一些,比如每2分钟一次。另外,IPv6的防火墙设置也要注意,群晖自带的防火墙默认可能不允许IPv6入站,需要在控制面板里手动放行。
4. 端口映射与访问配置:让外网真正连进来
4.1 路由器端口映射的正确姿势
DDNS只解决了“域名指向哪个IP”的问题,但外网要访问群晖的某个服务,还需要在路由器上做端口映射。比如你想通过home.yourdomain.com:5000访问群晖的DSM管理界面,就需要把路由器的5000端口映射到群晖的5000端口。
端口映射在路由器的“虚拟服务器”或“端口转发”设置里。不同品牌的路由器叫法不一样,但逻辑都一样:外部端口、内部IP、内部端口、协议类型。外部端口是你从外面访问时用的端口,内部IP是群晖在局域网里的IP,内部端口是群晖上服务监听的端口。
我一般建议外部端口不要用默认的。比如DSM默认的5000和5001,大家都知道,容易被扫描。可以改成比如15000和15001,外面访问的时候用home.yourdomain.com:15000。这样虽然不能完全避免扫描,但至少能过滤掉大部分无差别攻击。
| 服务 | 默认端口 | 建议外部端口 | 协议 |
|---|---|---|---|
| DSM管理界面 | 5000/5001 | 15000/15001 | TCP |
| 文件站 | 7000/7001 | 17000/17001 | TCP |
| 影音站 | 9000/9001 | 19000/19001 | TCP |
| WebDAV | 5005/5006 | 15005/15006 | TCP |
端口映射配好之后,可以用手机流量测试一下。关掉WiFi,用手机浏览器访问home.yourdomain.com:15000,如果能打开DSM登录页面,说明映射成功了。如果打不开,先检查DDNS解析对不对,再检查端口映射,最后检查群晖防火墙。
4.2 反向代理:用一个端口访问所有服务
端口映射虽然能用,但每个服务都要记一个端口号,麻烦得很。而且端口开多了,安全风险也大。更好的办法是用反向代理,只开一个端口,比如443,然后通过不同的子域名访问不同的服务。
群晖自带反向代理功能,在控制面板的“登录门户”里,选“高级”,然后“反向代理服务器”。点“新增”,来源协议选HTTPS,主机名填dsm.yourdomain.com,端口填443。目的地协议选HTTP,主机名填localhost,端口填5000。这样访问https://dsm.yourdomain.com就会转发到群晖的DSM界面。
同样的方式,可以给文件站、影音站分别配子域名。file.yourdomain.com转发到7000,video.yourdomain.com转发到9000。这样你只需要在路由器上映射一个443端口,所有服务都能通过子域名访问,既方便又安全。
但反向代理有个前提:你需要泛域名解析。也就是说,*.yourdomain.com都要指向你的公网IP。Cloudflare支持泛域名解析,在DNS记录里添加一条A记录,名字填*,内容填你的公网IP就行。DDNS脚本更新的时候,只需要更新这一条泛域名记录,所有子域名都会跟着变。
注意:泛域名解析虽然方便,但也意味着任何人只要知道你的域名,就能尝试访问任意子域名。所以反向代理的每个服务都要配好认证,该设密码的设密码,该开二次验证的开二次验证。别觉得内网服务就不用管安全,一旦暴露到公网,风险就完全不一样了。
4.3 证书配置:让浏览器不再报错
用HTTPS访问的时候,如果证书不对,浏览器会弹一个大大的警告页面,看着就让人不放心。群晖自带的证书是自签名的,浏览器不认。要解决这个问题,得申请一个受信任的证书。
Let's Encrypt是免费证书的首选。群晖的“安全性”设置里有“证书”选项,可以自动申请Let's Encrypt证书。但有个前提:你的域名必须能通过80端口被访问到,因为Let's Encrypt验证域名所有权的时候会访问http://yourdomain.com/.well-known/acme-challenge/下面的文件。
如果你在路由器上把80端口映射到了群晖,那群晖就能自动完成验证。但很多运营商封了80端口,那就没法用HTTP验证了。这时候可以用DNS验证,也就是在DNS记录里添加一条TXT记录来证明域名所有权。群晖自带的证书申请不支持DNS验证,需要用第三方工具,比如acme.sh。
acme.sh是个纯Shell写的ACME客户端,支持DNS验证,可以跟Cloudflare API配合,自动添加和删除TXT记录。安装很简单,SSH登录群晖,跑一行命令就行。申请证书的时候指定用DNS验证,acme.sh会自动调用Cloudflare API完成验证。
# 安装acme.sh curl https://get.acme.sh | sh # 设置Cloudflare API export CF_Token="你的API_Token" # 申请证书 ~/.acme.sh/acme.sh --issue --dns dns_cf -d yourdomain.com -d *.yourdomain.com证书申请下来之后,需要部署到群晖。群晖的证书文件在/usr/syno/etc/certificate/下面,但直接替换可能会被系统覆盖。更稳妥的办法是用群晖的“证书”界面导入,把acme.sh生成的证书文件上传上去。然后设置反向代理的时候,选这个证书就行。
证书有效期是90天,acme.sh会自动续期。但续期之后需要重新部署到群晖,可以写个脚本,在acme.sh续期成功后自动复制证书文件到群晖的证书目录,然后重启相关服务。这个脚本可以加到计划任务里,每天跑一次检查。
5. 常见问题排查与避坑经验
5.1 DDNS更新失败排查速查表
DDNS用久了,总会遇到各种问题。下面这个表是我这几年踩坑总结出来的,基本覆盖了90%以上的常见故障。
| 现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 域名解析不到IP | DDNS脚本没跑 | 查日志文件 | 检查计划任务是否启用 |
| 解析到旧IP | 更新请求失败 | 查API返回错误 | 检查Token权限和Zone ID |
| 解析到内网IP | 获取IP的接口返回了内网地址 | 手动curl测试 | 换一个获取IP的接口 |
| 外网连不上 | 端口映射没配 | 手机流量测试 | 检查路由器端口转发 |
| 外网连不上 | 运营商封端口 | telnet测试端口 | 换端口或改用其他方案 |
| HTTPS报证书错误 | 证书过期或域名不匹配 | 浏览器查看证书详情 | 重新申请证书 |
| 更新频率太高被限流 | API调用超限 | 查Cloudflare后台 | 降低更新频率 |
排查的时候有个基本顺序:先确认DDNS解析对不对,再确认端口通不通,最后确认服务本身是否正常。很多人一上来就怀疑群晖配置,其实大部分问题出在网络层面。
5.2 那些年我踩过的坑
第一个坑是API Token权限给太大。刚开始图省事,直接用了Global API Key,结果有一次不小心把Token贴到了一个公开的论坛上,虽然马上删了,但还是吓得够呛。后来全部换成细粒度Token,只给单个域名的DNS编辑权限,心里踏实多了。
第二个坑是脚本没有错误处理。最早的脚本获取IP失败的时候会返回空字符串,然后脚本拿着空字符串去更新DNS,结果把好好的记录给清空了。后来加了判断,IP为空就跳过更新,并且记录日志。这个教训告诉我,任何跟网络相关的操作都要考虑失败的情况。
第三个坑是日志文件把磁盘写满。脚本每5分钟跑一次,每次都写日志,一个月下来日志文件好几个G,把群晖的系统分区撑满了,导致系统各种异常。后来加了日志轮转,只保留最近7天的日志,问题解决。
第四个坑是IPv6地址选错了。群晖上ifconfig能看到好几个IPv6地址,我一开始随便选了一个,结果外面怎么都连不上。后来才知道要选240e开头的公网地址,fe80开头的是本地链路地址,根本出不了路由器。
第五个坑是反向代理配了但忘了配WebSocket。群晖的某些服务,比如一些在线办公套件,用到了WebSocket。反向代理默认不转发WebSocket,导致页面能打开但功能不正常。后来在反向代理的高级设置里,把Upgrade和Connection头加上才解决。
5.3 稳定性优化:让DDNS长期可靠运行
DDNS这东西,配好只是开始,长期稳定运行才是关键。我总结了几个优化点,都是实际运行中验证有效的。
第一,多IP获取源。前面脚本里已经体现了,用三个不同的服务获取公网IP,任何一个挂了都不影响。我还会定期检查这些服务是否可用,如果某个服务连续失败,就把它从列表里去掉。
第二,更新频率要合理。太频繁了浪费资源还可能被API限流,太慢了IP变了半天不更新。我实测下来,IPv4每5分钟一次、IPv6每2分钟一次是比较平衡的设置。Cloudflare的免费版API限制是每分钟1200次请求,完全够用。
第三,监控和告警。脚本跑在后台,出问题了你不一定知道。可以加一个简单的告警机制,比如更新失败的时候发一封邮件,或者往某个Webhook发个消息。群晖自带的邮件通知就能用,在控制面板的“通知设置”里配好SMTP,脚本里调用synodsmnotify命令就能发通知。
第四,定期检查证书有效期。Let's Encrypt证书90天过期,虽然acme.sh会自动续期,但万一续期失败了呢?我一般会在日历上设个提醒,每两个月检查一次证书状态。或者写个脚本,每天检查证书剩余天数,少于15天就发告警。
第五,备份配置。DDNS脚本、计划任务、反向代理配置、证书文件,这些都要定期备份。群晖的“配置备份”功能可以导出系统配置,但脚本文件不在里面,需要手动备份。我一般把脚本放在/volume1/scripts/下面,然后定期用Hyper Backup备份这个目录。
6. 进阶玩法:DDNS还能这么用
DDNS配好之后,能玩的东西就多了。除了基本的远程访问,还可以做不少有意思的事情。
比如自动切换解析线路。如果你有多个宽带线路,可以写脚本检测哪条线路可用,然后自动把域名解析到可用的那条线路上。这个在双线接入的场景下特别有用,一条线断了自动切到另一条,外面访问基本无感知。
再比如配合Docker做服务发现。群晖上跑了一堆Docker容器,每个容器对应一个子域名。可以写个脚本监听Docker事件,容器启动的时候自动在Cloudflare添加对应的DNS记录,容器停止的时候自动删除。这样新部署一个服务,域名自动就配好了,完全不用手动操作。
还有DDNS + 内网穿透的组合。如果你没有公网IP,DDNS确实用不了,但可以配合内网穿透工具实现类似效果。不过内网穿透的稳定性和速度通常不如直接DDNS,适合作为临时方案或者备用方案。
我目前还在用的一个玩法是DDNS + 自动化脚本做家庭网络的动态监控。脚本每次更新IP的时候,顺便记录一下当前网络状态,比如延迟、丢包率这些。时间长了就能看出网络质量的趋势,什么时候网络变差了、什么时候运营商调整了线路,一目了然。
这些进阶玩法都需要一定的脚本能力,但核心逻辑都是一样的:获取信息、判断条件、执行动作。把基础的DDNS脚本吃透了,这些扩展就是在这个框架上加东西而已。
最后分享一个我用了很久的小技巧:在群晖的登录门户里设置一个自定义的欢迎页面,把常用的服务链接都放在上面。这样不管你在哪里,打开home.yourdomain.com就能看到所有服务的入口,点一下就能跳转,比记一堆子域名方便多了。这个页面可以用群晖自带的Web Station托管,就是一个简单的HTML文件,改起来也容易。