在 Mac mini 上部署 DDNS 的一次整理记录

最近在整理家里的 Mac mini 服务器时,顺手把 DDNS 也部署好了。这样即使家里的公网 IP 发生变化,外部访问用的域名也能自动更新到新的地址,不需要每次手动登录 DNS 控制台修改解析记录。

这篇文章记录一下部署思路:为什么需要 DDNS,脚本做了哪些事情,后台任务怎么运行,以及部署过程中需要注意的密钥和网络问题。出于安全考虑,文中不写真实域名、账号、本机路径、日志路径和具体公网 IP。

为什么需要 DDNS

家庭宽带即使有公网 IP,也通常不是长期固定的。路由器重拨、光猫重启、运营商调整线路后,公网 IP 都可能变化。

如果家里的 Mac mini 承担远程访问、SFTP 文件传输或其他家庭服务器任务,外部访问就需要一个稳定入口。手动记录公网 IP 不现实,最合适的方式就是用 DDNS:定时检测当前公网 IP,如果发现变化,就自动更新 DNS 解析。

整体方案

这次采用的方案是:Mac mini 上运行一个本地脚本,定时获取当前公网 IPv4 地址,然后调用 DNS 服务商的 API 检查域名 A 记录。如果解析记录已经是当前 IP,就不做任何修改;如果解析记录还是旧 IP,就调用接口更新。

整体流程可以概括为:

  1. Mac mini 定时运行 DDNS 脚本;
  2. 脚本访问公网 IP 检测服务,获取当前出口 IPv4;
  3. 脚本调用 DNS 服务商接口,读取当前 A 记录;
  4. 如果 A 记录和当前公网 IP 一致,就记录为 unchanged;
  5. 如果 A 记录和当前公网 IP 不一致,就更新解析记录;
  6. 每次运行都写入正常日志或错误日志,方便后续排查。

脚本负责做什么

DDNS 脚本主要做四件事。

第一,读取配置文件。配置文件里放 DNS 服务商的 AccessKey、要更新的域名、主机记录、记录类型和 TTL。密钥不写进脚本,避免以后维护脚本时误把密钥发出去。

第二,获取当前公网 IPv4。脚本会请求一个公网 IP 检测服务,从返回内容里提取 IPv4 地址,并做基本格式校验,避免拿到异常内容后直接写进 DNS。

第三,查询当前 DNS 解析记录。脚本会调用 DNS 服务商 API,读取指定子域名当前的 A 记录。如果记录不存在,就创建记录;如果记录存在,就继续比较 IP。

第四,只在 IP 变化时更新。这个逻辑很重要:公网 IP 没变时,脚本只写一条“未变化”的日志,不反复调用更新接口。这样日志更清楚,也减少不必要的 API 操作。

密钥配置要单独放

这类脚本最需要注意的是密钥管理。DNS 服务商的 AccessKey 拥有修改解析记录的权限,如果泄露,别人就可以篡改域名指向。

我的处理方式是:

  • 脚本和密钥配置分开保存;
  • 配置文件放在用户配置目录,不放到公开目录;
  • AccessKey 使用专用 RAM 用户,不复用主账号;
  • 这个 RAM 用户只用于 DDNS,不拿去做其他事情;
  • 不把密钥 CSV、配置文件或日志原文发到聊天、网盘或公开仓库。

如果以后怀疑密钥泄露,正确处理方式不是改脚本,而是到 DNS 服务商或云厂商控制台禁用旧 AccessKey,重新创建一个权限更小的新密钥,再更新本机配置。

用 macOS 后台任务定时运行

脚本本身只能完成一次检查,要让 DDNS 长期生效,还需要把它交给 macOS 的后台任务机制定时运行。

这次设置为每 10 分钟运行一次,并且在用户登录后自动启动。后台任务会把标准输出写入正常日志,把错误信息写入错误日志。这样平时不用盯着它,只要需要排查时打开日志即可。

正常情况下,日志里会出现两类结果:

  • unchanged:当前解析记录已经指向最新公网 IP,不需要更新;
  • updated:公网 IP 发生变化,脚本已经把 DNS 记录更新为新地址。

这个日志设计很实用。日常看到 unchanged,说明系统在正常运行;偶尔看到 updated,说明公网 IP 确实变化过,并且自动更新成功。

代理软件带来的一个坑

DDNS 脚本获取公网 IP 时,一定要拿到家里宽带的真实出口 IP,而不是代理软件的出口 IP。如果 Mac mini 上运行了代理、分流或透明代理工具,公网 IP 检测请求可能会走代理。

如果拿到的是代理出口 IP,DDNS 就会把域名解析到错误地址,外部访问自然会失败。因此公网 IP 检测服务建议走直连规则,确保脚本检测到的是家庭宽带当前公网 IP。

测试和验证

部署完成后,我按三个层次验证。

  1. 先手动运行脚本,确认能读取配置、获取公网 IP,并成功访问 DNS API;
  2. 再查看日志,确认脚本能输出 unchanged 或 updated;
  3. 最后等待后台任务自动运行,确认它能按计划持续执行。

另外,测试外网访问时不要只在家里 Wi-Fi 下测试自己的域名。有些路由器对内网回环支持不好,人在家里访问自己的外网域名,结果可能和真正的外网访问不一样。更可靠的测试方式是让手机关闭 Wi-Fi 使用蜂窝网络,或者让电脑连接手机热点再测试。

维护时需要记住的几件事

DDNS 部署好以后,平时不需要频繁维护,但有几件事要记住:

  • 改域名、主机记录或 TTL 时,要同步更新配置文件;
  • 更换 DNS 服务商或云账号时,要重新配置 API 权限;
  • 如果日志长时间没有更新,要检查后台任务是否仍在运行;
  • 如果日志连续报错,要先看是网络问题、接口认证问题,还是公网 IP 检测失败;
  • 不要把密钥配置文件、真实日志和完整命令贴到公开地方。

小结

这次在 Mac mini 上部署 DDNS,本质上是把一个“手动改解析”的动作变成了稳定的自动任务:脚本负责检测和更新,配置文件负责保存参数,后台任务负责定时运行,日志负责留下可排查的证据。

家庭服务器要长期可用,域名解析这一步不能靠记忆和手工操作。DDNS 部署好以后,公网 IP 变化不再是远程访问中断的主要风险,后续只需要关注密钥安全、日志状态和实际外网访问是否正常。