VPS 搭建 DDNS 动态域名解析:家庭宽带 / 异地访问不求人(2026)

家庭宽带 IP 总变导致无法远程访问?本文讲清什么是 DDNS、为什么用 VPS 自建(对比花生壳/No-IP),用 ddns-go 或 Cloudflare API 脚本自动更新解析,并结合 VPN/内网穿透安全访问家里 NAS。

延伸阅读

更多相关攻略推荐:泛域名 SSL 证书自动化避坑:Acme.sh + DNS API BGP 是互联网的"高德地图":打开网页时,数据是这样找路的【优化线路 02】BGP / AS4837 常规线路年付 10 美元高级玩家玩出花:如何在 VPS 上广播自己的 IP 地址?BYOIP计算机科学两大难题之一:缓存失效与 CDN 瞬时刷新奥秘

一、什么是 DDNS(动态域名解析)?

DDNS 是 Dynamic DNS 的缩写。普通 DNS 只是域名到 IP 地址的静态映射:一旦 IP 变了,DNS 不会自己改,于是外界按老地址就找不到你了。DDNS 在 DNS 之上加了一个“自动更新”环节——一个常驻在路由器、NAS 或小主机上的客户端,每隔几分钟检测一次本机公网 IP,一旦发现变化,就调用 DNS 服务商的 API,把域名对应的 A 记录(IPv4)或 AAAA 记录(IPv6)改写成新地址。这样别人始终用同一个域名就能找到你,完全不用去记那个会变的 IP。

技术层面,动态更新协议在 RFC 2136 中定义,并用 TSIG 密钥做鉴权;家用场景里更常见的是各家 DNS 服务商提供的 RESTful HTTPS API(Token 鉴权)。DDNS 客户端大多内置于路由器固件,也可以装成软件。它解决的不是“能不能上网”,而是“别人如何用固定名字找到我这台 IP 会变的主机”。

为什么家庭宽带特别需要它?因为国内三大运营商给家庭宽带分配的基本都是动态公网 IPv4——拨号、重启光猫、甚至运营商侧重拨都会换;部分小区更是直接给内网 IP(CGNAT)。如果你想像在工位一样,从外地 SSH 回家里的 NAS、看监控摄像头、或跑一个自己的小网站,IP 一变就全断了。DDNS 就是那个“永远指向最新地址”的指针。

二、为什么不直接用花生壳 / No-IP,而要自己用 VPS 搭?

花生壳、No-IP、DuckDNS 这类第三方 DDNS 确实省事:注册就有现成二级域名,客户端一键装。但它们的“免费”都有明确边界,长期用并不自由:

  • 花生壳:免费体验版每月仅 1GB 流量、单映射 1Mbps 带宽、只有 2 条基础内网映射,免费壳域名不带 HTTPS,自定义顶级域名要付费;想稳定高带宽得买专业版(年费 99 元起)。
  • No-IP:免费版通常只有 1 个主机名(部分渠道可到 3 个),必须每 30 天手动确认一次,否则主机名被停用,而且页面带广告、不能绑自己的域名。
  • DNSPod / 腾讯云 / 阿里云:严格说它们不是“免费 DDNS 服务商”,而是你买域名后使用的 DNS 托管。用它们做 DDNS 没问题,但 API 权限要管好,且域名年费照交。

自己“用 VPS 搭”的精髓,是把域名、解析、更新三件事都攥在自己手里:域名托管在 Cloudflare(免费、自带全球 CDN 与 HTTPS);更新程序跑在一台你控制的常驻机器上(家里 NAS,或一台年付二三十元的境外 VPS);解析记录用 API 自动改。好处是:不限制流量与带宽、能用自己喜欢的顶级域名、没有 30 天确认和广告、Token 可做到最小权限、随时能换 DNS 服务商。唯一代价是花点时间配置——而 ddns-go 已把这件事简化到“网页点几下”。

这里说的 VPS 有两个角色:一是作为 7×24 在线的“控制面”与隧道服务器——当你家里没有公网 IPv4 时,VPS 充当 frp / WireGuard 的中转入口;二是作为你域名的稳定锚点(VPS 本身有静态公网 IP,跑 ddns-go 管理多个子域名的解析也很顺手)。无论哪种,核心都是“不把远程访问的命根子交给第三方限制”。

三、两种自建方案总览:ddns-go 图形化 vs 直接调 DNS API 脚本

