在 pfSense 上运行 FastDDNS 的两种方法
您的主机名面板提供两种设置。方法 2将 FastDDNS 添加到内置的 Services > Dynamic DNS 客户端,作为 Custom 提供商——这是长期使用时应保留的方法,因为 pfSense 会将其存储在配置中并进行备份。方法 1是在 shell 中粘贴一行脚本,安装一个每两分钟运行一次的 cron 任务。它会立即生效,但 pfSense 不会管理该任务。
下面的编号遵循面板中的标签,而不是我们推荐的顺序。长期使用请设置方法 2;如果您想立即发送更新而不必在表单中逐项操作,请使用方法 1。
| 方法 2 — 内置 DDNS 客户端 | 方法 1 — crontab 脚本 | |
|---|---|---|
| 操作位置 | Web UI 中的 Services > Dynamic DNS | Diagnostics > Command Prompt,或通过 SSH |
| 保存在 pfSense 配置中 | 是 | 否 — 见下方的限制 |
| 配置恢复或重新安装后仍然保留 | 是 | 否 |
| 发送更新的时机 | 监控的接口地址发生变化时,以及每天重新检查一次 | 每 2 分钟一次,不受其他条件影响 |
| 设置所需工作量 | 七个字段,其中四个需要从面板复制 | 粘贴一次 |
| 适用于 | 长期使用的设置 | 立即进行第一次更新,或快速测试 |
开始之前
四件事情,其中两件决定远程访问是否可行。
- 一个 FastDDNS hostname。 在 FastDDNS,然后打开它并滚动到 DDNS Configuration Parameters > Firewall pfSense。
- pfSense web 界面的管理员访问权限,如果计划使用方法 1,则还需 shell 访问权限。
- WAN 接口上的真实公网 IP。 如果你的 ISP 将你置于运营商级 NAT 后面,动态 DNS 将无济于事——hostname 将指向一个外部无人可达的地址。在 pfSense 仪表板上检查 WAN 地址,或在 FastDDNS移动应用中运行 CGNAT 检查器。
- 防火墙和 NAT 规则,以便访问你想要到达的任何内容。 DDNS 只是保持名称指向正确的地址;访问方式仍由你负责。之后用 端口检查确认。
在 pfSense 仪表板上,如果 WAN 接口的地址在 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 或 100.64.0.0/10 范围内,这意味着上游设备正在做 NAT。100.64.0.0/10 范围是为运营商级 NAT 保留的。
方法2 — 将FastDDNS添加为自定义动态DNS客户端
这是值得保留的设置。pfSense 将其存储在 config.xml 中,因此在恢复配置时会重新出现,并且在重新安装后仍然有效。
步骤 1 — 从你的 hostname 面板复制更新 URL
打开你的主机名,滚动到 DDNS Configuration Parameters 并展开 Firewall pfSense。两种方法所需的全部信息都在该面板中:

复制 Method 2 下的 更新 URL 框。它已经包含了你的主机名和凭据:
https://client.fastddns.net/?hostname=myhome.fastddns.net&user_name=YOUR-USERNAME&user_pass=YOUR-UPDATE-PASSWORD大写的三个值代表你账户中的私密信息——面板会自动为你填写。
第 2 步 — 打开 Dynamic DNS 客户端
在 pfSense 网页界面中,转到 Services > Dynamic DNS 并点击 + 添加。
第 3 步 — 填写字段
| 字段 | 值 | 原因 |
|---|---|---|
| Service Type | Custom |
FastDDNS 不在内置提供商列表中,而且也不需要 |
| Interface to Monitor | WAN |
应触发更新的接口地址 |
| Hostname | 你的 FastDDNS hostname | 更新 URL 中已经包含它,因此对于 Custom 类型,这主要是你在列表中看到的标签 |
| Update URL | 第 1 步中的 URL | 将其完整粘贴。无需替换 %IP% —— FastDDNS 会记录请求来源的地址 |
| Force IPv4 DNS Resolution | 已选中 | 仅通过 IPv4 解析更新主机,因此 FastDDNS 记录的地址是你的 IPv4 WAN 地址,而不是 IPv6 地址 |
| Result Match | 留空 | pfSense 会将此值与完整回复进行比较。FastDDNS 在发生更改后回复 good,没有变化时回复 nochg,因此没有一个固定字符串能同时匹配两种情况——面板自身的说明没有设置此项 |
| Description | FastDDNS.net |
自由文本,供你自行参考 |

