IPFire 自带的 DNS 防火墙提供了广告、恶意软件、钓鱼、成人内容等官方 RPZ 分类,但原生界面目前不能直接添加第三方 RPZ 源。为了方便在 WebGUI 中管理 OISD 等自定义列表,结合社区的讨论,我制作了一个非官方扩展。
该扩展适用于 IPFire 2.29(x86_64)Core Update 203。它将自定义列表整合进现有 DNS 防火墙页面和官方更新流程,不需要额外运行一套定时更新程序。
主要功能
- 在 DNS 防火墙列表页增加“添加”按钮;
- 通过 HTTPS URL 添加自定义 RPZ 列表;
- 支持编辑名称、Zone、Primary、RPZ URL、说明、许可证和访问控制;
- 自定义列表可以像官方列表一样启用或停用;
- 自定义列表提供编辑和删除图标;
- 官方列表的元数据保持只读,访问控制仍可修改;
- 提供英文和简体中文界面,其他语言回退为英文;
- 自定义配置独立保存,不会被官方 dnsbl.json 更新覆盖;
- 提供安装和卸载脚本,并自动备份被替换的文件。
列表下载
该扩展自定义 HTTPS 源使用标准 HTTP 条件请求,记录服务器返回的 ETag,记录 Last-Modified,下次更新时发送 If-None-Match 和 If-Modified-Since。文件未变化时,服务器返回 304 Not Modified,不传输完整正文,只有内容确实变化时才重新下载和安装。
官方 IPFire RPZ 通过 AXFR/IXFR 同步。OISD 等只提供 HTTPS 文件、没有开放 AXFR/IXFR 的第三方源,则使用条件 HTTP 请求。这不是 DNS 层面的增量传输,但能够避免无变化时的重复完整下载。
列表更新
自定义列表更新任务整合到 IPFire 现有更新程序:
/usr/local/bin/update-rpzs
IPFire 的更新任务每小时在随机时间触发一次更新。每次执行时:
1. 通过 AXFR/IXFR 同步已启用的官方 RPZ;
2. 对已启用的自定义 HTTPS RPZ 发起条件请求;
3. 下载发生变化的列表;
4. 检查下载结果不是 HTML 错误页面;
5. 检查 RPZ 中存在 SOA 记录;
6. 验证成功后原子替换旧文件;
7. 所有更新完成后统一重新加载 DNS。
官方列表和自定义列表共用 /var/ipfire/dns/rpz-update.lock,避免并发写入。禁用的自定义列表不会执行在线检查或下载。
如果下载失败、服务器返回错误内容或 RPZ 验证失败,现有的有效规则文件会被保留,不会因为一次更新故障导致 DNS 防火墙规则丢失。
安装方法
通过添加社区存储库来安装。
建议在安装前备份系统配置。安装脚本自身也会备份即将修改的 CGI、更新程序、语言文件和现有自定义配置。
安装程序执行以下操作:
1. 检查 Core Update 版本和必要命令;
2. 检查 Perl CGI、语言维护脚本和 Bash 更新脚本的语法;
3. 创建带时间戳的安装前备份;
4. 保存可供卸载使用的原始官方文件;
5. 安装 WebGUI 和统一更新程序;
6. 安装英文、简体中文翻译并重建语言缓存;
7. 创建互斥锁并重新加载 DNS。
备份目录类似:
/root/dns-firewall-custom-lists-backup-20260812-083836/
安装完成后打开:
https://<IPFire地址>:444/cgi-bin/dnsbl.cgi
添加列表
以添加OISD列表 示例:
在服务 → DNS 防火墙中点击列表下方的添加,填写如下信息:
保存后,新列表默认启用并在后台进行首次下载。第一次下载完成前,现有 DNS 数据不会受到影响。
回到主列表后可以:
- 通过复选框启用或停用列表,然后点击“保存”;
- 点击铅笔图标编辑自定义列表;
- 点击铅笔图标右侧的垃圾桶图标删除自定义列表;
- 在编辑页面设置应用该分类的网络区域、主机或子网。
删除操作会清理自定义配置、RPZ 文件以及该源保存的 HTTP 缓存标识。官方列表不会显示删除图标。
手动更新
WebGUI 保存列表状态时会触发相应配置更新。需要手动执行完整 RPZ 同步时,可以运行:
/usr/local/bin/dnsctrl sync-rpzs
查看更新日志:
grep update-rpzs /var/log/messages
如果源文件没有变化,日志中应能看到与304 Not Modified 对应的未更新结果;此时不会重新下载整个 RPZ 文件。
检查测试
先从列表提供者的 RPZ 中选择一个确认存在的测试域名,再向 IPFire DNS 查询:
dig @127.0.0.1 test-domain.example A
启用相应列表并完成同步后,命中的域名通常会返回 NXDOMAIN。随后取消勾选该列表并点击“保存”,再次查询时应恢复正常解析。
同时应检查普通域名,避免把 DNS 服务本身的故障误认为列表拦截:
dig @127.0.0.1 ipfire.org A
主要文件
本扩展包含以下文件:
/srv/web/ipfire/cgi-bin/dnsbl.cgi /usr/local/bin/update-rpzs /var/ipfire/dns/custom_dnsbl.json /var/ipfire/dns/rpz-update.lock /var/ipfire/dns/custom-lists-original/
自定义列表配置保存在 /var/ipfire/dns/custom_dnsbl.json,与官方 /var/ipfire/dns/dnsbl.json分离,不会被官方列表元数据更新覆盖。
注意事项
- 当前只在 IPFire 2.29 Core Update 203 上验证;
- 这是非官方社区扩展,仅建议在充分备份后测试;
- 第三方列表的内容、服务可用性和许可证由列表提供者负责;
- IPFire Core Update 可能覆盖本扩展修改的文件,升级后需重新确认兼容性;
- 大型 RPZ 会占用一定内存和存储空间,即使条件请求减少了重复下载,也应关注设备资源;
这个扩展的目标不是替代 IPFire 官方 DNS 防火墙,而是在保留官方 RPZ、访问控制和更新入口的基础上,为有需要的用户增加第三方 HTTPS RPZ 管理能力。欢迎在 IPFire 社区反馈兼容性、测试结果和改进建议。