自建 DDNS 主要两条路:

  • 方案 A:ddns-go(图形化,推荐新手)。一个用 Go 写的开源小工具(GitHub:jeessy2/ddns-go),单文件、跨平台,支持阿里云、腾讯云/DNSPod、Cloudflare、华为云、百度云、Porkbun、GoDaddy、Namecheap、NameSilo、Vercel、Dynadot 等 30 多家 DNS 服务商。它有 Web 管理界面(默认端口 9876),配置完自动检测 IP 并定时更新 A / AAAA 记录,还支持 Webhook、邮件、Telegram 通知。最新版本已到 v6.x 系列。
  • 方案 B:直接调用 DNS 服务商的 API 脚本。不装任何额外程序,写一个几行的 Shell / Python 脚本,用 curl 调 Cloudflare(或阿里云、腾讯云)的 API 更新解析,再用 crontab 或 systemd timer 定时跑。适合喜欢极简、想完全掌控、或在路由器/嵌入式设备上跑的人。

简单说:想省事、要图形界面和通知,选 ddns-go;想零依赖、跑在任意角落,选 API 脚本。下面分别给出可操作的步骤。

四、先确认你家宽带有没有公网 IP(IPv4 / IPv6 与运营商限制)

动手前先搞清楚“手里有几张牌”。方法很简单:

  • 登录路由器看 WAN 口 IP,再去 ip.cn 或 ip138.com 看网页识别到的公网 IP;两者一致说明你有公网 IPv4;不一致说明运营商做了 NAT(CGNAT),你拿到的是内网 IP,外部无法直接连进来。
  • 在终端跑 ip -6 addr show | grep inet6.*global,若出现以 2xxx 或 240x(国内常见 2408 / 2409 / 240a)开头的地址,说明你有公网 IPv6。

现实情况:IPv4 地址总量约 43 亿早已分配殆尽,运营商把公网 IPv4 当稀缺资源,新装宽带常常默认给内网 IP,部分地区(尤其移动)要打电话向装维申请“公网 IPv4”才可能放开,甚至要付费。相比之下,IPv6 地址空间约 3.4×10^38,近乎无限,三大运营商现在基本都下发公网 IPv6,而且免费、无需申请。所以 2026 年最稳的策略往往是优先用 IPv6 做 DDNS,IPv4 作为补充。

注意:即使有公网 IPv4,很多地区重启光猫或重新拨号就会换 IP,这正是 DDNS 存在的意义。IPv6 虽是“公网且相对固定”,但有些运营商也会定期重拨导致前缀变化,因此同样建议上 DDNS。

五、方案 A:用 ddns-go 五分钟跑起来

最通用的装法是 Docker(群晖、飞牛、Linux 小主机、甚至小米路由器都行):

docker run -d --name ddns-go   --restart=always   -p 9876:9876   -v /opt/ddns-go/data:/root   jeessy/ddns-go:latest