第 4 步 — 保存,然后查看状态列
点击 保存并强制更新。回到 Services > Dynamic DNS 列表中,缓存的 IP 列应显示您当前的 WAN 地址。若条目为空,或在强制更新后仍保持过时,则表示更新未成功——下方的故障排除表会说明原因。
需要理解这一方法的一点是:它由事件驱动,而不是每两分钟一次的心跳。Netgate 记录该服务会在接口地址发生变化时更新
,并且 pfSense 还默认提供一个每天 01:01 运行 /etc/rc.dyndns.update 的 cron 条目作为安全保障。因此,更新失败时会被重试——只是不会在几分钟内完成。当您需要立即更新时,请使用 保存并强制更新。
如果您更愿意从自己的脚本调用相同的端点,这些参数在FastDDNS 客户端 API 页面上有文档说明。
下面的演示录制较早,因此面板与此处的截图看起来不同。字段和步骤顺序相同。
方法 1 —— 一行 crontab 脚本
第 1 步 —— 从您的主机名面板复制脚本
在同一个 Firewall pfSense 面板中,复制 Method 1 下方的文本框内容。这是一行围绕相同更新 URL 构建的命令:
((crontab -l >/dev/null && crontab -l | grep -i "client.fastddns.net") || ((crontab -l; echo '*/2 * * * * fetch "URL" -o /dev/null || curl -s "URL"') | crontab -; fetch "URL" -o /dev/null || curl -s "URL"; printf "\n\nAdded Dynamic DNS Script to crontab successfully\n\n"; exit 1;)) && printf "\n\nFastDDNS is available \n\n";在实际命令中,上面的每个 URL 都是方法 2 第 1 步中的完整更新 URL。请直接从面板复制,不要手动拼接。

