
很多个人站长和中小团队在建站时都会遇到同一个问题:服务器在自己手里,域名也买了,但宽带运营商分配的是会变化的公网 IP。今天网站访问正常,第二天路由器重启后 IP 一变,域名解析还指着旧地址,网站就”失联”了。请运营商追加固定 IP 往往成本高、流程慢,对多数轻量建站场景并不划算。
这篇文章会教你如何用动态 DNS(Dynamic DNS,简称 DDNS,一种自动跟踪 IP 变化并更新域名解析记录的技术)解决这个问题。我们会讲清楚它的工作原理、三种主流搭建方案的取舍,以及客户端自动更新的完整配置过程,帮助你即使没有固定 IP,也能让域名始终指向正确的服务器地址,保持网站持续可访问。
如果你正准备在一台 VPS(虚拟专用服务器) 或家庭宽带下的自建服务器上部署网站,这套方案同样适用,因为 DDNS 解决的是”域名跟着 IP 走”这一层问题,与服务器本身在哪没有关系。
动态 DNS 的工作原理
要理解 DDNS,先要看清普通 DNS(域名系统,负责把域名翻译成 IP 地址的网络服务)的解析链路:用户在浏览器输入域名后,递归 DNS 服务器会向权威 DNS 服务器查询 A 记录(域名到 IPv4 地址的映射),拿到 IP 后再建立连接。这条链路里,A 记录是静态的——谁改了它,全网生效需要等 TTL(解析记录的缓存存活时间)过期。
DDNS 做的事情,就是把”人工修改 A 记录”变成”程序自动修改”。它的工作循环分三步:
- 部署在你服务器上的 DDNS 客户端定期检测当前公网 IP(比如每 5 分钟请求一次外部探测服务
ifconfig.me); - 客户端对比检测到的 IP 与上一次上报的 IP,发现变化后,携带 API 密钥调用域名服务商的解析 API;
- 服务商更新 A 记录并把 TTL 设得很短(常见 60 秒),全网缓存在一分钟内刷新,域名重新指向新 IP。
整个切换过程通常在 1-2 分钟内完成,对访问者来说只是短暂的解析失败重试,不需要任何人工介入。这也是为什么大量家用监控、NAS 远程访问、自建邮件服务都依赖这套机制。

三种主流方案怎么选
落地 DDNS 有三条路,各自的成本、可控性和维护量差别明显,先按场景对号入座再动手。
方案一:域名服务商自带 DDNS。 Cloudflare、阿里云、DNSPod 等主流服务商都提供免费的解析 API,配合开源客户端(如 ddns-go、cloudflare-ddns)即可实现自动更新。以 ddns-go 为例,它支持同时更新 IPv4 和 IPv6 记录,单个二进制文件部署,没有额外依赖。这是个人建站最推荐的起点:零成本、组件少、出问题容易排查。
方案二:路由器内置 DDNS 功能。 华硕、TP-Link、小米等主流路由器的管理后台都有 DDNS 设置页,绑定服务商账号后由路由器上报 IP。优点是不占用服务器资源、路由器拨号层拿到的 IP 最准确;缺点是可配置的解析服务商受固件限制,TTL 和更新策略无法自定义,路由器更换后需要重新配置。
方案三:自建 DDNS 服务端。 用 BIND(Linux 上最老牌的 DNS 服务器软件)配合 nsupdate 工具,在自己控制的服务器上同时充当权威 DNS 和更新接收端。这条路可控性最强,适合有多条宽带、多个域名需要统一管理的场景;但你要自己维护 DNS 服务的可用性——权威 DNS 挂了,所有解析一起失效,维护成本明显更高。
三条路线都遵循同一个原则:客户端检测 IP、API 更新记录、短 TTL 加速生效。对绝大多数只有一个域名、一两台服务器的站长,我们建议从方案一起步,后续规模扩大再考虑方案三。如果你的建站计划本身就托管在 Hostease 虚拟主机 或云服务器(通过云端资源按需提供的虚拟服务器)上,静态 IP 由服务商直接分配,DDNS 这一层可以完全省掉。
实操:用 ddns-go 搭建自动更新
下面以方案一中最常见的组合为例:域名解析托管在 Cloudflare,服务器是 Linux,客户端用 ddns-go。整个过程 15 分钟左右可以完成。
第一步,安装客户端。 在服务器上执行:
sudo apt install ddns-go
Ubuntu 24.04 的官方仓库已收录 ddns-go;如果你的发行版没有这个包,可以从项目的 GitHub Releases 页面下载对应架构的单文件二进制,放到 /usr/local/bin/ 下即可,没有其他依赖。
第二步,配置解析服务商。 先到 Cloudflare 控制台创建一个 API Token,权限只勾选”编辑 Zone DNS”,作用域限定到你的域名,避免使用权限过大的 Global API Key。然后启动服务并打开本地管理页:
sudo systemctl enable --now ddns-go
浏览器访问 http://127.0.0.1:9876(远程服务器可先用 SSH 隧道转发端口),在配置页选择 Cloudflare,填入 Token,添加要更新的域名记录,比如 home.example.com。IP 获取方式建议选”通过接口获取”,由客户端主动查询外部地址,避免 NAT 环境下拿到错误的内网 IP。
第三步,验证自动更新是否生效。 手动把该域名的 A 记录改成一个错误地址(例如 1.1.1.1),等待客户端的下一个检测周期(默认 300 秒),再用 dig 查询:
dig +short home.example.com
返回值重新变回你当前的公网 IP,说明检测、上报、更新整条链路已经打通。建议同时把 TTL 保持默认的 600 秒以内,切换越快,网站中断窗口越短。

