
DNS 是什么?简单来说,它就是互联网的“电话簿”。当你在浏览器输入 www.baidu.com,你的设备会首先询问 DNS 服务器:“这个域名对应的 IP 地址是多少?”只有获得答案后,才能成功连接到百度。
但问题随之而来:每一次 DNS 查询,都会留下清晰的记录。无论是谷歌、Cloudflare,还是你的网络服务提供商,都知道你今天访问了哪些网站——即使你使用了浏览器的隐身模式。
那么,如果我们能够自己掌控这本“电话簿”呢?
答案是肯定的:利用一块树莓派,亲手搭建一个集成了 DNS 解析与广告拦截功能的私有堡垒。这正是我们今天要探讨的 开源实战 项目——Finite。
Finite:一个“开箱即用”的家庭网络隐私盾牌
Finite 并非一个全新的软件,而是一个高度集成的 NixOS 配置方案。它的核心目标极为清晰:
将 Pi-hole(广告拦截器)与 Unbound(本地 DNS 解析器)打包整合进树莓派,实现一键部署,为整个家庭网络提供保护。
你无需精通 Docker,不必手动配置 systemd 服务,也无需编写复杂的防火墙规则。只要能够插电、烧录 SD 卡,你就能获得一个完全私有、自动拦截广告、且绝不向任何第三方泄露 DNS 查询记录的家庭网络核心。
为什么选择 Pi-hole + Unbound 组合?
- Pi-hole:被誉为“网络级广告拦截神器”。它维护着一个庞大的广告与追踪域名黑名单,通过在 DNS 层面直接拒绝解析这些域名,使广告图片、追踪脚本等无法加载和执行。所有连接到网络的家庭设备(手机、电视、智能家居)都将自动享受无广告的清爽体验。
- Unbound:一个安全、高效的递归 DNS 解析器。它不依赖于 Google 或 Cloudflare 等公共 DNS,而是从根域名服务器开始,自行递归查询至目标 IP 地址,并支持 DNS-over-TLS 等加密方式,确保你的 DNS 查询过程不被窃听或篡改。
两者的结合,构建了三重防护:
- 对外:你的树莓派作为“普通 DNS 服务器”,默默解析合法域名请求。
- 对内:它是一道防火墙,将广告和追踪器域名拦截在外。
- 对 ISP 与大型科技公司:你的上网行为变成了一团迷雾——他们只知道你连接了家庭路由器,但对你访问的具体内容一无所知。
动手前的准备:硬件需求清单
不必被“技术”二字吓退,这套系统对硬件的要求非常亲民:
- 树莓派:3B+ 或更新的型号(推荐 4B,性能更稳定)
- 电源:5V 3A(不建议使用手机充电头,可能导致供电不足或不稳定)
- SD 卡:容量 8GB 以上(推荐 16GB,为日志文件预留空间)
- 网线:一根(Wi-Fi 也能工作,但有线连接在稳定性上更胜一筹)
💡 小贴士:一台树莓派 3B+ 的价格约在 200 元左右,而 4B 则在 400 元左右。用一杯咖啡的钱,换来全家的网络隐私与清爽体验,这无疑是一笔划算的投资。
NixOS?听起来很硬核?其实操作比泡面还简单
Finite 基于 NixOS —— 一个以“声明式配置”而闻名的 Linux 发行版。你或许会担忧:“我不是专业的运维工程师,能搞定吗?”
这正是 Finite 的设计哲学:让复杂性消失,只留下简单直接的步骤。
第一步:安装 Nix(非 NixOS 用户必看)
如果你使用的是 Windows、macOS 或 Ubuntu 等其他系统,也无需担心。Finite 提供了详细的安装指引。通常,只需一行命令即可完成 Nix 的安装:
sh <(curl -L https://nixos.org/nix/install) --daemon
安装完成后,你的系统便具备了 Nix 的强大构建能力,可以像搭乐高一样组合软件环境,且完全不会污染或影响原有的系统配置。
第二步:克隆 Finite 项目仓库
git clone https://github.com/wh1le/finite.git
cd finite
第三步:修改核心配置文件 settings.nix
这是整个过程中最具“技术感”的一步,但实际上你只需要填写几个关键的参数:
{
STATE_VERSION = "25.11"; # NixOS 版本,保持默认即可
SYSTEM = "aarch64-linux"; # 树莓派架构,保持默认即可
USERNAME = "pi-hole"; # 登录用户名
USER_PASSWORD = "hackme"; # 初始密码(务必在首次登录后修改!)
SSH_PORT = 1234; # SSH 端口,用于防范暴力破解
SSH_PUBLIC_KEY = "ssh-rsa AAAA..."; # 你的 SSH 公钥,实现免密登录
TIMEZONE = "Asia/Shanghai"; # 时区,请根据你的所在地修改
ROUTER_IP = "192.168.1.1"; # 你家路由器的 IP 地址
STATIC_IP = "192.168.1.100"; # 为树莓派分配的固定 IP 地址
UNBOUND_SUBNETS = [
"127.0.0.1/32 allow"
"192.168.1.0/24 allow" # 允许整个局域网使用此 DNS 服务
];
UNBOUND_PORT = "5335"; # Unbound 服务的监听端口
}
🌰 生活化类比:这个过程就好比为你的新家安装智能门锁——你只需要告诉系统“哪些设备可以进来”(UNBOUND_SUBNETS)和“新家的门牌号是多少”(STATIC_IP),剩下的繁琐工作全部交由系统自动完成。
一键构建:让 Nix 为你自动完成所有工作
在项目的根目录下,执行构建命令:
make build_image
或者,你也可以手动执行等价的 Nix 命令:
nix build .#nixosConfigurations.finite.config.system.build.sdImage
Nix 将会自动执行以下任务:
- 下载并集成 Pi-hole 6.2.1 和 Unbound 1.23.1
- 配置 Podman(一个轻量级容器引擎)来运行它们
- 设置防火墙规则、SSH 服务、静态 IP、时区等
- 最终打包生成一个完整的、可直接烧录的 SD 卡镜像文件
整个过程大约需要 10 到 30 分钟(取决于你的网络速度)。你可以趁此时间去泡杯茶,当你回来时,一个“开箱即用”的网络隐私堡垒已经准备就绪。
烧录与启动:见证成果的时刻
1. 找到你的 SD 卡设备名称
- Linux: 使用
lsblk -f 命令查看
- macOS: 使用
diskutil list 命令查看
假设你的 SD 卡在 Linux 中被识别为 /dev/sdb,在 macOS 中被识别为 /dev/disk2。
2. 将镜像写入 SD 卡
# Linux
sudo dd if=./result/sd-image/finite-sd-image.img of=/dev/sdb bs=4M status=progress conv=fsync
sync
# macOS
diskutil unmountDisk /dev/disk2
sudo dd if=./result/sd-image/finite-sd-image.img of=/dev/disk2 bs=4M status=progress conv=fsync
⚠️ 重要警告:of= 参数后面的设备名务必确认无误!一旦写错,可能导致你的硬盘数据被意外清空。
3. 启动与 SSH 登录
将烧录好的 SD 卡插入树莓派,接通电源启动(启动过程约需 1-2 分钟)。然后使用 SSH 连接你的树莓派:
ssh -p 1234 pi-hole@192.168.1.100
使用初始密码 hackme 登录后,第一件事就是修改密码:
passwd
首次配置:完成最后的三步设置
1. 设置 Pi-hole Web 管理界面的密码
sudo podman exec -it pi-hole pihole setpassword your_strong_password
2. 更新广告域名黑名单
sudo podman exec pi-hole pihole -g
该命令会从 StevenBlack、AdGuard 等多个上游源拉取最新的广告域名列表,通常包含 超过 100 万条 拦截规则。
3. 访问管理面板进行检视
在你的电脑浏览器中访问:
http://192.168.1.100/admin
输入你刚才设置的密码,你将进入 Pi-hole 功能强大的管理仪表盘,在这里你可以:
- 查看实时查询日志,了解网络中的域名请求情况。
- 查看拦截统计,看看每天有多少广告和追踪器被成功阻挡。
- 管理白名单/黑名单,手动添加需要放行或额外屏蔽的特定域名。
🎯 真实案例:家中的小米电视,原本开机需要等待 90 秒的广告。在部署 Pi-hole 后,开机广告由于域名无法解析,仅需 3 秒即可直接进入主界面。
让全家设备自动“享受保护”:配置路由器是关键
仅仅在树莓派上运行 Pi-hole 是不够的,必须让家庭网络中所有的设备都将树莓派作为其首选 DNS 服务器。
方法一:修改路由器的 DHCP 设置(推荐)
- 登录你家路由器的管理后台(通常是
192.168.1.1)。
- 找到 LAN 设置 -> DHCP 服务器 -> DNS 服务器 配置项。
- 将主 DNS 服务器地址修改为你的树莓派 IP(例如
192.168.1.100),次 DNS 服务器可以留空或设置为另一个备份地址。
保存设置后,所有通过 DHCP 新获得地址的设备都会自动使用 Pi-hole。对于已连接的设备,重启其网络连接(如关闭再打开 Wi-Fi)即可生效。
方法二:将 Pi-hole 设置为 DHCP 服务器(进阶)
如果你的 ISP 提供的路由器(如某些光猫)不允许修改 DNS 设置,可以采用此方案:
- 在路由器上关闭 DHCP 服务。
- 在 Pi-hole 的 Web 管理面板中,进入 Settings -> DHCP,启用 DHCP 服务器功能。
- 配置 DHCP 分配的 IP 地址范围(例如
192.168.1.100 到 192.168.1.200)。
⚠️ 注意:此方法需要一定的 网络/系统 知识,操作不当可能导致网络中断。对于新手用户,强烈建议优先使用方法一。
为什么 Finite 选择 NixOS?因为它实现了“配置即代码”
采用传统方式手动部署 Pi-hole + Unbound,你需要面对:
- 手动安装各项依赖
- 编写和调试 systemd 服务单元文件
- 配置复杂的防火墙规则
- 处理各种文件权限问题
- 担心系统升级后配置丢失或冲突
而 NixOS 的声明式配置从根本上解决了这些问题:
- 所有系统设置都集中在
settings.nix 等少数几个文件中,版本可控、环境可复现。
- 修改配置后,运行
nixos-rebuild switch,系统会自动、可靠地应用所有变更。
- 如果出现错误,
nixos-rebuild switch --rollback 可以让你一键回退到之前可用的状态。
- 想要分享给朋友?直接将你的配置文件发给他,他构建出的系统环境将与你的一模一样。
💬 开发者原话:“It’s fully declarative. All settings live in clean configuration files. Change one line, rebuild, and your setup updates instantly and predictably.”
这不正是运维工程师和开发者所追求的 “基础设施即代码” 的理想实践吗?
不止于广告拦截:Unbound 带来的隐私增强
许多人认为 Pi-hole 的主要作用就是去除广告。实际上,更深层次的隐私保护来自于 Unbound。
默认情况下,如果 Pi-hole 遇到不在其黑名单中的域名,它会将其转发给上游的公共 DNS(例如 Google 的 8.8.8.8)。这意味着:你访问的每一个非广告网站,其查询记录依然会被这些公共 DNS 服务商获取。
而 Finite 中的 Unbound 配置实现了以下增强:
- 递归解析:不依赖任何第三方 DNS,直接从根域名服务器开始进行完整的递归查询。
- DNSSEC 验证:对查询结果进行数字签名验证,确保返回的 IP 地址未被中间人篡改,有效防范 DNS 劫持和钓鱼攻击。
- DNS-over-TLS 支持:为整个递归查询链路提供端到端的加密。
最终的效果是:你的 DNS 查询链路,从一张谁都可以查看的“明信片”,变成了一个密封的“加密信封”。
常见问题与优化建议
Q1:部署这个系统会影响网速吗?
A:影响微乎其微。树莓派 4B 的性能足以轻松处理每秒上千次的 DNS 查询请求。在拥有 10 台设备同时在线的家庭环境中,DNS 查询延迟通常可以保持在 10 毫秒以内。
Q2:某些应用或网站出现异常怎么办?
A:这可能是 Pi-hole 的广告列表误拦截了某些合法域名。你可以在 Pi-hole 管理面板的“Query Log”中查找被拦截的最近请求,将确认为合法的域名添加到白名单即可。
Q3:如何定期更新广告黑名单?
A:定期在树莓派上执行 sudo podman exec pi-hole pihole -g 命令。你也可以设置一个 cron 定时任务,例如每周自动执行一次此命令来更新列表。
Q4:可以在家庭网络之外管理 Pi-hole 吗?
A:完全可以。你可以通过 Tailscale、ZeroTier 等虚拟组网工具,安全地将外部设备接入家庭网络,从而实现远程访问管理面板。请务必确保设置了高强度密码,并启用双因素认证(如果支持)。
结语:在数据的洪流中,筑起自己的堤坝
在这个“免费服务”背后往往隐藏着数据监控的时代,掌控自己的 DNS,是捍卫个人数字主权最基本、也是最有效的一步。
Finite 项目用不到 500 行的 Nix 配置代码,将复杂的网络隐私保护工程,简化成了一件“烧录即用”的简单事。它不炫耀技术,也不兜售课程,只是安静地守候在你的路由器旁,为你过滤掉那些试图窥探生活、侵扰体验的“数字噪声”。
“真正的自由,并非能够访问所有网站,而是能够选择不让谁知道你访问了什么。”
因此,不必再忍受无休止的广告轰炸和无处不在的隐私焦虑。是时候拿出那块闲置已久的树莓派,让它化身为守护你数字家园的第一道坚实防线。
毕竟,隐私与清爽的网络体验,不应是少数人的奢侈品——它理应成为每个现代家庭的标配。
欢迎在 云栈社区 的对应板块分享你的部署心得或提出遇到的问题。
附:相关资源链接