第二步——运行它
将这一行粘贴到 Diagnostics > Command Prompt中的 执行壳命令框内,然后按 执行。使用 SSH 会话或在控制台选择选项 8 也同样可以。
Netgate 针对该页面的警告同样适用:它会以完全的权限运行您粘贴的任何内容,错误的命令可能导致防火墙无法使用。请只粘贴面板中的这一行,不要粘贴其他内容。命令还必须执行完毕并返回——这一行可以做到这一点,因此可在此处安全运行。
第三步——这两条消息的含义
在输出末尾查找以下两行之一。它们表示不同的含义:
| 消息 | 发生了什么 |
|---|---|
| Added Dynamic DNS Script to crontab successfully | crontab 中没有 FastDDNS 条目,因此已添加条目并立即发送了更新 |
| FastDDNS is available | 条目已经存在,因此未进行任何更改 |
检查只是一个简单的 grep,用于在整个 crontab 中查找 client.fastddns.net。这样可以防止你重复安装任务,但也意味着,如果你在同一台防火墙上添加第二个主机名,脚本会看到第一个并拒绝添加任何内容。第二个主机名需要手动添加其 cron 行。
这也解释了为什么第二次运行时会打印多行:其中一行是匹配结果,而匹配到的行是包含完整更新 URL(包括用户名和密码)的 cron 条目。如果你是在他人的环境旁运行命令,或将输出粘贴到工单中,请先删除这一行。
计划任务行本身运行的是 fetch,这是 pfSense 随 FreeBSD 提供的下载器;如果失败,则回退到 curl。
第 4 步 — 在依赖它之前需要了解的限制
pfSense 将自己的计划任务保存在 config.xml 中,并从那里重建系统 crontab。使用 crontab - 添加的任务则位于 root 用户的 crontab 中。pfSense 不管理该 crontab,也不会将其包含在配置备份中。由此会产生两个后果:
- 恢复配置或重新安装防火墙后,该任务不会保留;而方法 2 的 Dynamic DNS client 会保留。
- 如果 System > Advanced > Miscellaneous为
/tmp和/var启用了 RAM 磁盘,root crontab 就位于 RAM 中。Netgate 文档指出,从这些 RAM 磁盘重启后,只有 RRD 数据、DHCP 租约、日志和 Captive Portal 数据会保留;crontab 不在其中。
这些都不意味着方法 1 是错误的。它适合让更新在 现在 生效,但不适合让它运行一年。如果你想使用 pfSense 真正会保留的 cron 任务,请安装 Cron 包,并通过它添加相同的行。
另一段较早的录屏,展示了旧版面板设计中的脚本方式。
检查主机名是否真的在更新
无论你使用哪种方法,都要从三个角度进行验证。
在 pfSense 中,Services > Dynamic DNS 为每个条目显示一个 缓存的 IP—— 它应与 WAN 地址匹配。如果你使用的是方法 1,请确认该作业存在,并从 shell 手动运行一次:
crontab -l
fetch -o - "PASTE-YOUR-UPDATE-URL-HERE"第二条命令会打印服务器的回复。如果地址刚刚更改,它应以 good 开头;如果地址已经正确,则以 nochg 开头—— FastDDNS 可能会附加它记录的地址。 badauth 是唯一能明确定位问题的回复:用户名或更新密码错误。其他任何回复,或完全没有回复,都不能仅凭字面解释——请先查看实际返回的内容,然后检查系统日志。
从外部解析主机名并与您的公共地址进行比较:
nslookup myhome.fastddns.net最后,你的主机名面板会显示一个 最后更新 时间戳,从防火墙第一次报告开始就会发生变化。FastDDNS 在不到 60 秒的时间内应用新地址,尽管本地 DNS 缓存可能会稍微保留旧地址更长时间。
pfSense DDNS 故障排除
| 你看到的情况 | 原因 | 操作方法 |
|---|---|---|
回复是 badauth |
URL 中的用户名或更新密码错误 | 再次从面板复制 Update URL;如果你是从其他提供商迁移过来的,请参阅 替换 No-IP 或 DynDNS 服务器地址 的指南 |
| 保存后 Cached IP使用 | 客户端无法访问更新主机,或者粘贴时 URL 被截断 | 使用 保存并强制更新,然后查看 Status > System Logs > System > General;在条目中启用 Verbose Logging 可显示完整的交互过程 |
| 主机名解析为 IPv6 地址 | 更新主机通过 IPv6 访问,因此记录下来的就是该地址 | 在动态 DNS 条目上勾选 Force IPv4 DNS Resolution 并强制更新 |
| 尽管主机名正确,每次更新都记录为失败 | Result Match 被设置为固定字符串,回复在 good 和 nochg 之间交替 |
清除 Result Match 字段以关闭结果检查 |
| 方法 1 可用,但在重启或配置恢复后停止 | cron 作业位于 config.xml 之外,并且可以放在 RAM 磁盘上 |
改为设置方法 2,或通过 Cron 软件包添加该行 |
| 主机名解析正常,但你的端口上没有响应 | DDNS 工作正常;进入网络的路径不通 | 添加 NAT 和防火墙规则,然后从外部使用 端口检查 测试 |
| 主机名解析到的地址不是你的公网 IP | 防火墙位于另一层 NAT 之后,通常是 CGNAT | 将仪表板上的 WAN 地址与公共 IP 查询报告的地址进行比较;如果不同,请向你的 ISP 申请公共 IP |
| 一切正常工作,然后几个月后停止 | 免费主机名每年续期一次,临时主机名持续 30 天 | 从你的账户续期,或升级到 主机名不会过期的计划 |
保持更新 URL 的私密性
更新 URL 会以明文查询参数的形式携带你的 hostname、用户名和更新密码。它以这种方式存储在 pfSense 配置中,并且在方法 1 中存储在 crontab 中——任何能够读取配置备份的人都可以读取这些凭据。将 pfSense 配置导出文件视为密码文件,不要在论坛帖子或支持工单中粘贴未编辑的更新 URL。如果你已经这么做了,请更改账户中的更新密码并重新配置该条目。
常见问题
我应该使用动态 DNS 客户端还是 cron 脚本?
对于任何打算长期保留的配置,请在 Services > Dynamic DNS 下使用动态 DNS 客户端。pfSense 会将其存储在配置中,因此它属于备份的一部分,并会在重新安装后恢复。cron 脚本是执行首次更新的更快方式,但 pfSense 不会管理该任务,它可能在重启或恢复配置后丢失。
我需要为 DDNS 更新本身开放端口吗?
不需要。pfSense 会向 FastDDNS 建立出站 HTTPS 连接,因此更新不需要入站规则。你仍然需要 port forwarding 和防火墙规则,才能通过 hostname 访问你希望对外提供的服务,例如 RTSP 使用的 554 端口或摄像头的 Web 端口。
为什么面板要求强制使用 IPv4 解析?
因为 FastDDNS 会记录你的请求来源地址。如果 pfSense 将更新主机解析为 IPv6 地址并通过 IPv6 连接,FastDDNS 记录的就是该地址,这样你的 A record 最终会出错或为空。强制使用 IPv4 解析可确保更新使用与你要发布的地址相同的协议。
如果我的 ISP 使用 CGNAT,这还能正常工作吗?
不可以。在运营商级 NAT(Carrier-Grade NAT)后面,你的防火墙没有自己的公网 IP,因此 hostname 没有可用的地址可供指向,而且 ISP 会阻止入站连接。动态 DNS 解决的是地址变化问题,而不是没有地址的问题。请向 ISP 申请公网 IP,或使用能通过外发连接建立隧道的服务。
在边缘运行其他服务?相同的更新 URL 可用于任何能够发起定时 HTTPS 请求的环境,包括 MikroTik RouterOS 设置。