避坑清单:这些问题最常见
方案选对、客户端装好,不代表从此高枕无忧。以下是实际部署中反馈最集中的四类问题,逐条给出判断方法和处理方式。
第一,拿到的是内网 IP。 如果 ddns-go 日志里上报的地址是 100.64.x.x 或 10.x.x.x 这类私有段,说明运营商把设备放在了 CGNAT(运营商级 NAT,多人共享公网 IP 的组网方式)后面。这种情况下 DDNS 更新得再勤也没用——公网流量根本到不了你的服务器。判断方法:路由器 WAN 口 IP 与 curl ifconfig.me 返回值不一致,基本可以确认。解法是联系运营商申请公网 IP(通常免费,打客服电话即可),或者改用反向代理、内网穿透类方案承载对外服务。
第二,HTTPS 证书签发失败。 很多站长给 DDNS 域名配 Let’s Encrypt 证书时遇到验证失败,原因是 Let’s Encrypt 对同一域名有每小时 5 次的签发频率限制,测试阶段反复删除重建证书很快就会触顶。建议先用 staging 环境验证流程跑通,确认无误后再切正式签发,一张证书有效期 90 天,配合 certbot 的自动续期完全够用。
第三,解析更新成功但访问仍不通。 dig 已经返回新 IP,浏览器却还是打不开,此时问题多半不在 DNS,而在服务器侧:防火墙(如 ufw)没放行 80/443 端口、Web 服务没有监听公网地址、或者宽带运营商封禁了家庭宽带的入站 80 端口。按”端口、监听、防火墙、运营商”四层顺序排查,每一层用 ss -tlnp、ufw status 等命令逐项确认。
第四,多客户端抢更新。 有些用户同时在路由器和服务器上各跑一个 DDNS 客户端,两边检测到的 IP 不一致时会互相覆盖,造成记录反复跳变。原则很简单:一个域名只保留一个更新源,其余全部停掉。想要冗余,可以间隔错开检测周期,而不是同时上报。

另外提醒一点:DDNS 域名会暴露你的家庭或办公网络入口,安全配置不能省。SSH 改用密钥登录并禁用密码认证,管理后台只允许特定 IP 访问,Web 服务前面加一层 fail2ban 拦截暴力破解。域名指向哪里可以被扫描到,但门锁必须在自己手里。如果你想系统性加固服务器,可以参考我们之前的 服务器安全加固指南。
总结:按这个顺序落地
回顾一下全文的路径:先确认你的网络环境是否真的需要 DDNS(公网 IP 会变、又无法低成本换成固定 IP),再从域名服务商 API + ddns-go 这条最省心的路线起步,最后用”改错记录等自动纠正”的方式验证整条链路,把 CGNAT、证书限频、端口放行这几类高频坑位提前排掉。
给你的行动建议按优先级排列:
- 立即做:用
curl ifconfig.me和路由器 WAN 口 IP 对比,确认自己是否在 CGNAT 后面; - 本周做:创建最小权限的解析 API Token,部署
ddns-go并完成首次自动更新验证,TTL 控制在 600 秒以内; - 长期做:为 DDNS 域名配上 SSH 密钥登录、防火墙白名单和 fail2ban,把暴露面收窄到业务必需的端口。
如果验证过程中发现家庭宽带的上行带宽(网络线路同时向外传输数据的最大速率)或入站限制确实撑不起对外服务,也可以考虑把网站迁移到带固定 IP 的 独立服务器 上,DDNS 依然可以作为备份通道保留。更多建站与运维的实操内容,欢迎持续关注 Hostease 官方博客。