跑起来后浏览器访问 http://内网IP:9876 进入 Web 配置。第一次务必设置登录密码(强密码,12 位以上,含大小写、数字、符号),否则任何人都能改你的 DNS。接下来三步:

  • 选 DNS 服务商并填凭证。以 Cloudflare 为例:登录 Cloudflare → My Profile → API Tokens → Create Token → 选 “Edit zone DNS” 模板 → 限定到你的具体域名 → 生成 Token 粘贴进去。阿里云/腾讯云则填 AccessKey/SecretId,强烈建议用子账号并只给 DNS 权限,绝不用主账号密钥
  • 配置 IPv4 / IPv6。获取 IP 方式默认“通过接口获取”即可(如 https://ip.sbhttps://4.ipw.cn);若要解析 IPv6,建议“通过网卡获取”,这样能拿到真实的公网 IPv6 而非隧道地址。Docker 下想正确获取 IPv6 建议用 network_mode: host
  • 填域名。Domains 里每行一个,例如 nas.example.comhome.example.com;记录类型选 A(IPv4)或 AAAA(IPv6)。

保存后 ddns-go 默认约每 5 分钟检测一次公网 IP,发现变化才调用 API 更新,平时只做比对、不频繁写。日志里能看到“IPv4 未改变”或“已更新”的提示。更新成功后,外网就能用 http://nas.example.com:端口 访问家里服务。

六、方案 B:直接调用 Cloudflare API 的更新脚本

如果你不想装 ddns-go,或者设备太弱跑不动容器,一个几十行的脚本就够。思路是:拿到本机最新 IP → 查到该域名在 Cloudflare 的记录 ID → 用 PUT 把 content 改成新 IP。核心 API 调用如下(Bearer Token 方式,最小权限):

# 取本机公网 IPv4(无公网 IPv4 时这段可省略)
IPV4=$(curl -4 -s https://ifconfig.me)
# 查 Zone ID(你的域名)
ZONE_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=example.com&status=active"   -H "Authorization: Bearer $TOKEN" | python3 -c "import sys,json;print(json.load(sys.stdin)['result'][0]['id'])")
# 查 A 记录 ID
REC_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?type=A&name=nas.example.com"   -H "Authorization: Bearer $TOKEN" | python3 -c "import sys,json;print(json.load(sys.stdin)['result'][0]['id'])")
# 更新记录
curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$REC_ID"   -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json"   --data "{"type":"A","name":"nas.example.com","content":"$IPV4","ttl":1,"proxied":false}"

说明几点:ttl:1 表示交给 Cloudflare 用自动(很短)的 TTL,避免旧 IP 被缓存;proxied:false 是直连(不走 CDN),若要隐藏源站、上 HTTPS 可设 true。记录不存在时可改用 POST 新建。这段逻辑对 AAAA(IPv6)完全一样,只是 type 换成 AAAA、IP 用 curl -6 获取。实际部署时建议把 Token 写进独立文件并 chmod 600,别硬编码进公开仓库。

七、让更新自动运行:定时任务与最小权限 Token

脚本写好后要“自动跑”。两种可靠方式:

  • crontabcrontab -e 里加 */5 * * * * /usr/local/bin/ddns-update.sh,即每 5 分钟执行一次。脚本本身会先比对“当前 IP 是否等于 DNS 里的 IP”,没变就直接退出,所以频繁跑不会刷爆 API。
  • systemd timer:比 crontab 更可观测、可记录日志、失败能重试,服务器上更推荐。写一个 ddns-update.service 加一个 ddns-update.timerOnUnitActiveSec=5min)即可。

关于 API Token 的权限,务必遵循“最小权限”:

  • Cloudflare:用 “Edit zone DNS” 模板,权限只给 Zone:Zone:ReadZone:DNS:Edit,Zone 资源限定到具体域名,不要用 Global API Key。
  • 阿里云/腾讯云:建子账号/RAM 用户,只授权 DNS 相关策略(如 AliyunDNSFullAccess 或更小的自定义策略),绝不用主账号 AccessKey。

这样即便 Token 泄露,对方最多改你这一个域名的解析,掀不起大浪。

八、结合 VPN / 内网穿透,安全访问家里 NAS 与摄像头

DDNS 解决“找得到”,但不解决“连得安全”。把 NAS 管理页、SSH、摄像头直接暴露在公网端口上是危险做法。推荐两种更稳妥的访问方式:

  • VPN 优先:在 VPS 或家里路由器上起一个 WireGuard / OpenVPN / Tailscale / ZeroTier,把手机、笔记本和家里设备组进同一个虚拟局域网。外出时先连 VPN,再用内网地址(如 192.168.1.50:5000)访问 NAS,全程加密、不暴露任何端口给公网。DDNS 只用来解析 VPN 服务端(或家里)的入口地址。
  • 内网穿透(无公网 IPv4 时):家里没有公网 IPv4,可让 VPS 跑 frp 服务端、家里跑 frp 客户端,把 NAS 端口通过 VPS 中转出去。缺点是所有流量走 VPS 带宽,且 VPS 上下行会成为瓶颈;因此 frp 通常作为“没有公网 IP 时的备选”,有公网 IP/IPv6 时还是直连更快。
  • 纯 IPv6 直连:若家里和外网设备都支持 IPv6,DDNS 解析到公网 IPv6 后可端到端直连,无需路由器端口转发、也无需 NAT66;只要在 NAS 防火墙放行对应端口即可,比 IPv4 更简洁。

安全清单(务必照做):ddns-go 的 9876 管理端口绝不映射到公网,只在局域网或用 VPN 访问;Web 登录用强密码并开启双因素;NAS 启用 HTTPS(Let's Encrypt 免费证书)和登录失败封锁;SSH 禁用密码、只用密钥;在防火墙/Cloudflare 上限制可访问国家/来源 IP。记住:便利永远排在安全之后。

#DDNS #动态域名 #VPS自建 #IPv6 #家庭NAS